Newsgroup: it.comp.programmare.win32
Titolo: Win32 Console e ANSI C

Ho provato a compilare per la console di Windows un programmino ANSI C, che
sotto DOS funzionava benissimo, ma ho un problema:
una funzione deve leggere delle stringhe da un file, allocando dinamicamente
un array di stringhe(ogni stringa letta, alloca lo spazio per contenerla, e
ingrandisce l'array di puntatori a char, con realloc(), usato anche per
creare l'array..., facendo puntare il nuovo elemento alla stringa appena
allocata). Il problema, è che non c'è mai memoria disponibile, quindi il
programma termina subito.
Mica sotto WinConsole c'è qualche differenza nelle funzioni di gestione dei
files o in quelle di allocazione della memoria?
Ah, dimenticavo, l'ho compilato con VC++ 6, senza modificare le opzioni di
progetto. (il bello è che lasciando le configurazioni di debug succede ciò,
mentre impostando per la relase il programma causa un errore...)
Se volete, comunque, posto il codice della funzione incriminata.
Grazie
--
Marco Iannaccone
marc...@tin.it
Nick: Tolkien
ICQ UIN: 18748121
"This is a new ship, boy, but she's got the right name...
You treat her like a lady, and she'll always bring you home"
"Questa è una nave moderna, ma ha un nome antico e glorioso...
Trattala come una signora e ti riporterà sempre a casa"
FAQ di it.comp.lang.c:
http://www.programmazione.it/linguaggi/c/itcomplangc.htm

 files o in quelle di allocazione della memoria?
Non direi, ho usato spesso alloc(), free() e realloc() in programmi
console. Chiamano direttamente le funzioni Win32 per lo heap, ossia
HeapAlloc(), HeapFree() ed HeapReAlloc(). Prova a postare uno
spezzoncino di codice...
---
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/

Questa è la funzione che legge stringhe da un file, mettendole in un array
dinamico di stringhe:
char **load_words(const char *file_open, int *n_parole)
{
char **str_point=NULL; /* puntatore all'array di stringhe */
char stringa[30]; /* stringa d'appoggio */
FILE *file_in;
char *point_stringa=NULL; /* puntera' di volta in volta alla nuova stringa
allocata */
 if( (file_in=fopen(file_open, "r"))==NULL){
     printf("File %s non trovato!\n", file_open);
     exit(0);
 }
 while(fscanf(file_in, "%s", stringa)!=EOF){
     ++*n_parole;
     /* viene allocato spazio per contenere la stringa appena letta */
     if( (point_stringa=(char
*)malloc((strlen(stringa)+1)*sizeof(char)))==NULL )
          no_mem_err(); /* messaggio d'errore in caso di memoria
insufficiente */
      strcpy(point_stringa, stringa); /* la stringa letta viene copiata
                                      * nell'array appena allocato */
     if( (str_point=(char **)realloc(str_point, *n_parole*sizeof(char
*) ))==NULL)
          no_mem_err();
           /* usando realloc, si fa in modo che la prima volta (str_point
punta
            * a NULL) venga allocato lo spazio, e in seguito ingrandito */
     *(str_point+*n_parole-1)=point_stringa;
             /* viene fatto puntare l'attuale elemento dell'array di
              * puntatori str_point (quello appena aggiunto), alla stringa
              * appena allocata (str_point[*n_parole-1]=point_stringa) */
 } /* fine while */
 fclose(file_in);
return(str_point);


 ++*n_parole;
Era sfuggito anche a me, ma e` bastato un debug per scoprire l'errore:
non hai inizializzato *n_parole, che quindi puo` contenere anche un
numero enorme (e quindi non allocabile).


Mamma che errore da principiante....!
Grazie mille, comunque! :-)
