Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di zuffff
    Registrato dal
    Sep 2004
    Messaggi
    40

    [C++] Allocazione dinamica matrice

    Devo allocare dinamicamente una matrice di interi;
    perchè non è possibile farlo in questo modo?:

    int **p;

    p=new int[5][5];

    grazie
    La teoria è quando si sa tutto ma non funziona niente.
    La pratica è quando funziona tutto ma non si sa il perché.
    In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
    non funziona niente e non si sa il perché.
    (Albert Einstein)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C++] Allocazione dinamica matrice

    Originariamente inviato da zuffff
    Devo allocare dinamicamente una matrice di interi;
    perchè non è possibile farlo in questo modo?:

    int **p;

    p=new int[5][5];

    grazie
    Perché sono 2 tipi completamente diversi! Puoi usare int **p per un array bidimensionale di interi ma l'allocazione è da fare in modo completamente diverso.

    Esempio:
    codice:
    int i;
    int **matrice;
    
    matrice = new int*[5];
    
    for (i = 0; i < 5; i++)
        matrice[i] = new int[5];
    Dichiarando int **matrice, si dichiara "un puntatore a puntatore a int". Questo vuol dire che l'unico modo per avere così un array bidimensionale, è quello di creare "un array di array". Con la prima new alloco un array di puntatori ad int. Con le successive N new alloco N array di interi. In questo modo matrice[i][j] si comporta proprio come volevi.

    Mentre invece int matrice[5][5] è una cosa molto diversa. Intanto solo questo è il vero array bidimensionale come inteso dal "C", cioè un insieme contiguo di elementi. Quello di prima è "un array di array", cioè un semplice array in cui ogni elemento punta ad un altro array.

    Se provi a compilare il tuo codice, otterresti un errore di questo tipo:

    cannot convert `int (*)[5]' to `int**' in assignment

    I due tipi sono molto diversi. Dichiarando int matrice[5][5], per accedere ad una cella [i][j], il compilatore produce un qualcosa del tipo:

    *(((int*) matrice) + i*5 + j)

    Che è quindi ben diverso dal dereferenziare 2 volte un puntatore **.

    Spero di aver spiegato bene la questione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di zuffff
    Registrato dal
    Sep 2004
    Messaggi
    40
    Credo di aver capito più o meno l'errore.
    Ho ancora un dubbio: nel dichiarare la matrice nel modo in cui mi hai indicato le cella in memoria saranno contigue?
    Potrò accedervi con un semplice for?
    La teoria è quando si sa tutto ma non funziona niente.
    La pratica è quando funziona tutto ma non si sa il perché.
    In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
    non funziona niente e non si sa il perché.
    (Albert Einstein)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da zuffff
    Ho ancora un dubbio: nel dichiarare la matrice nel modo in cui mi hai indicato le cella in memoria saranno contigue?
    Guarda ... usando un puntatore **, un array bidimensionale ha questa struttura:



    Credo che così sia chiaro come sono organizzate le celle.

    Originariamente inviato da zuffff
    Potrò accedervi con un semplice for?
    Certo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di zuffff
    Registrato dal
    Sep 2004
    Messaggi
    40
    grazie mille. ora ho capito! ciao
    La teoria è quando si sa tutto ma non funziona niente.
    La pratica è quando funziona tutto ma non si sa il perché.
    In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
    non funziona niente e non si sa il perché.
    (Albert Einstein)

  6. #6
    Raga scusate ma sono nuovo del c e davvero con i puntatori non ci sto capendo molto.
    Quello che sto cercando di fare è calcolare un determinante di una matrice di dimensione al massimo 100*100.

    Ho preso spunto dalla vostra discussione ma mi riesce difficile capire quello che è stato scritto qui:
    codice:
    int i;
    int **matrice;
    
    matrice = new int*[5];
    
    for (i = 0; i < 5; i++)
        matrice[i] = new int[5];
    int ** matrice non ho capito cosa sta ad indicare.
    Ma è un puntatore ad un vettore???
    E' bidimensionale????
    se devo accedere sia alle righe che alle colonne per riempire la matrice come devo fare??

    Dimenticavo sto usando il C non il C++ !!!!!

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Matrix_denny
    ...mi riesce difficile capire quello che è stato scritto qui:

    codice:
    int i;
    int **matrice;
    
    matrice = new int*[5];
    
    for (i = 0; i < 5; i++)
        matrice[i] = new int[5];
    E' stato inizializzato un puntatore ad un vettore di 5 puntatori. A loro volta, ognuno dei 5 puntatori, punta ad un vettore di 5 elementi interi.

    Si ottiene cosi' un insieme di 5 vettori a 5 elementi, quindi una tabella (un array a 2 dimensioni). Per allocare la tua matrice 100 x 100 devi sostituire tale valore nel codice.

    codice:
    matrice = new int*[100];
    
    for (i = 0; i < 100; i++)
        matrice[i] = new int[100];
    int ** matrice non ho capito cosa sta ad indicare.
    Ma è un puntatore ad un vettore???
    E' un puntatore a puntatore. Nel caso suddetto, serve a puntare al primo puntatore del vettore di puntatori ...

    E' bidimensionale????
    E' un termine che non si addice ad un puntatore ...

    se devo accedere sia alle righe che alle colonne per riempire la matrice come devo fare??
    Per esempio

    matrice[3][2] = 159;

    Dimenticavo sto usando il C non il C++ !!!!!
    Allora non usare l'operatore new per allocare ma le funzioni calloc o malloc ... Il resto non cambia ...

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    Originariamente inviato da Matrix_denny
    Ho preso spunto dalla vostra discussione
    ... me ne hai già aperta una. Non possiamo parlare del tuo problema in tutte le discussioni del forum, una basta e avanza.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.