2013-08-21 2 views
1
unsigned long uds_calc_key(unsigned long seed) 
{ 
    unsigned long temp; 
    unsigned short int index; 
    unsigned short int mult1; 
    unsigned short int mult2; 

    if(seed == 0) 
    { 
     seed = NC_DEFAULT_SEED; 
    } 
    else 
    {} 

    for (index=0x5D39, temp=0x80000000; temp; temp>>=1) 
    { 
     if (temp & seed) 
     { 
      index = croshortright(index, 1); 
      if (temp & NC_UDS_KEYMASK) 
      { 
       index ^= 0x74c9; 
      } 
     } 
    } 

    mult1 = (nc_uds_keymul[(index>>2) & ((1<<5)-1)]^index); 
    mult2 = (nc_uds_keymul[(index>>8) & ((1<<5)-1)]^index); 
    temp = (((unsigned long)mult1)<<16)|((unsigned long)mult2); 
    temp = mulu32(seed,temp); 
    return temp; 
} 

Я не понимаю, как преобразовать это временное значение в оператор for. я определяю значение Темп как uint, и я получил сообщение об ошибке, как:C++ to C# for statement

Cannot implicitly convert type 'uint' to 'bool'; 

Я понимаю, тот факт, что в C++ ноль является false, и ничего не ноль true. Но здесь это не применяется, насколько я вижу. Не могли бы вы рассказать мне об этом?

+0

Когда вы сообщаете об ошибке, вы должны ** указать, в какой строке произошла ошибка. – abelenky

ответ

5

Попытка

for (index=0x5D39, temp=0x80000000; temp != 0; temp>>=1) 

и

if ((temp & seed) != 0) 

и

if ((temp & NC_UDS_KEYMASK) != 0) 

Два если проверка, если переменная temp имеет флаг (seed или NC_UDS_KEYMASK).

0

Я считаю, что ошибка здесь:

if (temp & seed) 

temp не типа boolean

Вы должны либо изменить выражение if (temp != 0) или создать еще одну переменную типа bool:

Например, bool isTemp;

И ch eck, что в условном.

if (isTemp) { } 
+1

ошибка также находится в самом цикле 'for', используя' temp' в качестве условия. Замените «temp! = 0». Нет необходимости создавать логическую переменную. – Rotem

+1

Проблема не в том, что 'temp' не является' boolean', проблема в том, что 'temp & seed' не является' boolean'. [Этот ответ] (http://stackoverflow.com/a/18357686/1711796) имеет правильную идею. – Dukeling

+0

@ Dukeling - вы можете использовать '&' в качестве логического оператора, это будет просто короткозамкнутый. –

7

В C++ целые числа могут использоваться в операциях if. В C# вы можете использовать выражения, которые вычисляются до bool. Ваше выражение temp & seed не вычисляет логическое значение. Вы должны изменить условие в C# для:

if(0 != (temp & seed)) {} 
3

C# ничего не преобразуется в bool неявно. Создайте bool самостоятельно: myInt != 0.

C# делает это таким образом, чтобы избежать ошибок общего кодирования за счет того, чтобы быть немного более подробным.