• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd 0xc0000005

42 Warsaw Coding Academy
0 głosów
605 wizyt
pytanie zadane 27 listopada 2018 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)

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

2 odpowiedzi

0 głosów
odpowiedź 28 listopada 2018 przez Pascal Bywalec (2,720 p.)
Prawdopodobnie błędny warunek w pętli for linia 70
0 głosów
odpowiedź 28 listopada 2018 przez Bondrusiek Maniak (61,440 p.)

Witam,

cout<<"Znak "<<X<<" wystepuje "<<licz_znak(tab, N, X);

nigdzie nie jest zdefiniowana zmienna tab więc domyślnie ma NULL(dla typów wbudowanych są śmieci) każde próba odwołania się do tej zmiennej kończy się błędem. Zakładam że funkcja losuj() ma zwrócić taką wartość więc powinieneś przypisać ją do tab.

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;
...
...
    odczyt_pliku();
    tab = losuj(N); // tutaj zakładam że Twoim zamiarem było zwrócić wartość do tab
    //sortowanie(tab, N);
    cout<<"Znak "<<X<<" wystepuje "<<licz_znak(tab, N, X);
    system("pause");

 

komentarz 28 listopada 2018 przez Alan Kruszyński Obywatel (1,410 p.)
Dodałem w main, za wywołaniem odczyt_pliku(); instrukcję Struktura **tablica = losuj(N), a argumenty funkcji licz_znak ustawiłem na licz_znak(tablica, N, X). Funkcja działa ja należy, ale pojawia się kolejny problem. "Odkomentowałem" funkcję sortowanie oraz jej wywołanie, zmieniłem argument tab na tablica i efekt jest taki ja przed poprawą licz_znak, a sortowanie wywołane jest w main po instrukcji Struktura **tablica = losuj(N) więc przyjmuje argument tablica taki sam jak funkcja licz_znak
komentarz 29 listopada 2018 przez Bondrusiek Maniak (61,440 p.)

Wychodzisz po za tablicę. Tablicę indeksujemy od 0 do n-1. W Twojej pętli iterujesz od

 for (i=0; i<=rozm; i++)

Jeszcze w tej pętli próbujesz porównać element o takim indeksie tab[i+1] wiec aby poprawnie działała pętla to proponuje taki warunek

 for (i=0; i< rozm - 1; i++)

 

Podobne pytania

0 głosów
1 odpowiedź 494 wizyt
pytanie zadane 19 kwietnia 2023 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
0 głosów
2 odpowiedzi 211 wizyt
pytanie zadane 6 listopada 2020 w C i C++ przez komboboost0 Użytkownik (570 p.)
0 głosów
1 odpowiedź 470 wizyt
pytanie zadane 8 stycznia 2021 w C i C++ przez bartx3 Początkujący (270 p.)

93,379 zapytań

142,380 odpowiedzi

322,533 komentarzy

62,734 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...