Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
#include <intrin.h>
#include <stdarg.h>
#include <stdio.h>
int func()
{
va_list vl;
int i;
int arg,Z=1;
va_start(vl,*(int *)_AddressOfReturnAddress());
for(i=0;i<5;i++)
{
arg=va_arg(vl,int);
Z=arg*Z;
}
return(Z);
}
int main(void)
{
printf("%d",func(1,2,3,4,5));
getchar();
return 0;
}
гуру-вычисление факториала пяти одного красавчика с форума wasm.ru... был выведен, как пример функции с переменным числом параметров без единого явного параметра... грязный хак с адресом возврата на стеке - моя идея)))
да... согласен, что непереносимо... интрин есть в msvc (частично в mingw-w64), для других компиляторов можно асмом решить проблему отсутствия _AddressOfReturnAddress... остальное должно быть переносимо по идее...
не знаю, в чем проблема, у меня копипаст собирается без единого ворнинга и работает, как надо (msvc 2010)... покажите командную строку, которой собираете...
вообще вместо ва_старта можно использовать что-то типа:
#define va_start1(ap, v) (ap = (va_list)(v) + sizeof(void*))
если вам хочется под gcc собрать))
function mul(a: array of integer);
var i: integer;
begin
result := 1;
for i := Low(a) to High(a) do Result := Result * a[i];
end;
begin
WriteLn(mul([1, 2, 3, 4, 5]));
end.
я не знаю паскаля, но со стороны это выглядит, как передача массива в параметры... в си++ (где массив в принципе не является стандартным типом языка) можно например создать экземпляр класса массив (из какой-нить библиотеки или самописного) и передать этот экземпляр по указателю, по ссылке или с вызовом конструктора-копирования... это не тоже самое, что переменное число параметров функции, согласитесь... тем более, что при переменном числе параметров - эти самые параметры могут быть разного типа...
В стек запихивается массив, в eax пишется адрес массива, (в данном случае пишется указатель на кусок стека, но если так передать динмассив или явно заданный в блоке констант массив, то будет по другому), а в edx пишется длина массива минус 1.
function mul(a: array of integer);
var i: integer;
begin
result := 1;
for i := Low(a) to High(a) do Result := Result * a[i];
end;
begin
WriteLn(mul([1, 2, 3, 4, 5]));
end.
//----------------------------------------------
Неа. Так нельзя в D7.
Зато можно так:
function mul(a: array of const);
var i: integer;
begin
result := 1;
for i := Low(a) to High(a) do Result := Result * a[i];
end;
begin
WriteLn(mul([1, "Дельфи говно", 3, "Потому что здесь можно передавать только переменное число констант, а переменные передать нельзя", 5]));
end.
#define va_start1(ap, v) (ap = (va_list)(v) + sizeof(void*))
если вам хочется под gcc собрать))
Это не круто.
Надо чтобы цикл обрывался, как только очередной параметр становится единицей.
а ведь личинка varargs есть:
The varargs directive works only with external routines and only with the cdecl calling convention.
В стек запихивается массив, в eax пишется адрес массива, (в данном случае пишется указатель на кусок стека, но если так передать динмассив или явно заданный в блоке констант массив, то будет по другому), а в edx пишется длина массива минус 1.
Заминусуйте меня. Я не прав. Мне стыдно.
//----------------------------------------------
Неа. Так нельзя в D7.
Зато можно так:
лол чё.
Тебе скрин показать?
А, я забыл написать function(a: array of integer): integer;
звучит как название модной болезни