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

Dostęp do pamięci

0 głosów
64 wizyt
pytanie zadane 14 listopada 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
#include <iostream>
#include <fstream>

using namespace std;

struct Student
{
public:
    string imie, nazwisko;
    int nr_indeksu;
};

void wczytaj(Student * T)
{
    ifstream plik("zadanie1.txt");
    int l;
   
    if (plik)
    {
        
        plik >> l;
        T = new Student[l];
        for (int i = 0; i < l; i++)
        {
            plik >> T[i].imie >> T[i].nazwisko >> T[i].nr_indeksu;
            cout << T[i].imie << T[i].nazwisko << T[i].nr_indeksu << endl; 
            // chodzi o ten cout
        }
    }
    else
    {
        cout << "Blad przy otwieraniu pliku";
    }
    
}

int main()
{   
    Student* tablica = nullptr;
    wczytaj(tablica);
// cout << tablica[2].imie; to powoduje problem
    
    
    
    
    return 0;
}

 

Cześć, mam problem z tablicą dynamiczną przekazywaną do funkcji, jej rozmiar zapisany jest w pliku dlatego wykombinowałem rozwiązanie jak powyżej, i wszystko działa(cout pokazuje prawidłowe dane które mam w pliku). Ale kiedy chce sprawdzić konkretną zmienna konkretnego elementu tablicy już w mainie to dostaje ten komunikat:

"Zgłoszono nieobsługiwany wyjątek: naruszenie dostępu do odczytu.
this było 0x94."

1 odpowiedź

+1 głos
odpowiedź 14 listopada 2020 przez tangarr VIP (140,920 p.)

Zmienna T w funkcji wczytaj jest lokalną kopią wskaźnika przekazanego do funkcji. Przypisanie do T nowej wartości nie modyfikuje wskaźnika zewnętrznego.

Aby to naprawić potrzebujesz referencję do wskaźnika. Wtedy zamiast kopii otrzymasz bezpośredni dostęp do przekazanego elementu.

void wczytaj(Student *& T)

Innym pomysłem (prostszym do zrozumienia) jest zwrócenie nowego wskaźnika jako wynik funkcji.

Student * wczytaj()

 

komentarz 14 listopada 2020 przez Oscar Nałogowiec (27,430 p.)

Może przytoczę wyjaśnienie mechanizmu przekazywania parametrów w C, jakie podał na jakimś wykładzie śp. pan JanB (nie wiem, czy to jego twórczość, czy jakiś cytat):

jeśli jest funkcja z parametrem;

void f(int x)

To przy wykonaniu kodu w wywołania przykładowo:

f(3);

Zachowanie funkcji jest dokładnie takie, jakby na początku ciała funkcji była definicja:

int x = 3;

 

To nawet pasuje do kodu jaki generuje wywołanie funkcji, z tą różnicą, że argumenty są odkładane na stos przed adresem powrotu, a zmienne lokalne funkcji po.

 

Podobne pytania

+1 głos
1 odpowiedź 99 wizyt
0 głosów
0 odpowiedzi 77 wizyt
pytanie zadane 25 maja 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)
0 głosów
1 odpowiedź 213 wizyt
pytanie zadane 7 maja 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

89,694 zapytań

138,298 odpowiedzi

309,243 komentarzy

59,623 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...