Newsgroup: it.comp.lang.c
Titolo: Problema con il mergesort

Ciao, stavo implementando il merge sort per esercizio ad un esame
all'untiversità. Mi dà un errore di segmentation fault. premetto che
avendo già programmato in c++ (che mi sembra molto più semplice), ho
capito che dovrebbe essere un problema di puntatori e/o array, vi
posto la parte di codice:
void StampaArray(int array[]) {
        int i;
        for (i=0; i<length(array); i++)
             printf("%d",array[i]);
        printf("\n");
}
int main(void) {
         int i,lungh;
         int array[lungh];
         printf("Inserisci lunghezza: ");
         scanf("%d",&lungh);
         for (i=0, i<length(array); i++) {
             print("Inserisci il prossimo elemento: ");
             scanf("%d",array[i]);
         }
         i=length(array);
         StampaArray(array);
         MergeSort(array, i);
         StampaArray(array);
}
ho definito all'inizio, come mi è stato suggerito per determinare la
lunghezza di un aray:
#define length(array) (sizeof(array))/(sizeof(int))
Mi esegue l'inizializzazione dell'array, ma mi stampa solo il primo
elemento dell'array e mi dà segmentation fault. Perchè?
Poi un'altra curiosità: se la lunghezza di un int è di 2Byte perchè se
definisco un array di 5 int e faccio sizeof mi dà 20?
Un'ultimissima cosa, forse OT: Come si vedono in Linux tutte le
funzioni implementate dall STL?
Ciao Napoleone

 #define length(array) (sizeof(array))/(sizeof(int))
Quindi qui sizeof(array) non e' piu' la lunghezza (in byte) dell'array, ma 
solo la dimensione del puntatore al primo elemento (diciamo 4), che diviso 
per la dimensione di un intero (diciamo 4) otterrai un bellissimo 1 :)
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 definisco un array di 5 int e faccio sizeof mi dà 20?
In C sizeof() ritorna la dimensione in byte (1 byte = 1 char per 
definizione, ed e' almeno di 8 bit) della variabile.
Applicata ad un array ritorna la dimensione in byte quindi... se e' un array 
di char hai gia' il numero di elementi, in caso contrario devi appunto 
dividere per sizeof(tipo_dell'array).


 definisco un array di 5 int e faccio sizeof mi dà 20?
Un intero ha dimensione sizeof(int). int ha la dimensione di una word della 
CPU (supportata dal compilatore). I compilatori per DOS ad esempio avevano 
la int pari a 2 byte, mentre in Linux (i386) int é pari a 4 byte.
-- 
Remove _NOTRASH to answer me!

 per la dimensione di un intero (diciamo 4) otterrai un bellissimo 1 :)
Ok, allora come faccio a definire una macro che calcola la lunghezza
di un array?
Ciao

 
Sai com'è, sono abituato al C++, ad un pò di java e (non centra nulla Assembler)


 Scusa l'ignoranza: cosa fa %i?
Serve a stamapre un intero su stdout.
[CUT]

 di un array?
In linea di massima non puoi perche' diventa un semplice puntatore, ma:
- puoi passare un parametro addizionale contenente la dimensione dell'array 
  (scelta che va' per la maggiore)
- puoi utilizzare un elemento sentinella al fondo dell'array (come il '\0' 
  per le stringhe), ma difficilmente funziona con interi e numeri in virgola 
  mobile, visto che tutti i valori rappresentabili sono se vogliamo validi 
  (scelta infatti usata solo per le strutture, le stringhe appunto e in 
  alcuni casi i puntatori)
- incapsuli tutto in una struttura (che alla funzione attraverso un 
  puntatore) e in uno dei campi di questa ci segni la dimensione dell'array
  (utile quando la struttura e' complessa, non un semplice array, ma nulla 
  ti vieta di farlo)


 E' questo il punto, non volevo usare malloc e free.
xche'? Allora piuttosto fai:
#define MAXSIZE   100
int main(int argc, char * argv[])
{
   int array[MAXSIZE];
   etc. etc.
