Opiszę, co robi twój kod.
Kod: Zaznacz cały
a=new int *[w];
for(i=0;i<w;i++)
a[i]=new int [k];
Najpierw alokuje pamięć na tablicę dwuwymiarową i umieszcza w
a
wskaźnik na nią.
Kod: Zaznacz cały
wpis(a,w,k);
gdzie:
void wpis(int **x, int w, int k){
int i,j;
x=new int *[w];
for(i=0;i<w;i++)
x[i]=new int [k];
cout<<"Wprowadz liczby do macierzy wierszami:
";
for(i=0;i<w;i++){
cout<<">>Wiersz "<<i+1<<".
";
for(j=0;j<k;j++){
cout<<"Wprowadz liczbe: ";
cin>>x[i][j];
}
}
}
Potem przekazuje ten wskaźnik pod nazwą
x
do funkcji
wpis
. Ta funkcja ignoruje jednak wartość wskaźnika i zmienną
x
nadpisuje wskaźnikiem na drugą tablicę, na którą alokowana jest nowa pamięć. Następnie do drugiej tablicy wczytuje od użytkownika dane, a na koniec zapomina wskaźnika do niej. (Przy okazji tworzy się szkodliwy wyciek pamięci)
Kod: Zaznacz cały
druk(a,"Tablica pierwsza: ",w,k);
gdzie:
void druk(int **x, string opis, int w, int k){
int i,j;
x=new int *[w];
for(i=0;i<w;i++)
x[i]=new int [k];
cout<<opis<<"
";
for(i=0;i<w;i++){
for(j=0;j<k;j++)
cout<<x[i][j]<<" ";
cout<<"
";
}
}
Dalej, wskaźnik
a
na pierwszą tablicę jest przekazany pod nazwą
x
do funkcji
druk
, która też ignoruje jego wartość i to tej zmiennej zapisuje adres trzeciej tablicy, na którą alokowana jest nowa pamięć. Dalsza część funkcji wyświetla zawartość pamięci trzeciej tablicy, która nie była inicjalizowana, dlatego wychodzą losowe liczby. Na koniec, wskaźnik na trzecią tablicę jest zapominany, co powoduje kolejny wyciek pamięci.
Na koniec, wyświetlana jest wartość pierwszej komórki pierwszej tablicy, która również nie była inicjalizowana. Dlatego najczęściej wyświetli się wartość różna od wpisanej i różna od pierwszego elementu tablicy poprzednio wyświetlonej.
Wniosek: wyrzuć w funkcjach
wpis
i
druk
kawałki kodu odpowiedzialne za nadpisywanie przekazanego wskaźnika
a
i alokację pamięci, to program będzie działać poprawnie.