2015-12-07 4 views
6

Ho bisogno di aiuto per contare le righe e le colonne di una matrice bidimensionale. Sembra che non possa contare le colonne?C: Dimensioni della matrice bidimensionale

#include <stdio.h> 

int main() { 

char result[10][7] = { 

    {'1','X','2','X','2','1','1'}, 
    {'X','1','1','2','2','1','1'}, 
    {'X','1','1','2','2','1','1'}, 
    {'1','X','2','X','2','2','2'}, 
    {'1','X','1','X','1','X','2'}, 
    {'1','X','2','X','2','1','1'}, 
    {'1','X','2','2','1','X','1'}, 
    {'1','X','2','X','2','1','X'}, 
    {'1','1','1','X','2','2','1'}, 
    {'1','X','2','X','2','1','1'} 

}; 

int row = sizeof(result)/sizeof(result[0]); 
int column = sizeof(result[0])/row; 

printf("Number of rows: %d\n", row); 
printf("Number of columns: %d\n", column); 

} 

uscita:
Numero di righe: 10
Numero di colonne: 0

+3

'colonna int = sizeof (risultato [0])/sizeof (risultato [0] [0]); ' – BLUEPIXY

+1

Dato che sono statici, perché dovresti contarli comunque? Basta definire le costanti per le righe e le dimensioni del col, invece di usare "numeri magici". – Lundin

risposta

4

Questo è un problema di divisione intera!

int column = sizeof(result[0])/row; 

dovrebbe essere

int column = 7/10; 

e divisione intera, 7/10==0.

Quello che vuoi fare è dividere la lunghezza di una riga, ad es. sizeof(result[0]) dalla dimensione di un elemento di quella riga, ad es. sizeof(result[0][0]):

int column = sizeof(result[0])/sizeof(result[0][0]); 
+1

Questo è sbagliato. Qui dividi 7 (numero di elementi sulla prima riga) per 1 (numero di caratteri su 'risultato [0] [0]'). – emi

5

Questo funziona per me (commenti spiega perché):

#include <stdio.h> 

int main() { 

    char result[10][7] = { 

     {'1','X','2','X','2','1','1'}, 
     {'X','1','1','2','2','1','1'}, 
     {'X','1','1','2','2','1','1'}, 
     {'1','X','2','X','2','2','2'}, 
     {'1','X','1','X','1','X','2'}, 
     {'1','X','2','X','2','1','1'}, 
     {'1','X','2','2','1','X','1'}, 
     {'1','X','2','X','2','1','X'}, 
     {'1','1','1','X','2','2','1'}, 
     {'1','X','2','X','2','1','1'} 

    }; 

    // 'total' will be 70 = 10 * 7 
    int total = sizeof(result); 

    // 'column' will be 7 = size of first row 
    int column = sizeof(result[0]); 

    // 'row' will be 10 = 70/7 
    int row = total/column; 

    printf("Total fields: %d\n", total); 
    printf("Number of rows: %d\n", row); 
    printf("Number of columns: %d\n", column); 

} 

E l'uscita di questo è:

Total of fields: 70 
Number of rows: 10 
Number of columns: 7 

EDIT:

Come indicato da @AnorZaken, passando l'array a una funzione come parametro e stampando il risultato di sizeof su di esso, verrà emesso un altro total. Questo perché quando passi un array come argomento (non un puntatore ad esso), C lo passerà come copia e applicherà qualche magia C in mezzo, quindi non stai passando esattamente come pensi di essere. Per essere sicuri di ciò che si sta facendo ed evitare un po 'di lavoro extra della CPU e il consumo di memoria, è meglio passare array e oggetti per riferimento (usando i puntatori). Così si può usare qualcosa di simile, con gli stessi risultati come originale:

#include <stdio.h> 

void foo(char (*result)[10][7]) 
{ 
    // 'total' will be 70 = 10 * 7 
    int total = sizeof(*result); 

    // 'column' will be 7 = size of first row 
    int column = sizeof((*result)[0]); 

    // 'row' will be 10 = 70/7 
    int row = total/column; 

    printf("Total fields: %d\n", total); 
    printf("Number of rows: %d\n", row); 
    printf("Number of columns: %d\n", column); 

} 

int main(void) { 

    char result[10][7] = { 

     {'1','X','2','X','2','1','1'}, 
     {'X','1','1','2','2','1','1'}, 
     {'X','1','1','2','2','1','1'}, 
     {'1','X','2','X','2','2','2'}, 
     {'1','X','1','X','1','X','2'}, 
     {'1','X','2','X','2','1','1'}, 
     {'1','X','2','2','1','X','1'}, 
     {'1','X','2','X','2','1','X'}, 
     {'1','1','1','X','2','2','1'}, 
     {'1','X','2','X','2','1','1'} 

    }; 

    foo(&result); 

    return 0; 
} 
+2

Le risposte al solo codice senza spiegazioni sono spesso poco utili per i futuri visitatori. Valuta la possibilità di modificare la risposta per fornire ulteriori informazioni/informazioni sul processo di risoluzione. – Magisch

+4

Il codice è autoesplicativo per me, ma ti capisco. Ora modifica la risposta. – emi

+0

Basta sottolineare che questo non funziona sugli array ricevuti come argomenti di funzione, in particolare 'total = sizeof result;' non funzionerà: genererà un avviso e valuterà la dimensione di un singolo elemento invece della dimensione del intero array. Quindi è necessario VLA (e si passa argomento di riga e colonna) oppure si deve passare la riga o il conteggio totale come argomento (la colonna può ancora essere determinata con sizeof). – AnorZaken

6

E 'molto più conveniente (e meno soggetto a errori) per utilizzare una macro lunghezza dell'array:

#include <stdio.h> 

#define LEN(arr) ((int) (sizeof (arr)/sizeof (arr)[0])) 

int main(void) 
{ 
    char result[10][7]; 

    printf("Number of rows: %d\n", LEN(result)); 
    printf("Number of columns: %d\n", LEN(result[0])); 
    return 0; 
} 
+0

Perché il numero intero viene lanciato sulla macro 'LEN'? Non sono matrici strutture dati omogenee, cioè il nominatore sarà sempre un multiplo del denominatore? Inoltre, la divisione non dovrebbe restituire un "intero senza segno" o "size_t", che è già un tipo intero? – Rafa

+1

@Rafa Possiamo fare a meno del cast se cambiamo l'identificatore di formato '% d' in'% lu'. Quando * LEN * è usato in un ciclo di protezione 'for', allora dobbiamo usare un cast o dichiarare le variabili di indice con tipo * size_t *. –