русский
Germany.ruForen → Архив Досок→ Programmierung

нужна помощь с++

12.12.12 10:50
Re: нужна помощь с++
 
  Posmotrim посетитель
Posmotrim
Тогда исправляй ошибки. Вот парочку на вскидку:
1) Типичная ситуация в твоём коде Nr. 1
int lesenAuswertungspunkte (double *auswertungspunktex, double*auswertungspunktey)
{
//..
auswertungspunktex= new double [a];
auswertungspunktey= new double [a];
//..
}
int main(int argc, char* argv[])
{
double *Interpolationswertex =NULL;
double *Interpolationspunktey=NULL;

int laenge = lesenAuswertungspunkte (Interpolationspunktex, Interpolationspunktey);
...
}


Ты думаешь, что после вызова функции lesenAuswertungspunkte у тебя в Interpolationswertex и Interpolationspunktey указатели на память выделенную в lesenAuswertungspunkte . А вот и нет, у тебя там мусор, а вернее указатели не неинициализированную память и:
1) утечка памяти размером: 2 * sizeof(double) * a
2) undefined behavior при работе с Interpolationswertex и Interpolationspunktey после вызова lesenAuswertungspunkte. Частный случай undefined behavior - вылет программы.
Почему так происходит: читать о работе с паматью, о работе с указателями.
Как можно решить:

int lesenAuswertungspunkte (double **auswertungspunktex, double**auswertungspunktey)
{
//..
*auswertungspunktex= new double [a];
*auswertungspunktey= new double [a];
//..
}
int main(int argc, char* argv[])
{
double *Interpolationswertex =NULL;
double *Interpolationspunktey=NULL;

int laenge = lesenAuswertungspunkte (&Interpolationspunktex, &Interpolationspunktey);
...
}


2) Следующая типичная ситуация в твоём коде:

double* foo()
{
double tmp[100];
//...
return tmp;
}


Ты возвращаешь адресс на память в стэке, которая освободится после вызова функции. Как результат, тот же UB ввиде БаБаХа, при работе с результатом вызова этой функции.
Вариантов решения несколько: возвращать указатель на память в хипе(выделенную new), но тогда кто-то должен её освободить или писать в память заранее выделенную
3) Дальше

 double *array =new double[100];


sizeof(array) не равен 100, а равен размеру указателя на double.
Это то, что сразу бросается в глаза. Не поленись, и потрать день на теорию по работе с указателями/памятью.

 

Sprung zu