Newsgroup: it.comp.lang.c
Titolo: allocazione dinamica matrici e vettori

Ecco il mio problema devo leggere da un file di testo ,parti di dati di 15
caratteri ogni parte la devo memorizzare in un vettore, pero non so quanto è
lungo il file e dovrei allocare dinamicamente una struttura (che può essere
una matrice) in cui ho un vettore di puntatori che mi puntano a le stringhe
di lunghezza 15. pero questo vettore di puntatori non posso sapere quanto è
lungo perchè dipende dalla lunghezza del file, quindi dovrei allocarlo
dinamicamente una volta letto il file. Qualcuno sa dirmi come posso fare?
Vi ringrazio per la disponibilità.
Stefano
meo...@libero.it

 dinamicamente una volta letto il file. Qualcuno sa dirmi come posso fare?
Devi usare una struttura dati dinamica, che si allarghi ogni volta che
inserisci un nuovo dato, ad esempio una lista:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct SLNode {
 char str[20];
 struct SLNode* next;
} SLNode;
typedef struct SL {
 SLNode *head;
 SLNode *tail;
} SL;
void initSL(SL *sl, const char *str) {
 sl->head = (SLNode*)malloc(sizeof(SLNode));
 strcpy(sl->head->str, str);
 sl->head->next = NULL;
 sl->tail = sl->head;
}
void addSL(SL *sl, const char *str) {
 sl->tail->next = (SLNode*)malloc(sizeof(SLNode));
 sl->tail = sl->tail->next;
 sl->tail->next = NULL;
 strcpy(sl->tail->str, str);
}
void printSL(SL *sl) {
 SLNode *cur = sl->head;
 do {
  printf("%s\n", cur->str);
  cur = cur->next;
 }while(cur != NULL);
}
void destroySL(SL *sl) {
 SLNode *cur = sl->head;
 do {
  SLNode *tmp = cur->next;
  free(cur);
  cur = tmp;
 } while (cur != NULL);
}
int main() {
 SL sl;
 initSL(&sl, "ciao");
 addSL(&sl, "come");
 addSL(&sl, "va");
 printSL(&sl);
 destroySL(&sl);
}
La struttura dati però è da scegliere a seconda delle esigenze.
Ciao


Si usa la funzione realloc che riassegna memoria ad un puntatore per cui
della memoria e' gia' stata allocata in precedenza.
       void *realloc(void *ptr, size_t size);
       realloc()  changes  the  size  of the memory block pointed to by ptr
to
       size bytes.  The contents will be unchanged to the minimum of  the
old
       and new sizes; newly allocated memory will be uninitialized.  If ptr
is
       NULL, the call is equivalent to malloc(size); if size is equal to
zero,
       the  call is equivalent to free(ptr).  Unless ptr is NULL, it must
have
       been returned by an earlier call to malloc(), calloc() or realloc().
RETURN VALUE
       realloc() returns a pointer to the newly  allocated  memory,  which
is
       suitably  aligned  for  any  kind of variable and may be different
from
       ptr, or NULL if the request fails. If size was equal to 0, either
NULL
       or a pointer suitable to be passed to free() is returned.  If
realloc()
       fails the original block is left untouched - it is not freed or
moved.
Ciao,
Ema

 dinamicamente una volta letto il file. Qualcuno sa dirmi come posso fare?
Quanto e' grande il file? Una dimensione ragionevole (diciamo sotto i
100 Mega)? Hai un S.O. con memoria virtuale?
Una soluzione rapida (e schifosa) e' leggere al dimensione del file
(come farlo dipende dal S.O., stat() in genere funziona se il S.O. ha
una qualche compatibilita' POSIX) e preallocare uno spazio sufficiente
a contenere tutti i dati del file...
Se devi leggere tutto il file non sprechi niente, se devi leggerne solo
una parte, recuperi tutto all'uscita del programma.
Spero che la soluzione non scandalizzi nessuno :-)
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG