Newsgroup: it.comp.lang.c
Titolo: vi chiedo aiuto.. sto impazzendo.. :)

COMPILO E QUESTI SONO I WARNING (con seg fault quando provo a lanciare 
./a.out)
gcc data.c
data.c:30: warning: type mismatch with previous implicit declaration
data.c:14: warning: previous implicit declaration of `inserisci'
data.c:30: warning: `inserisci' was previously implicitly declared to return 
`int'
______________________
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {
  char **arr ;
  int dim = 0 ;
  arr = (char **) inserisci(arr, &dim, "/mnt/hd") ;   <-- RIGA 14
  return 0 ;
}
char **inserisci(char **arr, int *dim, char *path) {   <-- RIGA 30
  int new_dim = *dim + 1 ;
  char **tmp = realloc(arr, (new_dim)*sizeof(char*)) ;
  tmp[*dim] = strdup(path) ;
  return tmp ;
}

 
La prima volta che il compilatore vede "inserisci" a riga 14 non ha idea 
di cosa ritorni, cosi' assume che sia un int.
A riga 30, pero', gli tiri un brutto scherzo e gli fai tornare un (char **).
Ecco il motivo dei warning. Sono solo dei warning perchè, tutto sommato, 
il tuo programma funzionerebbe pure (agli effetti pratici un char ** 
"entra" in un int, anche se un purista del C, giustamente, inorridirebbe).
Il motivo del segfault è, probabilmente, che quando esegui la realloc, 
arr ha un valore non specificato. Prova ad inizializzarlo a NULL nel main.
Infine una domanda, perche' passi dim per variabile e poi non ne 
aggiorni il valore? O fai *dim = *dim +1 dentro la inserisci, oppure fai 
dim = dim +1 nel main (e a quel punto passi dim per valore!).
R.
P.S. non ho controllato se ci sono altri problemi, prova a corregere e 
vediamo ....

ho corretto la funzione "inserisci" coprendo anche il caso di array vuoto...
ma l'errore e' rimasto:
gcc data.c
data.c:30: warning: type mismatch with previous implicit declaration
data.c:14: warning: previous implicit declaration of `inserisci'
data.c:30: warning: `inserisci' was previously implicitly declared to return 
`int'
______________________-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {
  char **arr ;
  int dim = 0 ;
  arr = (char **) inserisci(arr, &dim, "/mnt/hd") ;   <-- RIGA 14
  return 0 ;
}
char **inserisci(char **arr, int *dim, char *path) {   <-- RIGA 30
 int new_dim = *dim + 1 ;
  if (*dim == 0) {
    char **tmp = malloc(new_dim*sizeof(char *)) ;
    tmp[0] = strdup(path) ;
    return tmp ;
  }
  else {
    char **tmp = realloc(arr, (new_dim)*sizeof(char*)) ;
    tmp[*dim] = strdup(path) ;
    *dim = new_dim ;
    return tmp ;
  }
} 


grande! grazie mille! m'ero scordato di mettere i prototipi!! (ad essere 
precisi mi son scordato di includere "data.c", era li' che avevo i 
prototipi!)
ora vedo se riesco a farlo andare :)
grazie ancora! 

forse se inserisci il prototipo della funzione risolvi...

 ora vedo se riesco a farlo andare :)
Ricordati che realloc(NULL, ...) equivale ad una malloc(), non hai 
bisogno di trattare a parte il caso dim == 0.


se inizializzo char **arr = NULL posso usare la tua versione che usa sempre 
realloc anche quando e' a dimensione zero (se non inizializzo a NULL con la 
tua da seg fault)
se uso la mia che copre il caso zero senza usare realloc, posso non serve 
inizializzare a NULL
Ma immagino che formalmente sia piu' giusto come la intendi tu.
Grazie mille (anche a VinX) per l'aiuto e la pazienza! 

prototipi!)
I prototipi sono tra le cose che dovrebbero risiedere in un file
header.  I file .c non devono mai essere inclusi mediante direttiva
del preprocessore, ma compilati separatamente.  Gli unici file
sottoposti ad #inclusione sono i file header.