problem z deklaracją pamięci

0

Witam. Piszę funkcję programu która ma za zadanie wczytać plik. Potrzebne mi do tego dynamicznej deklaracji tablic (wycinek kodu poniżej). Problem jest w tym iż za cholere nie wiem dlaczego przy deklarowaniu drugiej tablicy wyskakuje błąd :

Windows has triggered a breakpoint in skaterometr.exe.

This may be due to a corruption of the heap, which indicates a bug in skaterometr.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while skaterometr.exe has focus.

The output window may have more diagnostic information.

Dam 5+ temu kto to pomoże mi z tym problemem..

Dodam jeszcze że jak kontynuuje wykonywanie prgramu mimo błedu to dalej w tej funkcji deklaruje trzecią tablice gdzie błąd nie występuje , następnie deklaruje tablice trójwymiarową i bład równiez nie wystepuje... pojawia sie on tylko w tym jednym
miejscu.. bardzo proszę o pomoc.

 n=0; 
	 for( x=0 ; x<=2 ; x++)
		{
		tabpom[x]=0;
		}
	  meas->wart_AngleOfIncidence = (int*)malloc(meas->AngleOfIncidence * sizeof *meas->wart_AngleOfIncidence);
	  do {                                       // wartosci  angle of incidence 
	  c = getc (plik1);
      if (c == '0'|| c=='1' || c=='2' ||c=='3' || c=='4' || c=='5' || c=='6' || c=='7' || c=='8' || c== '9' && n<=2)
	  {
	  n++;
	  if(n==1) tabpom[0]=c;
      if(n==2) tabpom[1]=c;
	  }
	  if (c==9 || c=='\n' && n != 0)
	  {
		i++;
		n=0;
		pomocnicza=atoi(tabpom);
		meas->wart_AngleOfIncidence[i]=pomocnicza ;
		printf("%d  ", meas->wart_AngleOfIncidence[i]);
		 for( x=0 ; x<=2 ; x++)
		{
		tabpom[x]=0;
		}
	  } 
        } while (c != '\n');



	   for( x=0 ; x<=2 ; x++)
		{
		tabpom[x]=0;
		}
	  printf("\n");
	  do {                                                    // ScatterAzimuth
	  c = getc (plik1);
      if (c == '0'|| c=='1' || c=='2' ||c=='3' || c=='4' || c=='5' || c=='6' || c=='7' || c=='8' || c== '9'  ) 
	  {
	  n++;
	  if(n==1) tabpom[0]=c;
      if(n==2) tabpom[1]=c;
      if(n==3) tabpom[2]=c;
	  }
        } while (c != '\n');
	  meas->ScatterAzimuth = atoi(tabpom);
	  printf("\nScatterAzimuth - %d\n", meas->ScatterAzimuth );

	     meas->wart_ScatterAzimuth = calloc(meas->ScatterAzimuth , sizeof(int));  // TUTAJ BŁĄD !!!!! :(
	  	
	   n=0; 
	   pomocnicza=0 ;
	   i=0;
	     for( x=0 ; x<=2 ; x++)
		{
		tabpom[x]=0;
		}
	   i=0;
	  do {                                       // wart_ScatterAzimuth 
	  c = getc (plik1);
      if (c == '0'|| c=='1' || c=='2' ||c=='3' || c=='4' || c=='5' || c=='6' || c=='7' || c=='8' || c== '9' && n<=2)
	  {
	  n++;
	  if(n==1) tabpom[0]=c;
      if(n==2) tabpom[1]=c;
	  if(n==3) tabpom[2]=c;
	  }
	  if (c==9 || c=='\n' && n != 0)
	  {
		
		n=0;
		pomocnicza=atoi(tabpom);
		meas->wart_ScatterAzimuth[i]=pomocnicza ;
		i++;
		if(i==13)
		{ 
			printf("\n");
		}
		printf("%d  ", meas->wart_ScatterAzimuth[i]);
		 for( x=0 ; x<=2 ; x++)
		{
		tabpom[x]=0;
		}
	    } 
        } while (c != '\n');
1

Dam 5+ temu kto to pomoże mi z tym problemem..

To daj 5+ debuggerowi.

0

hmmm... zacna odpowiedź Panie. Zastanowię się ale chyba nie.
Nie pisałbym tutaj gdybym rozwiązał problem przy pomocy debugera. kombinowałem w te i wewte .. problem dalej jest...
podbijam! Dam 6 osobie która pomoże..

0

tabpom to tablica char tak? Przekazujesz ją do atoi, masz na jej końcu '\0'? Czy konwersja na int się powiodła? W zasadzie wypełniasz tę tablicę zerami, ale w jednym miejscu może przechowywać ona aż 3 znaki. Co wtedy z jej końcem?

Also: for( x=0 ; x<=2 ; x++) jest IMO nieładne. Z kodu wiadomo, że tabpom ma co najmniej 3 elementy, ale chyba zdecydowana większość napisałaby for(x = 0; x < 3; x++) - teraz widać, że są 3 elementy.

0

Tak , oczywiście tabpom to tablica znaków , a konwersja do inta się powiodła i równa się on akurat w tym przypadku 19..

Masz racje należałoby ładnie zakończyć więc dopisałem jako ostatni znak '/0' ale dalej nic ...

0

Akurat w tym przypadku w tym miejscu mogą być jedynie 2 znaki (liczba 2 cyfrowa ) na 3 miejscu umieściłem znak końca. Znaki ładnie konwertują się na inta i pod meas=->ScatterAzimuth jest 19.

if(n==1) tabpom[0]=c;
      if(n==2) tabpom[1]=c;
	  tabpom[2]='\0'; 

Wszystkie tablice zaopatrzyłem w znak końca ...

1

Przeanalizuj dokładnie co dzieje się z tablicą meas->wart_AngleOfIncidence. Widzę, że ustawiasz w niej jakieś wartości o indeksie i, ale nie widać, jaki ma on wartość początkową. Może przekraczasz zakres tej tablicy?

W zasadzie błąd może być równie dobrze gdzieś wyżej. To co Ci tam wyskakuje najprawdopodobniej oznacza, że calloc się nie powiodło z powodu nieuprawnionego zapisu do pamięci gdzieś wcześniej. Np. przekroczyłeś zakres jakieś tablicy i pisałeś poza zaalokowany dla niej obszar.

0

Wielkie dzięki ! Pomogło! Przepełniłem wcześniejszą tablicę o jedną wartość.. Dzięki wielkie jeszcze raz !

1
 (c == '0'|| c=='1' || c=='2' ||c=='3' || c=='4' || c=='5' || c=='6' || c=='7' || c=='8' || c== '9' && n<=2) 

Precedens Priorytet operatorów się kłania, żeby łatwiej zapamiętać || jest dodawaniem, && mnożeniem (niekiedy się nawet tak zapisuje).

1
kozi555 napisał(a):
if (c == '0'|| c=='1' || c=='2' ||c=='3' || c=='4' || c=='5' || c=='6' || c=='7' || c=='8' || c== '9'  )

Lepiej zrobić tak:

if (c >= '0' && c <= '9')

lub tak:if (isdigit(c))



 > ##### [kozi555 napisał(a)](http://4programmers.net/Forum/855098):
> 
```cpp
if (c == 9...

Nie! Nie używaj kodów ASCII skoro masz znaki pod ręką! Powinno być

if (c == '\t'...

Jest też funkcja isspace...

1 użytkowników online, w tym zalogowanych: 0, gości: 1