arthur2 писал(а):То есть, ты думаешь, что я ничего такого не проделал? Ни какой внятной интерпретации результатов этих действий я не вывел - иначе может быть бы и не спрашивал.
Об этом надо писать, понимаешь это? Один из популярных первых вопросов автору топику: «какие действия были проделаны». Не с проста это.
arthur2 писал(а): Но некая догадка всё-таки была: по адресу pArg оказывается не флот, а дабл.
Догадка???
Каким отладчиком ты пользовался (ты сам написал, что пользовался)?
Допустим, ты пользовался OllyDbg. Смотрим в OllyDbg как выглядит вызов функции sum, что кладётся в стек:
Что видно? Пару push-ов на каждый float-аргумент, и того 8 байт в стеке на один float-аргумент на один float-аргумент, несмотря на TDC.
Но OllyDbg — это для брутальных парней, которые пишут на ассемблере. Нежный хрупкий сишник выберет что-то вроде MSVC++.
Хорошо, ты используешь MSVC++. Ставим брекпоинт на вызов функции sum и смотрим дизассемблинг-листинг вызова этой функции:
Видим то же самое: для каждого float-аргумента пушится целых два dword-а. 8 байт вместо 4. Правда стековый фрейм не видно, потому что он ещё не сформирован.
Но тут ты можешь возразить: я не знаю этот чёртов ассемблер, я сишник, а смысл Си в том, чтобы писать один универсальный код под множество архитектур, не зная их ассемблера.
Хорошо, MSVC++ IDE, но не смотрим листинг дизасма, а смотрим стек:
Что видим? У нас был int-аргумент — в стеке он представлен одним dword-ом. У нас ещё было три float-аргумента, но в стеке целых шесть dword-ов. Причём видно, что три одинаковых блока по два dword-а. Значит на каждый аргумент сохраняется 8 байтов.
Но и тут ты можешь возразить: dword составляет 4 байта на машинах с двухбайтовым словом (x86), для поиска верхушки стека мы использовали регистр esp, который характерен для x86, да и вообще смотреть дамп стека — это слишком низкоуровневые вещи для нежного сишника.
Ладно, выкрутимся из ситуации не выходя за рамки языка Си (с его хитрыми кастованиями), применим упомянутые тобою Watch-и:
И что видим? Если трактовать аргументы, идущие вслед за
cnt, как float-ы, то видим непонятные числа. Но видим также и регулярную структуру: числа хоть и непонятные, но повторяются с периодом 2 элемента. На три одинаковых аргумента приходится 3 одинаковых пары непонятных чисел. А если трактурем аргументы, идущие вслед за
cnt как double-ы, то видим наше
77777.8888, с учётом потери точности FP-форматом.
Четыре разных способа проверить. О которых ты явно знаешь. Но заставляешь кого-то другого (например меня) делать это за тебя. Вот ещё вопрос: если ты говоришь, что пытался делать какую-то отладку, как ты смеешь говорить слово «догадка», когда есть 4 способа, показывающие, что это
факт?