PDA

Visualizza la versione completa : [C] Ordinamento vettore tramite funzione senza passarlo come parametro


delghi
04-09-2014, 03:12
Ciao a tutti nel risolvere questo esercizio mi è venuto un dubbio: (posto il testo)
Si scriva un programma C che svolge il compito illustrato nel seguito e il cui codice sorgente sia suddiviso in due distinti file sorgenti. Il compito del programma è ordinare un array di elementi di tipo unsigned chiamato "dati_comuni" e successivamente stamparne il contenuto, un valore su ciascuna riga. Il primo dei due file sorgente deve contenere l'array e la funzione main. Il secondo file sorgente deve contenere la funzione di ordinamento, che deve rispettare il prototipo seguente:
void ordina_dati(void);

Tralasciando il fatto che non ho diviso il codice in due file sorgente volevo provare a scrivere la funzione di ordinamento. Ragionando però non capisco proprio come una funzione che non accetta nessun parametro possa ordinare un array. :dhò::dhò::dhò: è sbagliato il testo dell'esercizio? Oppure c'è qualcosa che non so? il prototipo non dovrebbe essere del tipo " void ordina_dati(unsigned array[])"???

Vi posto anche quello che ho provato a scrivere..però non funziona, cioè mi ristampa l'array senza ordinarlo:(
Maledetto C!
Grazie in anticipo! Help me!





#define LEN 10
#include <stdio.h>




void ordina_dati(void);
int main(void)
{
unsigned dati_comuni[LEN]={56,3,4,7,1,5,0};
ordina_dati();
int i;
for (i=0; i<LEN; i++)



printf("%u\n",dati_comuni[i]);





return 0;
}


void ordina_dati(void){
int i,j,min,temp;
unsigned vet[LEN];


for(i=0; i<LEN-1; i++)
{
min = i;

for(j=i+1; j<LEN; j++)
if(vet[j] < vet[min])
min = j;

temp=vet[min];
vet[min]=vet[i];
vet[i]=temp;
}





}

torn24
04-09-2014, 06:35
Il linguaggio C permette l'uso di variabili globali, la soluzione al tuo problema è dichiarare l'array all'esterno della funzione main, e quindi di renderlo globale, visibile cioè a tutte le funzioni .

Se la funzione dovrai inserirla in un altro file sorgente, in quel file dovrai dichiarare,





extern unsigned int array[];



in modo da dire al compilatore che l'array usato è dichiarato in un altro file.

delghi
04-09-2014, 18:09
Grazie della risposta!
Ho provato a fare così ma ancora non riesco a risolvere, posto il codice.
Questo è il file "main.c"


#include "funzione.c"
#include <stdio.h>








unsigned dati_comuni[]={2,5,7,1,65,34,8,10};
int main(void)
{

ordina_dati();


for (int i=0; i<sizeof(dati_comuni)/sizeof(dati_comuni[0]); i++) {
printf("elemento %d vale %d\n",i,dati_comuni[i]);
}

return 0;
}



Questo invece è il file che ho chiamato "funzione.c". Il compilatore mi segnala errore quando provo a calcolarmi la lunghezza dell'array tramite operatore sizeof. Come posso fare per sapere la lunghezza di un array che è stato dichiarato in un altro file??


#include <stdio.h>
#include <string.h>






void ordina_dati(void){
int i,j,min,temp,len;

extern unsigned int dati_comuni[];


len=sizeof(dati_comuni)/sizeof(dati_comuni[0]);

for(i=0; i<len-1; i++)
{
min = i;

for(j=i+1; j<len; j++)
if(dati_comuni[j] < dati_comuni[min])
min = j;

temp=dati_comuni[min];
dati_comuni[min]=dati_comuni[i];
dati_comuni[i]=temp;
}

}

torn24
04-09-2014, 18:37
Non ho mai usato sizeof su un elemento di un array, non so se sia possibile.

Ho provato è corretto il tuo modo di usare sizeof(), spiacente ma non capisco quale sia il problema, prova a postare il messaggio
dato dal compilatore, cosi agevolerai eventuali risposte.

delghi
04-09-2014, 18:58
quindi potresti provare a dichiarare esplicitamente,codice:
unsigned int dati_comuni[]={2,5,7,1,65,34,8,10};
in quanto non so se int sia di default.

Non ho capito bene cosa intendi per dichiarare esplicitamente. Dici nella funzione o nel main?
Inoltre provando a fare come dici tu mi segnala il seguente errore nella funzione:
"invalid application of sizeof to an incomplete type unsigned int [] "

delghi
04-09-2014, 19:15
Allora il problema è questo: io scrivo il main in un file chiamato 'main.c' e mi dichiaro il mio array senza la parola extern giusto?


unsigned int dati_comuni[]={2,5,7,1,65,34,8,10};

Poi creo un nuovo file e lo chiamo 'funzione.c', qui mi dichiaro il mio array che deve essere esterno e scrivo la funzione di ordinamento.
Il problema è: come faccio a far capire alla funzione che la dimensione dell array la deve "prendere" dal main dove questo è stato dichiarato e inizializzato? Devo includere il file come ho fatto nel main? (ovvero #include "funzione.c") (#include "main.c")


extern unsigned int dati_comuni[];

Xaratroom
04-09-2014, 19:16
quindi potresti provare a dichiarare esplicitamente,codice:
unsigned int dati_comuni[]={2,5,7,1,65,34,8,10};
in quanto non so se int sia di default.

Non ho capito bene cosa intendi per dichiarare esplicitamente. Dici nella funzione o nel main?
Inoltre provando a fare come dici tu mi segnala il seguente errore nella funzione:
"invalid application of sizeof to an incomplete type unsigned int [] "
Se definisci un array statico prima di utilizzare sizeof, allora il compilatore sostituisce, alla macro sizeof, il numero degli elementi presenti nell'array. Non vale lo stesso discorso se ti trovi in un file diverso, quindi devi specificare la dimensione dell'array.

extern unsigned int dati_comuni[8];

In ogni caso l'utilizzo di sizeof sugli array, e la definizione di array globali, potrebbe non funzionare correttamente (e in egual modo) su tutti i compilatori.

Alex'87
05-09-2014, 09:52
Grazie della risposta!


#include <stdio.h>
#include <string.h>

void ordina_dati(void){
int i,j,min,temp,len;

extern unsigned int dati_comuni[];



Sbaglio o l'extern va usato FUORI da una funzione? :confused:
(è un po' che non tocco C)

Xaratroom
05-09-2014, 09:56
Sbaglio o l'extern va usato FUORI da una funzione? :confused:
(è un po' che non tocco C)
No, in C lo puoi usare dove ti pare. Ovviamente, in questo caso, la visibilità è locale.

Alex'87
05-09-2014, 10:05
No, in C lo puoi usare dove ti pare. Ovviamente, in questo caso, la visibilità è locale.

Grazie, stavo comunque googlando per curiosità :)

Ho trovato questo: http://stackoverflow.com/questions/3421465/how-to-correctly-write-declarations-of-extern-arrays-and-double-arrays-in-cs
Magari è utile all'autore del thread ;)

Loading