Newsgroup: it.comp.lang.c
Titolo: aiuto, problema con struct{}

    printf("\nSize    of strucx: %i %i", max_rec, tab_size);
se qualcuno mi puo' aiutare lo ringrazio in anticipo
saluti
Davide

    framegen[0].str=malloc((int)framegen[0].dim*sizeof(char));
 
Se hai intenzione di usare il membro str come stringa
devi allocare un carattere in piu' per str, quindi dim+1.
Scrivere sizeof(char) non serve, un char ha dimensione 1 byte 
sotto tutti i sistemi.
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 sotto tutti i sistemi.
infatti avevo un dubbio, in molti programmi che ho trovato su internet
ho notato che lo mettono.
ammetto di aver fatto molti errori,
grazie per avermi risposto.
Ciao
Davide

e perchè nella funzione no?
Perche' nella funzione main() il vettore conserva la sua
natura di vettore.  Nel momento in cui passi il vettore a
una funzione, decade nel puntatore al suo primo elemento e
viene trattato a tutti gli effetti come puntatore,
all'interno della funzione.  Quando hai un puntatore, non
riesci a sapere quanta memoria c'e' allocata dietro.

all'interno della funzione MOD_RECORD?
   Spero che, messa cosi`, possa tornart piu` utile:
   sizeof() non e` una vera funzione: viene analizzata e sostituita
durante la compilazione. In pratica, l'istruzione "tab_size =
sizeof(tabella);" viene sostituita dal compilatore con "tab_size =
4;", oppure con "tab_size = 18;", o qualunque altro valore.
   L'esatto valore numerico dipende dalla architettura sulla quale
compili. Comunque a runtime non verrra` chiamata nessuna funzione, ma
verra direttamente inserito un valore numerico in "tab_size", nel tuo
caso la dimensione di "struct record *", molto probabilmente 4, se sei
fortunato 8. :)
   Se analizzi la documentazione di alcune funzioni di libreria
standard (per esempio "fgets()"), noterai che deve essere il chiamante
a indicare quanto e` grande il buffer. Questo perche` non esiste un
modo per ottenere quella informazione. Solo chi ha chiamato "malloc",
"calloc", ecc. puo` sapere quanto spazio ha richiesto.
-- 
Totuccio.

Grazie a tutti per le vs risposte,
mi sono state di molto aiuto per mettere a punto la mia idea.
(Riassunto dei miei post)
Devo creare e gestire un semplice Database con una o piu' tabelle di record.
Per ottenere la massima velocita' possibile ho deciso di caricare la tabelle (da file)
in memoria tramite un array di struct{} per ogni tabella.
Ogni tabella puo' avere un numero di record che puo' arrivare anche a 10.000.
Ogni tabella quando necessario viene incrementata dinamicamente di 256 puntatori alla volta.
Ogni record viene allocato dinamicamente con 256byte e quando necessario si incrementa di 256byte.
Ogni record contiene una lista di campi (token) sottoforma di una normale stringa che
puo' essere piu' piccola o uguale alla dimensione del record fisico.
Ho creato una funzione per modificare il record (N).
A questa funzione passo il puntatore della tabella che mi interessa modificare.
Il problema era che non riuscivo con sizeof a calcolare all'interno della
funzione il numero di record, ma adesso ho trovato la soluzione!,
andro' a memorizzare nel record[0] tutte le informazioni della tabella e il gioco è fatto!
in questo caso il record[0].dim conterra' il numero di record + altre info.,
in tutti gli altri casi il record[x].dim conterra' il numero effettivo di caratteri della stringa
memorizzata all'interno del record!
Un po' di conti, per esempio:
una tabella con 10000 record occupa come minimo:
puntatori (10000*8)+
records(10000*256)= 2.560.000+80000 = circa 2,6 Mbyte
Niente male come spreco, che ne pensate?
saluti
Davide

   sizeof() non e` una vera funzione
sizeof e' un operatore.

sizeof e' un operatore.
   Corretto. Pero` mi era sembrato di capire che Davide si aspettasse
di poterla usare come una funzione, che di volta in volta potesse
restituirgli un valore diverso, a seconda del contenuto del puntatore
"tabella". Ecco perche` mi sono espresso cosi`.
-- 
Totuccio.