- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
#include <math.h>
#include <stdio.h>
double DoubleToTheInt(double base, int power) {
return pow(base, power);
}
int main() {
// приводим к указателю на функуцию с обратным порядком аргументов
double (*IntPowerOfDouble)(int, double) =
(double (*)(int, double))&DoubleToTheInt;
printf("(0.99)^100: %lf \n", DoubleToTheInt(0.99, 100));
printf("(0.99)^100: %lf \n", IntPowerOfDouble(100, 0.99));
}
и на арме похожая песня с d* регистрами.
протестировал - работает везде!
//fix
Но ведь стандарт не обещает, что при этом получится что-то разумное...
А с точки зрения стека - как 12 байт выделили, так и освободили, вообще пофиг
Даже если инт передадут через стек, один фиг будет дабл в регистре и инт на вершине стека.
В общем зависит от соглашения вызовов. Так как плавучка часто передаётся в своих регистрах, это будет работать в большинстве из них.
Позабытый компилятор Watcom C, например, кладёт инт в eax, но только если он следует первым аргументом. В данном примере он нормально принимает дабл (потому что он кладётся в сопроцессор), но теряет инт, потому что сигнатура IntPowerOfDouble(int, double) предписывает класть инт в eax, а DoubleToTheInt(double, int) предписывает класть инт в стек.
P.S. А нет, вру, дабл он кладёт в обычный стек. Он только инты пытается через регистры «соптимизировать».
Собственно почти весь код, который "у меня работает" работает только на х86, а подобные товарищи очень больно бьются о любую нестандартную платформу, где соглашения о вызовах другие или легаси компилятор у которого свои собственные соглашения.
> Microsoft therefore recommends against using C++ interfaces at module boundaries
> Instead of C++, Microsoft recommends using C or COM interfaces, which are designed to have a stable ABI between compiler releases
Эпично.
Мы ехали, ехали и наконец приехали.
Забавно как крестушня бьёт себя в грудь: «дак у нас же эксепшены, у нас шаблоны, у нас RAII, у нас STL».
А в итоге что? Используйте для модуля Сишные хедеры и структы.
То ABI сишное порекомендуют. То от сишного линкера багры в крестах.
В другие слова: выбор из углерода есть только психически здоровый выбор.
Они как коньяк, с годами всё больше греют душу.
(a) смотрящий за проблемами
(b) C++ изувер, что нельзя видеть, что он пишущий реально только C любым путём
(c) получена правопередача в CS класс делать так.
Чувствовать свободно, чтобы загримировать (d).
1. У функции соглашение вызова fastcall.
2. Регистр способен вместить дабл (что не выполняется на 32-битных машинах).
Вообще вариантов много:
https://en.wikipedia.org/wiki/X86_calling_conventions
И это только для x86. На других процессорах могут быть и другие варианты.
а не проще?
Сменить порядок аргументов нам никто не даст. А во-вторых, ничего не получится на платформах, где sizeof(int)≠sizeof(double):
http://ideone.com/otHyLL
У меня версия из статьи скомпилилась и работает. Как из ideone вытащить параметры платформы?
> Как из ideone вытащить параметры платформы?
Написать свою программку типа uname с пасьянсом и барышнями.
Догадываюсь что у тебя тоже есть серьёзные проблемы с "works for me" типами.
С одной стороны, обилие платформ напрягает, потому что приходится слишком много всего изучать. С другой стороны, изучение других платформ помогает избавиться от синдрома «works for me».
биты cpuid выведи например. гуглится cpuid хеловорлд довольно легко
Кому оно должно? Сегодня компилятор хранит флоаты в fpu, а завтра на каком-нибудь arm'е включат соглашение с soft float'ами и всё пойдёт через обычный стек...
http://ideone.com/j7oAdB
Выберите зелёную ссылку:
Чёрная Зелёная Красная Синяя
я не знаю чего я там ожидал. и почему говорят что это в С? во многих языках я уверен эта же бага будет (паскаль, ада, даже java в натив скомпилированая) потому что конвенция вызова схожа/одинаковая/основана на стандартной конвенции ABI (которая описывается структурами и типами С, но тем не менее абстракта).
http://govnokod.ru/14052#comment345102
Какое меткое слово.
повторять какую-то херню ad infinitum, которую ты очевидно сам не понимашь, это не аргументация.
http://govnokod.ru/14052#comment345108
#collapse_me
в некоторых местах просто уже надоедает пытаться понимать какого хера не работает.
из предыдущей дискусии - и как раз последних граблей - я сделал вывод что много граблей новых у меня происходят из-за использования size_t вместе int. последние грабли были с андерфлоу: инт спокойно уходил в негативые и все заканчивалось хорошо после проверки на верхний лимит. а вот с size_t там циклилось почти до бесконечности, и только потом с сегфолтом вылетало. что больше всего запутало это то что на бубунте почему-то работало, и слетало только на виндах с mingw.
Не знаю насчет "побочных эффектов", но есть опция -fsanitize=undefined
Для сравнения: у чисел есть и касты, и функции преобразования.
А для функций у нас только касты:
Не хватает генератора переходника, который будет переставлять аргументы в нужном порядке и, при необходимости, преобразовывать типы аргументов. Я джва года ждал такой компилятор!
Но без named тоже интересно, ибо для каждой функции можно насоздавать кучу синонимов: func1(x, y, z), func2(x, z, y), func3(y, x, z), func4(y, z, x), func5(z, x, y), func6(z, y, x). У нас даже говнокод был с такими перестановками.
Аргументировал, что так в порядке не запутаешься.
З.Ы. Проводим учения по прикладной некромантии.
Кстати, ты наверняка путаешь республику Алтай и алтайский край
Все путают
>, тянки в тиндере тоже оттуда есть
А вот если тебе понравится тян из Златохуйска в девяти часах лету от Москвы -- что будешь делать?
может, из горно-алтайска