dynamiczna tablica i malloc - return val. 3221225477, EXCEPTION ACCESS VIOLATION

dynamiczna tablica i malloc - return val. 3221225477, EXCEPTION ACCESS VIOLATION
elcoyote
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Witam,
napisałem program na zaliczenie. Ma on za zadanie wygenerować 100, 1000, 10000, 100000 i 1000000 liczb losowych typu double w oddzielnych plikach i zmierzyć czas generowania, odczytu i zapisu oraz przedstawić to w formie tabeli.. ale do rzeczy..

program na tablicy statycznej działa bez zarzutów, jednak muszę go przerobić na tablicę dynamiczną (typ double). Wiele godzin szukania błędu i doszedłem do tego, że prawdopodobnie problem tkwi w nieodpowiednim zastosowaniu wskaźników przy przydziale pamięci.

Wstawiam kod:

Kopiuj
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<fstream>

using namespace std;
main()
{
      int i,j=100;
      clock_t t_start;
      int zestawy= 10;
      float losowa= 0.0;
  
      string nazwa = "100";
      
      srand(unsigned(time(0)));
      
      cout<<"rozmiar\tczas_tworzenia\tczas_pisania\tczas_czytania\n";
      
      
      double *tab;  /* ********************************************************** */
      tab = (double*)malloc(sizeof(double*));  /* ********************************************************** */
      
      do
      {
      
         tab = (double*)realloc(tab,sizeof(double*)*10);  /* ********************************************************** */
         ofstream plik_pisz;
         plik_pisz.open(nazwa.c_str(), ios::out );
         
         cout<<zestawy<<"\t";
         
         t_start=clock();
      
         for (i=1; i<=zestawy; i++) 
         {
            losowa = (rand()/(double)RAND_MAX)*5;
            tab[i]=losowa;
         }
    
         cout<<(float)(clock()-t_start)<<"\t\t";
      
         for (i=1; i<=zestawy; i++) 
         {
            plik_pisz<<tab[i]<<"\n";
         }
      
         cout<<(float)(clock()-t_start)<<"\t\t";
     
     
         plik_pisz.close();
      
         ifstream plik_czytaj;
      
         plik_czytaj.open( nazwa.c_str(), ios::out );
        
         t_start=clock();
      
         for (i=1; i<=zestawy; i++) 
         {
              plik_czytaj>>tab[i];
         }
      
         plik_czytaj.close();
      
         cout<<(float)(clock()-t_start)<<"\t\n";
      
         nazwa = nazwa+"0";
         tab=NULL; free(tab); /* ********************************************************** */
	
         j=j*10; zestawy=zestawy*10;
      } while (j!=100000);
     
      getchar();getchar();
} 

wygwiazdkowałem problematyczne linijki kodu. Czy ktos może mi wyjaśnić, co jest źle?
Kompilator zwraca "return value 3221225477", czyli EXCEPTION_ACCESS_VIOLATION. Wykrzacza się przy zestawach 100 lub 1000, czasami przejdzie nawet dalej ale ostatecznie zawsze się wyłoży :(
stawiam wirtualne piwko!

pozdro i dzięki

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Wywal to, przeczytaj byle jaki kurs i zacznij od początku.
Zwłaszcza zwróć uwagę na dział związany z tablicami oraz przydzieleniem pamięci.

elcoyote
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

to nie wchodzi w grę :D aż tak tragicznie nie jest, tylko gdzieś zapomniałem "*" i stąd pytanie: gdzie?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

Użyj std::vector zamiast męczyć się z mallocem i spółką.

Kopiuj
double *tab;  /* ********************************************************** */
tab = (double*)malloc(sizeof(double*));
Kopiuj
tab = (double*)realloc(tab,sizeof(double*)*10);

Zamiast alokować pamięć o wielkości wskaźnika na double chciałeś alokować wielkość double. Poza tym, ten pierwszy malloc zupełnie nie ma sensu.

Kopiuj
tab=NULL; free(tab);

ustawiasz wskaźnik na NULL, a potem go czyścisz?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Kontynuując powyższe.
Nie umiesz indeksować tablicy.
Nie umiesz otworzyć plik do odczytu.
Skoro nie potrzebujesz tych wszystkich tablic na raz to czemu od razu nie przydzielisz na 1000000

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2518
1

Używaj klasy vector zamiast alokowania tablic recznie, zamiast char* uzywaj klasy string. Przykladowy kod:
http://ideone.com/5PNfYQ

Jak nauczysz sie z tego korzystac to dopiero zabieraj sie za wskazniki o ile bedziesz jeszcze ich potrzebowal.
Uzywajac wbudowanych klas da sie napisac praktycznie tak samo optymalny kod jak na wskaznikach, ale latwo tez napisac nieoptymalny kod nie myslac przy tym co sie dzieje.
W przykladzie wszystko jest uproszczone.

elcoyote
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Bo dostałem reprymendę, że stosuję niebezpieczną metodę jaką jest tworzenie tablicy statycznej w pętli, więc przerabiam to na dynamiczną. Każda sugestia (byleby rzeczowa) będzie cenna. Co z tym malloc?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0

No malloc nie używaj, zamiast tego użyj tablicy dynamicznej z biblioteki standardowej C++: std::vector

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.