Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicit e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con vettore multidimensionale
Forum - C/C++ - Problema con vettore multidimensionale

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 17:37
Domenica, 25/03/2012
Il mio problema il seguente: nella funzione main dichiaro un vettore cubic a tre dimensioni
Codice sorgente - presumibilmente C/C++

  1. int cubic[a][b][c];



Dopo aver elaborato un input utente, devo passare il vettore a delle altre funzioni che operano su questo array, ma non so come dichiarare le funzioni.

Per esempio questo corretto?
Codice sorgente - presumibilmente C++

  1. void roto(int cubic[], int cube, int row, bool direction, int nrot)
  2. {
  3.     int tmp[cube];
  4.     int i;
  5.  
  6.     while(nrot-- > 0)
  7.     {
  8.     for(i = 0; i <= cube - 2; i++)
  9.     {
  10.       memcpy(tmp, cubic[i + 1][row], 10);
  11.       memcpy(cubic[i + 1][row], cubic[0][row], 10);
  12.       memcpy(cubic[0][row], tmp, 10);
  13.     }
  14.     }
  15. }


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:45
Domenica, 25/03/2012
In genere non si alloca un array con delle variabili (non consentito in tutti i compilatori non C99) ed comunque una brutta abitudine.

Se allochi l'array con tre costanti

int cubic[A][B][C];

allora puoi passarlo semplicemente indicandolo in questo modo

void roto (int arr[A][B][C], ...

oppure (ed meglio) lo "allochi dinamicamente" con le apposite funzioni malloc o calloc usando un triplo puntatore che passerai alla funzione.


Ricorda che nessuno obbligato a risponderti e che nessuno perfetto ...
PM Quote
Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 18:10
Domenica, 25/03/2012
Quindi dichiaro il vettore:
Codice sorgente - presumibilmente C/C++

  1. int ***cubic = malloc(sizeof(int) * numero_elementi);



e la funzione:

Codice sorgente - presumibilmente C++

  1. void roto(int ***cubic, int cube, int row, bool direction, int nrot)
  2. {
  3.     int tmp[cube];
  4.     int i;
  5.  
  6.     while(nrot-- > 0)
  7.     {
  8.     for(i = 0; i <= cube - 2; i++)
  9.     {
  10.       memcpy(tmp, cubic[i + 1][row], 10);
  11.       memcpy(cubic[i + 1][row], cubic[0][row], 10);
  12.       memcpy(cubic[0][row], tmp, 10);
  13.     }
  14.     }
  15. }


PM Quote
Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 18:12
Domenica, 25/03/2012
Io ho bisogno di poter accedere sempre al vettore in questo modo: vettore[n][h][k], dove n, h e k sono indici casuali.

Ultima modifica effettuata da drewnik99 il 25/03/2012 alle 18:17
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:21
Domenica, 25/03/2012
L'allocazione che hai scritto non corretta ... e nella funzione tratti l'array come se avesse due dimensioni, mentre ne ha tre.

Non scrivere [ b ] nel forum senza gli spazi perch altrimenti non si vede.

Ultima modifica effettuata da nessuno il 25/03/2012 alle 18:23


Ricorda che nessuno obbligato a risponderti e che nessuno perfetto ...
PM Quote
Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 19:18
Domenica, 25/03/2012
Potresti suggerirmi l'allocazione corretta?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:20
Domenica, 25/03/2012
Testo quotato

Postato originariamente da drewnik99:

Potresti suggerirmi l'allocazione corretta?



Codice sorgente - presumibilmente Delphi

  1. int ***array;
  2.  
  3.         array = (int ***) malloc( a * sizeof(int **) );
  4.  
  5.         for ( k = 0 ; k < a ; k++ )
  6.            array[k] = (int **) malloc( b * sizeof(int *) );
  7.  
  8.         for ( k = 0 ; k < a ; k++ )
  9.            for ( j = 0 ; j < b ; j++ )
  10.                   array[k][j] = (int *) malloc( c * sizeof(int) );



Studiati il codice e ricorda che dovrai liberare la memoria alla fine in modo analogo ma nell'ordine inverso.


Ricorda che nessuno obbligato a risponderti e che nessuno perfetto ...
PM Quote
Avatar
drewnik99 (Normal User)
Pro


Messaggi: 69
Iscritto: 28/03/2008

Segnala al moderatore
Postato alle 23:14
Domenica, 25/03/2012
Va bene, ho capito questo codice, grazie.
Non possibile, per, dichiarare il vettore staticamente e poi passarlo alla funzione?
Nel caso io avessi un vettore allocato staticamente, come farei a passarlo alla funzione e come dovrei dichiarare la funzione?
Se provo ad accedere all'array in una funzione che non sia quella in cui dichiaro il vettore, il programma restituisce un errore durante l'esecuzione.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 23:16
Domenica, 25/03/2012
Te l'ho detto nella mia prima risposta ...

Dai un'occhiata anche a

http://www.cplusplus.com/doc/tutorial/arrays/

Ultima modifica effettuata da nessuno il 25/03/2012 alle 23:19


Ricorda che nessuno obbligato a risponderti e che nessuno perfetto ...
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo