Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Функции с неограниченным числом аргументов

8.1K
07 марта 2007 года
Нео
48 / / 30.07.2006
Вот есть 2 функции

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, проблем не было. Кто-нибудь может объяснить, в чем проблема и как ее обойти?
309
08 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Не пойму, в чем дело. Значение p увеличилось на 8, вроде все правильно. С другой функцией, где передавал int, а не double, проблем не было. Кто-нибудь может объяснить, в чем проблема и как ее обойти?


Дело в том, что функции с переменным числом аргументов, для доступа к "неизвестным" данным требуют использования особых макросов
va_list, va_start, va_arg и va_end
По крайней мере, ЭТИ команды правильно выполняют доступ к памяти.

Хотя использование "..." является типонебезопасным действием, в результате чего программа может начать "перемалывать" стек и читать оттуда всё, что угодно.

Лучше использовать макросы типа ARRAYOFCONST для формирования временных массивов значений вариантного типа.

1
10 марта 2007 года
kot_
7.3K / / 20.01.2000
Проще говоря - использование ф-ций с переменным числом параметров - это как раз то, что может придумать программист, что бы осложнить себе жизнь. Используйте для этих целей два параметра - указатель на массив и размерность передаваемого массива.
252
12 марта 2007 года
koderAlex
1.4K / / 07.09.2005
лучше указатель на первый элемент односвязного списка .
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог