Сейчас на форуме: subword, rtsgreg1989 (+9 невидимых)

 eXeL@B —› Основной форум —› Остаток от деления Double чисел для Managed C++ (/clr)
Посл.ответ Сообщение

Ранг: 11.6 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 15 августа 2008 12:36
· Личное сообщение · #1

Есть сторонняя dll сборка, созданная на Managed C++ (/clr).
При изучении одного из ее методов рефлектором получается такой исходный код;

для C++/CLI:

public:
Void set( Double da )
{
.....
Set_da( ( da % 360.0 ) * 10.0 );
.....
}


и, соответственно, для IL:


.method public hidebysig specialname instance void set(float64 da) cil managed
{
.....

L_002d: ldarg.1
L_002e: ldc.r8 360
L_0037: rem

L_0038: ldc.r8 10
L_0041: mul
.....
}


Для C# допустимо использование оператора % для вычисления остатка от деления двух Double чисел.
Но при попытке использования этого же оператора в Managed С++ для Double значений происходит
ошибка при компиляции:
— error C2296: '%' : illegal, left operand has type 'double'
— error C2297: '%' : illegal, right operand has type 'double'

Как этот фрагмент выглядел в исходнике на Managed C++ ?



Ранг: 284.8 (наставник), 6thx
Активность: 0.150
Статус: Участник

Создано: 15 августа 2008 13:44
· Личное сообщение · #2

видимо тот код что ты выдрал из .net сборки, там имелся ввиду класс Double а не тип. к нему можно применять такие действия.

ИМХО попробуй сделать приведение типов.



Ранг: 11.6 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 15 августа 2008 14:10
· Личное сообщение · #3

В VS2008 создаю C++ проект, включаю ему опцию /clr и в теле любого метода пишу:


System::Double x = 2.2;
System::Double y = 1.1;
System::Double d = x % y;


При компиляции в третьей строке получаю вышеуказанную ошибку.

Что и к чему вы предлагаете здесь привести?



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 15 августа 2008 14:23
· Личное сообщение · #4

То ли я не знаю последних веяний С++, то ли код долже быть типа такого:

z = (double)x % (double)y;

Или что там вместо дабла - float, real?..

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 11.6 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 15 августа 2008 14:34
· Личное сообщение · #5

Приведение Double к "чему то там" для данного случая не помогает ...



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 15 августа 2008 18:59
· Личное сообщение · #6

Давно не программирую, но вот что говорит хэлп:


% (modulus operator) returns the remainder of integer division and cannot be used with floating points.


Соотв.,
z = (int)x % (int)y;

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 августа 2008 19:28 · Поправил: s0larian
· Личное сообщение · #7

ion, % это только для целых чисел. Для floating point вызывай fmod()



Ранг: 145.8 (ветеран)
Активность: 0.070
Статус: Участник
www.int3.net

Создано: 15 августа 2008 21:09
· Личное сообщение · #8

воткни реализацию op_% из шарпа и радуйся. ты просто не тот же самый метод вызываешь.


 eXeL@B —› Основной форум —› Остаток от деления Double чисел для Managed C++ (/clr)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати