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

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:

#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

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.

0

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

1

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

double *tab;  /* ********************************************************** */
tab = (double*)malloc(sizeof(double*));
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.

tab=NULL; free(tab);

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

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

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.

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?

0

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

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