Newsgroup: it.comp.lang.c
Titolo: file header... questi sconosciuti!

ciao a tutti, ho qualche problemino con i file header. Allora ho un
programmino fatto in questo modo:
****************main.c**************
#include <stdio.h>
#include "utilVett.h"
#include "mergesort.h"
main () {
    TipoVettore v;
    initVettore(v);
    stampaVettore(v);
    mergesort(v);
    stampaVettore(v);
}
***********************************
***********mergesort.h***************
#include <stdio.h>
#include "utilVett.h"
void mergesort(TipoVettore);
***********************************
***********mergesort.c***************
#include <stdio.h>
#include "mergesort.h"
...
...
...
void mergesort(TipoVettore vet)
{
...
}
***********************************
***************utilVett.h*************
#include <stdio.h>
#define NUM_ELEMENTI 10
typedef  int  TipoElemVettore;
typedef  TipoElemVettore  TipoVettore[NUM_ELEMENTI];
void initVettore(TipoElemVettore*);
void stampaVettore(TipoElemVettore*);
***********************************
************utilVett.c****************
#include <stdio.h>
#include "utilVett.h"
...
...
...
void initVettore(TipoElemVettore *vet)
{
...
}
void stampaVettore(TipoElemVettore *vet)
{
...
}
***********************************
il mio bel programmino è strutturato in questo modo. Logicamente ho pensato
di includere utilVett.h in tutti quei moduli che ne facevano uso, ma il pb è
nel main, dove includo sia utilVett.h sia mergesort.h(al cui interno già
c'era un include a utilVett.h); mi da così errore dicendo che non è corretto
ridefinire i tipi in quel modo. Se levo però l'include a utilVett.h
all'interno del main, allora non c'è pb e compila... ma io voglio includelro
lo stesso perchè lo trovo più giusto... Qualche idea???
Ciao.

 Ciao.
Ciao
Matic

 Matic
grazie; ora ho risolto quel problema, ma ne spunta un altro: il linking.
Hoprovato a linkaretutto con gcc facendo gcc -o main main.o mergesort.o
utilVett.o
Sembra andare tutto ok, lancio il programma, inserisco l'array da
tastiera(con la funzione initVettore); finito di inserire un bel
segmentation fault. Dipende forse dal modo in cui ho passato il parametro
(un puntatore a TipoElemVettore), oppure al fatto che utilizzando una
variabile int i come contatore di un ciclo for io non l'abbia
inizializzata??? Lo so che è una domanda da un milione di dollari, ma java
ad esempio si incazzava se non inizializzavi tutto quello che dovevi usare.
Ciao

 Ciao
Ciao
Matic

 scanf( "%d", &vett[i] );
**********utilVett.c**********
...
...
void initVettore(TipoVettore v)
{
    int i;
    for ( i = 0;  i < NUM_ELEMENTI; i++ ) {
        printf("inserisci il %d : ",i);
        scanf("%d",&v[i]);
    }
}
...
...
...
***************************
come  vedi l'inserimento è giusto. Il Segmentation fault ho notato che lo da
quando invoco
mergeSort(TipoVettore) nel main. Il vettore viene inizializzato da tastiera,
stampato, ma non viene ordinato. Non è che c'è qualche problema con la
visibilità della costante NUM_ELEMENTI? O magari il pb potrebbe essere un
altro. Per completezza allego un'arricchimento del codice che ho inviato
prima.
**********mergesort.c**********
#include <stdio.h>
#include "utilVett.h"
#include "mergesort.h"
...
...
void MergeSortRic( TipoVettoreA, int iniziale, int finale ) {
...
...
}
...
...
void mergeSort( TipoVettore v ) {
    MergeSortRic( v, 0, NUM_ELEMENTI );
}
***********************************
****************main.c**************
#include <stdio.h>
#include "utilVett.h"
#include "mergesort.h"
main () {
    TipoVettore v;
    initVettore(v);
    stampaVettore(v);
    mergesort(v);        <-------credo sia qst il punto
    stampaVettore(v);
}
***********************************
Ciao

 Ciao
Ciao
M.

io pensavo che invocando mergeSortRic(v,0, NUM_ELEMENTI) con NUM_ELEMENTI
come costante definita altrove, il pb potesse dipendere proprio dalla
costante. Quella costante infatti sarebbe stata usata nell'invocazione come
int. Non so se mi sono spiegato... ho provato anche ad assegnare la costante
a una varibile int e passargli poi questa variabile nell'invocazione di
mergeSortRic, ma nulla di fatto.
Non so dove sbattere la testa.

 Non so dove sbattere la testa.
Posta il codice di mergeSortRic().

 Posta il codice di mergeSortRic().
void MergeSortRic ( TipoVettore A, int iniziale, int finale )
{
    int mediano;
    if (iniziale < finale) {
        mediano = (iniziale + finale) / 2;
        MergeSortRic(A, iniziale, mediano);
        MergeSortRic(A, mediano+1, finale);
        Merge(A, iniziale, mediano, finale);
    }
}