In C oltre alla variabili globali (sconsigliate) l' unico modo era usare i tripli puntatori.Originariamente inviato da pipporossonero
hai perfettamente ragione sul delete mea culpa, concordo con l'utilizzo dei reference nella funzione alloca ma se stessimo scrivendo in C e non in C++, il mio codice utilizzando i tripli puntatori e passando per indirizzo non sarebbe l'unica via percorribile ( e se si dove ho sbagliato ? )...grazie per la risposta !
Attenzione alla precedenza degli operatori:
q è un puntatore a puntatore allocato nello stack, locale alla funzione alloca (è stato allocato automaticamente nello stack per contenere il valore di quello che nel main è &p).codice:void alloca(int***q,int d) { cout<<"funzione alloca \n "; *q=(int**)new int* [d]; for(i=0;i<d;i++) { (*q)[i]=(int*)new int[d]; // l' operatore [] ha la precedenza } }
Quando i vale zero non c'è problema ad accedere a *q[i] perchè i vale zero.
La tua intenzione non era:
-Prima spostarti di i posizioni da q;
-Poi deferenziare il risultato della sotto-espressione ottenuta (cioè q[i]).
Ma invece volevi:
-Deferenziare q;
-Spostarti di i posizioni da *q.
Perchè *q contiene quello che nel main è p, ma *(q+1) probabilmente non c'è nello stack.
E questo lo devi correggere in tutto il codice, non solo nella alloca.
Altra cosa: per la get non servivano i tripli puntatori visto che stai solo cambiando i valori contenuti nella matrice.Poi le variabili i e j non le dichiarare globali, ma instanziale nel for:
codice:for(int i=0;i<d;i++) {...}
Ma no anzi, le migliori cose si imparano sbagliando clamorosamente , perchè non te le dimentichi maiFigura di merda...è vero Viene creata una nuova variabile all'interno della funzione e poi viene persa...![]()

Rispondi quotando