Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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: 6379
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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: 6379
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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: 6379
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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: 6379
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo