вопрос по C++
Здравствуйте!
Подскажите, из-за чего это может быть? Вот кусок программы
fprintf(stderr,"test=%e\n",Hrho12[i]);
double tt=0.5*(mp12[i]+mm12[i])-0.5*a12[i]*(rhop12[i]-rhom12[i]);
Hrho12[i]=0.5*(mp12[i]+mm12[i])-0.5*a12[i]*(rhop12[i]-rhom12[i]);
fprintf(stderr,"test =%e\n",tt);
fprintf(stderr,"test =%e\n",Hrho12[i]);
выдает
test=0.000000e+00
test =nan
test =4.417657e+10
такое ощущение, что перед первым присваиванием элементы всех массивов
указывают неизвестно куда, а потом он "вспоминает" что так не надо.
все массивы опеределяются заранее следующим способом
double *mp12;
mp12=(double*)malloc(numcells*sizeof(double));
if(mp12==NULL)
{
fprintf(stderr,"Can't allocate memory\n");
exit(1);
}
Может надо по-другому массивы определять?
- Для комментирования войдите или зарегистрируйтесь
Это offtopic
А вы просто не инициализировали ничего.
Например, первая строка "test=0.000000e+00"
говорит о том, что где-то выше Hrho12[i]=0.0;
а вы этот код не привели.
Это какой-то жОсткий С. С++ он совсем не такой:
зачем malloc, зачем fprintf? Юзайте родное, плюсовое.
new, std::cout
зачем вы вообще выложили сюда куски кода?
Можно было на paste.org.ru положить весь код полностью,
который минимум компилируется, а сюда - только ссылку
ответ на ваш вопрос такой:
1) Если на С++, то конечно, юзайте std::vector
2) Если на С, то ждём от вас ссылку (например, http://paste.org.ru/?33oqss )
см также http://www.proklondike.com/contentview.php?content=30&print=1
проблема с С
Нет, Hrho12 нигде выше не использовался.
У меня malloc сам создает их нулевыми, я ничего не инициализирую.
Все так написано (malloc...) т.к. этот код изначально писался под C.
В общем считайте, что вопрос по С.
fprintf юзаю автоматически, т.к. в основном весь вывод - форматированный.
Весь код, к сожалению, выложить не могу, могу только файл где используется Hrho12 (только в этом файле), но скомпилить вы его не сможете.
Вот:
http://paste.org.ru/?j5umrm
проблема в строчках 261-265
Общая картина такая - если я скопирую куски кода объявления,вычисления Hrho12 в отдельный файл, скомпилю то все заработает без проблем. Проблемы появляются когда программа становится большой по объему. Как-будто компилятор что-то с массивами начинает делать - они создаются при старте (malloc'ом) а позже уже используются.
Я бы сказал, что вот эти строчки и их вывод сами по себе подозрительны (программа имеет один thread)
fprintf(stderr,"test=%e\n",Hrho12[i]);
double tt=0.5*(mp12[i]+mm12[i])-0.5*a12[i]*(rhop12[i]-rhom12[i]);
Hrho12[i]=0.5*(mp12[i]+mm12[i])-0.5*a12[i]*(rhop12[i]-rhom12[i]);
fprintf(stderr,"test =%e\n",tt);
fprintf(stderr,"test =%e\n",Hrho12[i]);
Gentoo... Gentoo...
Это плохо. Посоветую сделать что-то вроде такого макроса:
#define dcreate(x) \ x=(double*)malloc(numcells*sizeof(double)); \ if(x==NULL) { \ fprintf(stderr,msg_Cantallocatememory); \ exit(1); \ } \ memset ( x, 0, numcells*sizeof(double) );
и тогда много кода из void KTx3_init(void)
превратится в
(что может подтолкнуть на мысль о цикле)
а const char* const msg_Cantallocatememory = "Can't allocate memory\n";
сделайте где-нибудь выше один раз.
P.S. А переходите на плюсЫ, а? У плюсОв есть плЮсы.Особенно, когда программа становится большой по объему.