Функции с неограниченным числом аргументов
void PerceptronNet::Connect(double r0,...)
{
unsigned int i;
double *p=&r0;
for(i=0;i<Content.size()-1;i++)
{
NeuroV::ConnectLayers(Content,Content[i+1],*p);
p++;
}
AddIn();
AddOut();
}
void PerceptronNet::Create(unsigned int nLayers,int n0,...)
{
unsigned int i;
int *p=&n0;
PerceptronLayer *pl;
for(i=0;i<nLayers;i++)
{
pl=new PerceptronLayer(*p);
p++;
PushContent(pl);
}
}
далее в main():
//.....
PerceptronNet net;
net.Create(3,2,3,1);
net.Connect(-1,-1);
//.....
Функция Create работает нормально, а вот с Connect проблемы. При i=0 *p=-1, как и следовало бы. А вот при i=1 уже фигня:
*p=5.1101287501499560e-096
Не пойму, в чем дело. Значение p увеличилось на 8, вроде все правильно. С другой функцией, где передавал int, а не double, проблем не было. Кто-нибудь может объяснить, в чем проблема и как ее обойти?
Цитата:
Не пойму, в чем дело. Значение p увеличилось на 8, вроде все правильно. С другой функцией, где передавал int, а не double, проблем не было. Кто-нибудь может объяснить, в чем проблема и как ее обойти?
Дело в том, что функции с переменным числом аргументов, для доступа к "неизвестным" данным требуют использования особых макросов
va_list, va_start, va_arg и va_end
По крайней мере, ЭТИ команды правильно выполняют доступ к памяти.
Хотя использование "..." является типонебезопасным действием, в результате чего программа может начать "перемалывать" стек и читать оттуда всё, что угодно.
Лучше использовать макросы типа ARRAYOFCONST для формирования временных массивов значений вариантного типа.
Проще говоря - использование ф-ций с переменным числом параметров - это как раз то, что может придумать программист, что бы осложнить себе жизнь. Используйте для этих целей два параметра - указатель на массив и размерность передаваемого массива.
лучше указатель на первый элемент односвязного списка .