вопрос по 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

Semyon написал(а):
такое ощущение, что ...

А вы просто не инициализировали ничего.
Например, первая строка "test=0.000000e+00"
говорит о том, что где-то выше Hrho12[i]=0.0;
а вы этот код не привели.

Это какой-то жОсткий С. С++ он совсем не такой:
зачем malloc, зачем fprintf? Юзайте родное, плюсовое.
new, std::cout

зачем вы вообще выложили сюда куски кода?
Можно было на paste.org.ru положить весь код полностью,
который минимум компилируется, а сюда - только ссылку

Semyon написал(а):
Может надо по-другому массивы определять?

ответ на ваш вопрос такой:
1) Если на С++, то конечно, юзайте std::vector
2) Если на С, то ждём от вас ссылку (например, http://paste.org.ru/?33oqss )
см также http://www.proklondike.com/contentview.php?content=30&print=1

проблема с С

ndrwsh написал(а):
Semyon написал(а):
такое ощущение, что ...

А вы просто не инициализировали ничего.
Например, первая строка "test=0.000000e+00"
говорит о том, что где-то выше Hrho12[i]=0.0;
а вы этот код не привели.

Нет, Hrho12 нигде выше не использовался.
У меня malloc сам создает их нулевыми, я ничего не инициализирую.

ndrwsh написал(а):
Это какой-то жОсткий С. С++ он совсем не такой:
зачем malloc, зачем fprintf? Юзайте родное, плюсовое.
new, std::cout

зачем вы вообще выложили сюда куски кода?
Можно было на paste.org.ru положить весь код полностью,
который минимум компилируется, а сюда - только ссылку

Semyon написал(а):
Может надо по-другому массивы определять?

ответ на ваш вопрос такой:
1) Если на С++, то конечно, юзайте std::vector
2) Если на С, то ждём от вас ссылку (например, http://paste.org.ru/?33oqss )
см также http://www.proklondike.com/contentview.php?content=30&print=1

Все так написано (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...

Semyon написал(а):
я ничего не инициализирую.

Это плохо. Посоветую сделать что-то вроде такого макроса:

#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)
превратится в

dcreate(rho1);
dcreate(rhoc1);
dcreate(m1);
dcreate(ee);
...

(что может подтолкнуть на мысль о цикле)
а const char* const msg_Cantallocatememory = "Can't allocate memory\n";
сделайте где-нибудь выше один раз.

Semyon написал(а):
У меня malloc сам создает их нулевыми

man malloc написал(а):
calloc() allocates memory ... The memory is set to zero.
malloc() allocates size bytes ... The memory is not cleared.

P.S. А переходите на плюсЫ, а? У плюсОв есть плЮсы.Особенно, когда программа становится большой по объему.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".