Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Dynamiczna tablica trójkątna

Ostatnio zmodyfikowano 2016-01-22 12:13
Autor Wiadomość
mimotego
Temat założony przez niniejszego użytkownika
[C] Dynamiczna tablica trójkątna
» 2016-01-21 17:56:55
Witam, mam napisać funkcję, która przyjmie liczbę jako parametr, następnie dynamicznie zaalokuje dwuwymiarową trójkątną tablicę, wypełni ją i zwróci jej adres. Oto co stworzyłem:
C/C++
#include<stdio.h>
#include<stdlib.h>

int ** tablicaTrojkatna( int n ) {
    int i, j, k = 1;
    int ** tablica = malloc( sizeof( int * ) * n );
    for( i = 0; i < n; i++ ) {
        tablica[ i ] = malloc( sizeof( int ) *( i + 1 ) );
    }
    for( i = 0; i < n; i++ ) {
        for( j = 0; j < k; j++ ) {
            tablica[ i ][ j ] = 0;
            k++;
        }
    }
    return tablica;
}

int main() {
    int i, j, k = 1;
    int ** t = tablicaTrojkatna( 5 );
    for( i = 0; i < 5; i++ ) {
        for( j = 0; j < k; j++ ) {
            printf( "%d", t[ i ][ j ] );
            k++;
        }
    }
    for( i = 0; i < n; i++ ) free( tablica[ i ] );
   
    free( tablica );
    return 0;
}

Program oczywiście nie działa, a kompilator wyrzuca naruszenie ochrony pamięci.
P-143857
mateczek
» 2016-01-21 19:27:16
1. "tablica" w funkcji main nie zadeklarowana (nie wiadomo co to jest)
2. zmienna n również nie istnie
3. w c++ to się nawet nie kompiluje!!!
4.
C/C++
for( j = 0; j < k; j++ ) {
    tablica[ i ][ j ] = 0;
    k++; // k jest zawsze większe od j (pętla nigdy się nie kończy !!!! )
}

jeśli już to chyba tak miało być. Oczywiście wcześniej musisz nadać odpowiednią wartość zmiennej n !!!

C/C++
for( i = 0; i < n; i++ ) {
    for( j = 0; j < i + 1; j++ ) {
        tablica[ i ][ j ] = 0;
       
    }
}

zobacz debuger !!!

https://www.youtube.com/watch​?v=L9JvSHYLvuw
P-143862
mimotego
Temat założony przez niniejszego użytkownika
» 2016-01-21 19:55:30
No tak z tymi zmiennymi "n" i "tablica" to moje niedopatrzenie. Poprawienie warunku w drugiej pętli załatwiło sprawę.
Chciałbym jeszcze zapytać czy takie zwolnienie pamięci jest prawidłowe?
C/C++
int main() {
    int i, j;
    int ** t = tablicaTrojkatna( 5 );
    for( i = 0; i < 5; i++ ) {
        for( j = 0; j < i + 1; j++ ) {
            printf( "%d", t[ i ][ j ] );
        } printf( "\n" );
    }
    for( i = 0; i < 5; i++ ) free( t[ i ] );
   
    free( t );
    return 0;
P-143864
darko202
» 2016-01-22 12:13:02
1.
 zasada jest dobra

2.
zasada forum "jeden problem" -> "jeden temat"
dlatego nowy problem -> nowy temat[/code]
P-143881
« 1 »
  Strona 1 z 1