2014-09-16 2 views
0

Это похоже на ошибку в реализации NLFFI SML/NJ. Функция СNLFFI: неправильные значения отправляются на аргументы функции C типа «short»

void f0 
    (short a0 
    , short a1 

и так далее

, short a7 
    ) { 
    printf ("a0 == %hx\n", a0); 
    printf ("a1 == %hx\n", a1); 

и так далее

printf ("a7 == %hx\n", a7); 
} 

компилировать его

GCC -shared -fPIC -m32 -o libdelme .so _.c

и установить. Призывании из С

f0 (0x7654, 0x3210, 0x9876, 0x5432, 0x1234, 0x5678, 0x9012, 0x3456); 

печатает правильные значения, и вызов от ML

F_f0.f' (0x7654, 0x3210, 0x9876, 0x5432, 0x1234, 0x5678, 0x9012, 0x3456); 

печатает этот

a0 == 7654 
a1 == 9876 
a2 == 1234 
a3 == 9012 
a4 == 0 
a5 == 1800 
a6 == 3cf0 
a7 == ee00 

Аналогичный эффект с signed char. Кажется, что в моей библиотеке C ожидаются аргументы, согласованные с 2^5-битным адресом, и NLFFI не выравнивает их.

Я столкнулся с этой ошибкой при создании привязки к XCB, поэтому я не могу изменить его заголовочные файлы, прототипы функций и т. Д. Все уже подготовлено в моем дистрибутиве Linux.

Возможно, это связано с тем, что я перекрестно скомпилировал, то есть скомпилировал код x86 на AMD64.

SML/NJ версия

$ pacman -Q smlnj 
smlnj 110.77-1 
+0

Не знал, что после переменного аргумента можно добавить дополнительные конкретные аргументы. Как это работает? – dhein

+0

@Zaibis: «...» означает «и так далее». Правильно, это сбивает с толку. :) – beroal

+0

ahhh right, теперь я получаю смысл вашего вопроса>. < – dhein

ответ

0

h спецификатора в строке формата printf говорит ожидать short int; однако вы лидируете short ints на int, что является излишним и ненужным, так как C продвигает shorts до int по умолчанию.

Удалить спецификацию h и отливки.

+1

Объявление аргумента по умолчанию в 'printf' в любом случае преобразует аргумент' short' в 'int'. – ouah

+0

@ouah Это произошло со мной через несколько минут после того, как я написал свой ответ. Вы абсолютно правы, поэтому я редактирую исправление. Благодаря! –

+0

0. Согласно Википедии, «h» ожидает, что 'int' продвигается от' short'. Без «h» он печатает некоторые цифры с 8 цифрами вместо 4. 1. Ваше предложение не исправляет ошибку. – beroal

0

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

Вы, вероятно, следует добавить в параметры компилятора GCC:

  • -Wmissing-prototypes
  • -Wstrict-prototypes
  • -Wold-style-definition
  • -Wold-style-declaration

Некоторые старые версии GCC могут не поддерживать Староновая аргументы стиля. Это может быть полезным уроком при первом добавлении этих опций.Тем не менее, он очень быстро становится второй натурой для создания кода, который соответствует. Убедитесь, что вы включили правильные заголовки; вы никогда не должны объявлять функцию extern в исходном файле (вы должны включить заголовок, который содержит официальную декларацию extern).

+0

Я использую правильный файл заголовка. Извините, ваши параметры компилятора не помогают. – beroal