Przechowywanie macierzy w ** dobule oraz wypisywanie

0

Siemano!
Naskrobałem sobie program, który ma mi zapisywać macierz o rządzie r i ilości kolumn c. Dane do macierzy wczytuje do double ** v. Nie wiem czemu mi nie działa. Wszystkie pętle działają. Dają dobre współczynniki do znalezienia odpowiedniego v[][]. Tutaj zamieszczam kod:

 
double **v;
        printf("Podawaj teraz kolejne wyrazy macierzy!\n");
        int rr = 0; // tak jakby r - rzędy
        int cc = 0; //tak jakby c- kolumny
        v = (double**)malloc(r *  sizeof(double**));
                while(r > rr)
                {
                        v[rr] =(double*) malloc(c * sizeof(double*));
                        while(c > cc)
                        {
                                scanf("%lf", &(v[rr][cc]));
                                ++cc;
                        }
                cc = 0;
                ++rr;
                }
        printf("\n\n");
           rr = 0; // tak jakby r - rzędy
         cc = 0; //tak jakby c- kolumny
                while(r > rr)
                {
                        while(c > cc)
                        {
                                printf("%0.1f  ", v[rr][cc]);
                                ++cc;
                        }
                printf("\n");
                cc = 0;
                ++rr;
                }
}

Bardzo proszę o pomoc i wskazówki co jest nie tak. Próbowałem już wczytywać liczby przez fgets i dalej nic.

0

Przede wszystkim napisz jaki jest błąd. Tak na początek mogę powiedzieć, że źle alokujesz pamieć. Powinno być:

 
        v = (double**)malloc(r *  sizeof(double*));
	...
        v[rr] =(double*) malloc(c * sizeof(double));
0

Tak na chłopski rozum :
jeśli deklarujesz wskaźnik do tablicy który ma X gwiazdek to w sizeof wrzucasz jedną gwiazdkę mniej, czyli :

v = (double**)malloc(r *  sizeof(double **));
// powinno byc
v = (double**)malloc(r *  sizeof(double*));

// zas zamiast
v[rr] =(double*) malloc(c * sizeof(double*));
//powinno byc
v[rr] =(double*) malloc(c * sizeof(double));

Pozostawienie pierwszej części błędnej nie przeszkadza w prawidłowym działaniu programu tylko dlatego, że double** i double* mają tyle samo bajtow (po prostu wskaźniki z informacją o typie).
Za to różnica między double* a double jest już spora i powoduje błędne wypisanie danych.

0

Dokładnie!

Źle przydzielałem pamięć przez sizeof. Już działa. Wielkie dzięki!
Niech Bóg wam w dzieciach wynagrodzi =)

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