Program ma pobrać z pliku dwie zmienne, int N oraz char X. Alokuje i tworzy N struktur, po czym w tablicy dynamicznej umieszcza wskaźniki na nie. Tablica jest sortowana bąbelkowo rosnąco wg pola Struktury int i. Funkcja losuj ma zwracać adres tablicy ze wskaźnikami który jest używany jako argument w kolejnych funkcjach. Program się kompiluje, nie ma błędów ani ostrzeżeń, używane kompilatory domyślne z Code::Blocks i DevCpp. Program uruchomiony wypisuje dla sprawdzenia nieposortowane 10 struktur a potem zostawia fragment miejsca i wypisuje Proces returned -1073741819 (0xC0000005), a powinien wypisać ilość wystąpień znaku X. Wyczytałem że błąd dotyczy najprawdopodobniej wycieku pamięci/wyjścia poza zakres. Kombinowałem jak mogłem, ale nie mogę zlokalizować błędu. Proszę bardzo o pomoc
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <cstdlib>
#include <time.h>
struct Struktura {
int i;
char c;
float f;
} ;
int N, i, licznik = 0; //licznik to dlugosc tablicy tab2
Struktura **tab;
int *tab2; //w tab2 zapisywane sa wylosowane wartoci int i ze Struktura
char X;
using namespace std;
void odczyt_pliku(){
fstream plik;
plik.open("labin01.txt", ios::in);
if(plik.good()==false){
cout<<"Nie udalo sie odczytac pliku lub plik nie istnieje";
exit(0);
}
plik >> N >> X;
plik.close();
}
int losuj_liczbe(){
int wylosowana, j;
if (licznik ==0){
wylosowana = rand()%10000-1000;
tab2[licznik]=wylosowana;
}
else{
while(j<=licznik) {
wylosowana = rand()%10000-1000;
for(j = 0; j <=licznik; j++){
if(wylosowana == tab2[j]){
break;
}
}
}
tab2[licznik+1] = wylosowana;
}
return wylosowana;
}
char losuj_znak(){
char znaki[]="BCDEFGHIJKLMNOPQRSTUVWX";
char w_znak = znaki[rand()%(sizeof(znaki)-1)];
return w_znak;
}
Struktura ** losuj (int n){
struct Struktura **tab = (struct Struktura**)malloc(N*sizeof(struct Struktura*));
tab2 = (int*)malloc(N*sizeof(int));
srand(time(NULL));
for (i = 0; i<=n; i++){
tab[i]=(struct Struktura*)malloc(sizeof(struct Struktura));
tab[i]->i=losuj_liczbe();
tab[i]->c=losuj_znak();
tab[i]->f=1000+i;
}
for(i=0; i<=10; i++){
cout<<tab[i]->i<<" ";
cout<<tab[i]->c<<" ";
cout<<tab[i]->f<<endl;
}
cout<<endl;
cout<<endl;
return tab;
}
/*void sortowanie(Struktura ** wsk, int rozm){
int j;
bool zamiana;
for (i=0; i<=rozm; i++){
for (j=0; j<=rozm-i; j++){
zamiana = 0;
if (((wsk[j])->i) > ((wsk[j+1])->i)) {
swap(wsk[i], wsk[i+1]);
zamiana = 1;
}
}
if (zamiana == 0){
break;
}
}
cout<<endl;
for(i=0; i<=10; i++){
cout<<wsk[i]->i<<" ";
}
}*/
int licz_znak(Struktura ** wsk, int rozm, char znak){
int ile_znakow = 0;
for (i = 0; i<rozm; i++){
if ((wsk[i]->c)==znak){
ile_znakow++;
}
}
return ile_znakow;
}
int main()
{
odczyt_pliku();
losuj(N);
//sortowanie(tab, N);
cout<<"Znak "<<X<<" wystepuje "<<licz_znak(tab, N, X);
system("pause");
return 0;
}
Gdyby komuś tak było łatwiej:
https://pastebin.pl/view/8e19c6ee