Как я могу преобразовать этот код из C в C ++? - PullRequest
0 голосов
/ 12 мая 2019

Я работаю над встроенным проектом, используя mbed.Производитель чипа определяет Циклический тест на избыточность с использованием этого поискового генератора, но он написан на C. Код генератора просмотра

    ///////////////////////configures CRC check lookup table////////////////////////
short pec15Table[256];
short CRC15_POLY = 0x4599;   //CRC code

void configCRC(void) 
{
    for (int i = 0; i < 256; i++)
    {
        remainder = i << 7;
        for (int bit = 8; bit > 0; --bit)
        {
            if (remainder & 0x4000)
            {
                remainder = ((remainder << 1));
                remainder = (remainder ^ CRC15_POLY)
            }
            else
            {
                remainder = ((remainder << 1));
            }
        }
    }
    pec15Table[i] = remainder&0xFFFF;
};

Я пока не очень хорошо разбираюсь в C ++, поэтому я просто скопировали вставил его и проверил на наличие ошибок синтаксиса.Например, я переключил объявления int16 с коротким и без знака коротким.Но, когда я компилирую, это дает мне следующую ошибку.Что не имеет смысла для меня.Я уверен, что я делаю что-то не так.

Error: Cannot determine which instance of overloaded function "remainder"  is intended in "config.cpp", Line: 20, Col: 10

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Очевидно, что у вас есть столкновение пространства имен с std::remainder. Это одна из многих причин избегать глобальных переменных. В противном случае C и C ++ должны быть идентичны.

Примечательно, что этот код написан очень наивно. Мало того, что функция должна быть переписана для правильного получения параметров, но и использование типов повсюду.

Вы никогда не должны делать побитовую арифметику на подписанных типах, потому что это открывает много плохо определенных ошибок в поведении. Все типы «небрежной типизации», такие как short и int, должны быть заменены типами из stdint.h. Вы должны использовать только неподписанные типы. Вы должны знать о неявном целочисленном продвижении.

0 голосов
/ 13 мая 2019

Просто переименуйте остаток переменной во fremainder (или другое имя по вашему желанию) и увидите магию в компиляции.

Подобные проблемы возникают из-за несоблюдения каких-либо стандартных соглашений при именовании переменных.

Проверьте эту ссылку , чтобы узнать, почему требуется переименование переменной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...