mud compile - предупреждение: приведение от указателя к целому разного размера
Попытка скомпилировать MUD (онлайн-текстовую игру) на Ubuntu 14.04 LTS & gcc 4.4.7, и я продолжаю получать это:
vt100.c: в функции 'get_tactical_map':
vt100.c: 1741: предупреждение: приведение от указателя к целому числу другого размера
vt100.c: 1805: предупреждение: приведение от указателя к целому числу другого размера
Код в каждой из приведенных выше строк одинаков:
*pto++ = 'a' + ((int) fch % 25);
Я могу связать весь файл, если необходимо, но не уверен, куда его загрузить.
2 ответа
Я предполагаю, что вы пытаетесь скомпилировать 32-битный код, написанный кем-то, кто не знает или не заботится о проблемах переносимости языка C в 64-битной системе.
Проблема в том, что преобразование указателя в целое число, которое не может представлять его значение, является неопределенным поведением. См. C11 6.3.2.3 §6:
Любой тип указателя может быть преобразован в целочисленный тип. [...] Если результат не может быть представлен целочисленным типом, поведение не определено.
Переносимый код использовал бы приведение к uintptr_t
(или же size_t
в эпоху до C99) вместо int
,
По-видимому, адрес, удерживаемый указателем, используется в качестве источника случайности для получения произвольной строчной буквы (я думаю, что вряд ли Mints97 верен, и автор просто забыл разыменовать указатель, но без некоторого дополнительного кода, никто могу сказать точно).
Если вы игнорируете предупреждение, в принципе, код может фактически взорваться на архитектурах, которые генерируют сигналы при целочисленном переполнении. Наиболее вероятный случай - возможно безвредная ошибка (в зависимости от того, как используется результат): вместо строчной буквы вы можете получить специальный символ или заглавную букву, если (int)fch
бывает отрицательным.
Я не могу сказать больше без объявления переменных, но эта ошибка обычно возникает, когда вы приводите переменную-указатель к типу без указателя (например, void *
в int
). В вашем коде проблема скорее всего в (int) fch
: fch - указатель, и вы пытаетесь преобразовать его в int
, Если вы хотите извлечь значение, которое fch
указывает на, попробуйте использовать (int) *fch
например,
*pto++ = 'a' + ((int)*fch % 25);