static unsafe ushort FecDecoder(ushort arg)
{
ushort res, sft;
res = 0;
sft = arg;
for (int i = 0; i < 8; i++)
{
[COLOR="Red"]if (sft & 1)[/COLOR] //Cannot implicitly convert type 'int' to 'bool'
{
res ^= CMatrix;
}
sft >>= 1;
}
res ^= sft;
res = ucSyndromes[res];
if (res == 0xff)
{
arg = 0x8000;
}
else
{
[COLOR="Red"]arg = (arg ^ res) & 0x00ff;[/COLOR] //Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are you missing a cast?)
}
return arg;
}
C# две ошибки в программе.
Код:
Заранее благодарен
PS: Я переношу на c# код написаный на С. Наткнулся на ошибку и не знаю как решить ее :(
CMatrix - ushort[8]
ucSyndromes - byte[256]
Код:
[COLOR="Red"]if (sft & 1)[/COLOR] //Cannot implicitly convert type 'int' to 'bool'
=> if (sft % 2)
[COLOR="Red"]arg = (arg ^ res) & 0x00ff;[/COLOR] //Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are you missing a cast?)
=> arg = (ushort)...
=> if (sft % 2)
[COLOR="Red"]arg = (arg ^ res) & 0x00ff;[/COLOR] //Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are you missing a cast?)
=> arg = (ushort)...
Или я вас не понял или не работает. Ничего не изменилось, ошибки все те же :(
Цитата:
(sft & 1)
написать
Цитата:
((sft & 1) != 0)
и вместо
Цитата:
arg = (arg ^ res) & 0x00ff;
Цитата:
arg = (byte)(arg ^ res);
Цитата: bagie2
может вместо написать
и вместо
и вместо
Верно. И еще в блок unchecked заключить.
Код:
static ushort FecDecoder(ushort arg) {
unchecked {
ushort res = 0;
ushort sft = arg;
for (int i = 0; i < 8; i++) {
if ((sft & 1) != 0) {
res ^= CMatrix;
}
sft >>= 1;
}
res ^= sft;
res = ucSyndromes[res];
if (res == 0xff) {
arg = 0x8000;
} else {
arg = (byte)(arg ^ res);
}
return arg;
}
}
unchecked {
ushort res = 0;
ushort sft = arg;
for (int i = 0; i < 8; i++) {
if ((sft & 1) != 0) {
res ^= CMatrix;
}
sft >>= 1;
}
res ^= sft;
res = ucSyndromes[res];
if (res == 0xff) {
arg = 0x8000;
} else {
arg = (byte)(arg ^ res);
}
return arg;
}
}
Кстати, а причем тут unsafe?
а кстати почему у меня и без unchecked нет переполнения. тут просто отбрасывает ненужные биты. что-то типа типа movzx dx,al
Цитата: bagie2
а кстати почему у меня и без unchecked нет переполнения
В C# по умолчанию проверка переполнения отключена, но код таков, что при ее включении такие проверки могут поломать алгоритм.
Код:
unsigned short FecDecoder (unsigned short arg)
{
int i;
unsigned short res, sft;
res = 0;
sft = arg;
for (i = 0; i < 8; i++)
{
if (sft & 1)
{
res ^= CMatrix;
}
sft >>= 1;
} // end of for(i)
res ^= sft;
res = ucSyndromes[res];
if (res == 0xff)
{
arg = 0x8000;
}
else
{
arg = (arg ^ res) & 0x00ff;
}
return arg;
} // end of FecDecoder()
// end of file
{
int i;
unsigned short res, sft;
res = 0;
sft = arg;
for (i = 0; i < 8; i++)
{
if (sft & 1)
{
res ^= CMatrix;
}
sft >>= 1;
} // end of for(i)
res ^= sft;
res = ucSyndromes[res];
if (res == 0xff)
{
arg = 0x8000;
}
else
{
arg = (arg ^ res) & 0x00ff;
}
return arg;
} // end of FecDecoder()
// end of file
И не понимаю, что означает в условии (sft & 1). Кроме того, код на С, поэтму и решил unsafe.
И почему arg = (byte)(arg ^ res);?
спс за пояснение
Цитата:
не понимаю, что означает в условии (sft & 1)
проверка на четность
Цитата:
почему arg = (byte)(arg ^ res);
потому что :) это обнулит старшие биты
Благодарю, вроде заработало как надо.