- Sarebbe buona regola dare un'indentata decente al codice ed eliminare tutti gli spazi, prima di postare.
- Come nel file funzioni.c è ignoto l'array, anche nel file main.c è ignota la funzione di ordinamento dell'array. Va specificata anch'essa con extern.
- Se un tipo di dato è unsigned, va stampato con la direttiva di conversione %u (e non %d che viene usata per gli interi con segno).
- Come ho già ribadito nel mio primo post, la sizeof viene "eseguita" a compile time, quindi, quando un array statico si trova in un file differente, il compilatore non può conoscerne (a priori) la dimensione.
- Se si vuole comunque utilizzare la sizeof, per ottenere il numero degli elementi presenti in un array statico (procedimento di utilità quasi nulla, nel mondo reale della programmazione), va specificato, sulla extern, il numero di elementi dell'array.
- La sizeof restituisce sempre il numero di byte quindi, per conoscere la dimensione di un qualsiasi array, basta dividere il numero di byte dell'array, per il numero di byte del singolo elemento.
Per farla breve, il codice corretto (e correttamente indentato) è il seguente.
file: main.c
codice:
#include <stdio.h>
unsigned dati_comuni[8] = {10, 5, 7, 1, 65, 34, 8, 10};
extern void ordina_dati(void);
int main(void) {
int i;
ordina_dati();
for(i = 0; i < sizeof(dati_comuni)/sizeof(unsigned); i++) {
printf("Elemento %d vale %u\n", i, dati_comuni[i]);
}
getchar();
return 0;
}
file: funzioni.c
codice:
void ordina_dati(void) {
unsigned i, j, temp;
extern unsigned dati_comuni[8];
for(i = 0; i < sizeof(dati_comuni)/sizeof(unsigned); i++) {
for (j = i + 1; j < sizeof(dati_comuni)/sizeof(unsigned); j++) {
if(dati_comuni[i] > dati_comuni[j]) {
temp = dati_comuni[i];
dati_comuni[i] = dati_comuni[j];
dati_comuni[j] = temp;
}
}
}
}
Su gcc questi due file vanno compilati nel seguente modo:
codice:
gcc funzioni.c main.c -o nome_programma
Ma nello specifico usi un array statico, e quindi non è indispensabile l'uso di sizeof(), in quanto conosci già di quanti elementi è costituito l'array, e la traccia dell'esercizio non fa' nessun riferimento al suo uso.
Il problema non è tanto l'utilizzo della sizeof, ma l'utilizzo dell'array statico. Se non ricordo male, su alcuni compilatori, non è possibile modificarne gli elementi a runtime, perché gli oggetti in esso contenuti vengono dichiarati come costanti.
Al di là di questo, gli unici utilizzi che posso immaginare per un array globale statico sono due:
- Salvataggio di risorse da utilizzare a runtime (ad esempio un'immagine in formato xpm),
- Impostazioni e parametri di configurazione.
L'ultima voce è talvolta considerata un male, perché si irrigidisce la struttura del programma (hard coding).
In ogni caso, quando si è costretti ad utilizzare un array statico, ci si deve comportare in due modi:
- Si inserisce nel codice una variabile/costante/macro che indica la grandezza dell'array
- Si utilizza sizeof
per non dover andare in giro per il codice a modificare i valori che si riferiscono alla dimensione dell'array.
Spero di essere stato chiaro