Свежие обсуждения
Компьютеры

Позвать функцию на Си

1 4

Есть дллька, в ней три функции , с двумя все нормально, а на третью (на мои попытки вписать ее в программу компилятор ругается.)
Выглядит она так: int HTCSensorGetDataOutput(HANDLE handle, SensorData& data);
Второй аргумент -структура.
Как должны выглядеть прототип и вызов?

 

Как именно он ругается? И какая программа - на С или С++?

 

chav1961: Как именно он ругается?
Например , так:
.. error #2001: Syntax error: expected ')' but found '&'.

..error #2140: Type error in argument 2 to 'HTCSensorGetDataOutput'; found 'struct SensorData *', expected 'int'.

chav1961: на С или С++?
А кто ее знает, я пишу на Си .
Если я правильно понимаю, я должен ей подсунуть адрес структуры?

 

Прототип:
int HTCSensorGetDataOutput(HANDLE handle, SensorData& data);

Вызов:
rezult=HTCSensorGetDataOutput(handle, &data);

 

..Pelles C Projects\Vmax\main.c(25): error #2095: Missing parameter type 'SensorData'.
..\Pelles C Projects\Vmax\main.c(25): warning #2099: Missing type specifier.
..\Pelles C Projects\Vmax\main.c(25): error #2001: Syntax error: expected ')' but found '&'.
..\Pelles C Projects\Vmax\main.c(149): error #2140: Type error in argument 2 to 'HTCSensorGetDataOutput'; found 'struct SensorData *', expected 'int'.
Стало хуже.
Ну, я примерно так и делал, только про возвращение забыл.

 

Если на чистом С - то в нем типа данных "ссылка" еще не было. Попробуйте вместо "&" использовать "*" - int HTCSensorGetDataOutput(HANDLE handle, struct SensorData *data); а вызов - как предложил GM.
Кстати говоря, такое ощущение, что структура у вас нигде не объявлена. Это так?

И еще два момента, где могут быть проблемы:

1. если DLL написана на С++, из С вы ее не вызовете, потому что в этом случае точка входа в библиотеке будет называться не HTCSensorGetDataOutput, а что-нибудь навроде ??@@HTCSensorGetDataOutput@Xyz##kkk (как точно, я не знаю - это просто пример с потолка), потому что в С++ используется механизм декорирования имен (хотя для DLL его стараются не применять).

2. Частенько для DLL вместо сишного соглашения о связях используется паскалевское, поскольку оно быстрее работает и экономнее по коду. Если при вызове точки входа программа будет рваться, попробуйте в прототип дописать CALLBACK - int CALLBACK HTCSensorGetDataOutput(HANDLE handle, struct SensorData *data);

 

chav1961: Кстати говоря, такое ощущение, что структура у вас нигде не объявлена. Это так?
Не, объявлена . Была кучно, локально. Сейчас , шаблон отдельно, мух.. объявление локально. Но результат тот же.

 

Вам компилятор прямо указывает, что вы не описали второй параметр, он ожидает интеджер, а не структуру. И мне не понятно, как у вас структура называется "SensorData&" или "SensorData"?

Попробуйте ещё так

Прототип:
int HTCSensorGetDataOutput(HANDLE handle, SensorData *);

 

GM: он ожидает интеджер, а не структуру.
&Data А это не интеджер?
GM: как у вас структура называется
Data , SensorData -шаблон.

Вообще хрень какая-то , если угомонить сенсордату, то начинает ругаться на хендл.

 

Alexey, выложите весь исходник программы. Такое ощущение, что не там ищем