Я компилирую C++ DLL из достаточно хорошо проверенной библиотеки (zeromq) и использую ее в своих собственных привязках Delphi. В настоящее время я сталкиваюсь с неожиданным поведением кода C++, и у меня нет опыта для его хорошей отладки. Основная ответственность за ошибку, вероятно, лежит на моем коде Delphi, но мне нужно лучше понимать C++, чтобы понять, что я сделал не так.
Проблемный код выглядит следующим образом (упрощенно)
Проблемный код выглядит следующим образом (упрощенно)
p>
if (*mySize_tObject == sizeof (uint64_t)) {
return 0;//We never reach this code.
}
*mySize_tObject передается как size_t. В моих привязках Delphi это Cardinal со значением 8.
Я попробовал поиграться с выводами C++, чтобы сузить то, что может произойти, и получил эти результаты:
return *mySize_tObject;//8
return sizeof (uint64_t);//8
return *mySize_tObject + sizeof (uint64_t);//16
if (*mySize_tObject == sizeof(uint64_t)) {
return 1;
}
else if (*mySize_tObject < sizeof(uint64_t)) {
return 2;
}
else if (*mySize_tObject > sizeof(uint64_t)) {
return 3;//This is the value that returns
}
else {
return 0;
}
По сути, я возвращаюсь к 8>8. Поскольку я знаю, что это неправда (нужна ссылка), мне остается думать, что одно из этих значений тайно является числом с плавающей запятой, например 8,000001, и я вижу только усеченные результаты.
Я также рассмотрю советы по отладке .dll, если это не имеет никакого смысла для людей, знающих C++.
Думаю, стоит также отметить, что ранее у меня был Привязки Delphi работают в 32-битной версии, и я начал сталкиваться с этими трудностями при преобразовании в 64-битную версию (я также изменил настройки компиляции DLL, чтобы они соответствовали).
Приношу извинения за то, что не смог создать минимальную воспроизводимую версию. пример, но я постараюсь дать как можно больше подробностей о своих вызовах здесь:
Привязка Delphi:
TMyBinding = function(var mySize_tObject : size_t): Integer; cdecl;
Передаваемое значение создается как SizeOf( result ), причем result представляет собой Int64.
*Примечание: size_t определяется в другом месте кода Delphi как кардинал.
Заголовок этой функции в C++:
int myFunct(size_t *mySize_tObject ) const;
Подробнее здесь: https://stackoverflow.com/questions/784 ... ed-results
Size_t == sizeof (uint64_t) не возвращает ожидаемые результаты [закрыто] ⇐ C++
Программы на C++. Форум разработчиков
1715970726
Anonymous
Я компилирую C++ DLL из достаточно хорошо проверенной библиотеки (zeromq) и использую ее в своих собственных привязках Delphi. В настоящее время я сталкиваюсь с неожиданным поведением кода C++, и у меня нет опыта для его хорошей отладки. Основная ответственность за ошибку, вероятно, лежит на моем коде Delphi, но мне нужно лучше понимать C++, чтобы понять, что я сделал не так.
Проблемный код выглядит следующим образом (упрощенно)
Проблемный код выглядит следующим образом (упрощенно)
p>
if (*mySize_tObject == sizeof (uint64_t)) {
return 0;//We never reach this code.
}
*mySize_tObject передается как size_t. В моих привязках Delphi это Cardinal со значением 8.
Я попробовал поиграться с выводами C++, чтобы сузить то, что может произойти, и получил эти результаты:
return *mySize_tObject;//8
return sizeof (uint64_t);//8
return *mySize_tObject + sizeof (uint64_t);//16
if (*mySize_tObject == sizeof(uint64_t)) {
return 1;
}
else if (*mySize_tObject < sizeof(uint64_t)) {
return 2;
}
else if (*mySize_tObject > sizeof(uint64_t)) {
return 3;//This is the value that returns
}
else {
return 0;
}
По сути, я возвращаюсь к 8>8. Поскольку я знаю, что это неправда (нужна ссылка), мне остается думать, что одно из этих значений тайно является числом с плавающей запятой, например 8,000001, и я вижу только усеченные результаты.
Я также рассмотрю советы по отладке .dll, если это не имеет никакого смысла для людей, знающих C++.
Думаю, стоит также отметить, что ранее у меня был Привязки Delphi работают в 32-битной версии, и я начал сталкиваться с этими трудностями при преобразовании в 64-битную версию (я также изменил настройки компиляции DLL, чтобы они соответствовали).
Приношу извинения за то, что не смог создать минимальную воспроизводимую версию. пример, но я постараюсь дать как можно больше подробностей о своих вызовах здесь:
Привязка Delphi:
TMyBinding = function(var mySize_tObject : size_t): Integer; cdecl;
Передаваемое значение создается как SizeOf( result ), причем result представляет собой Int64.
*Примечание: size_t определяется в другом месте кода Delphi как кардинал.
Заголовок этой функции в C++:
int myFunct(size_t *mySize_tObject ) const;
Подробнее здесь: [url]https://stackoverflow.com/questions/78496863/size-t-sizeof-uint64-t-not-returning-expected-results[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия