Newsgroup: it.comp.lang.c++
Titolo: Riallocazione dinamica

Salve!
    Sono nuovissimo al C++, ma conosco il C. Dite un po':
struct struttura {
    int a;
    char b[];        (*)
};
struttura *dato = new(struttura);
VC++ mi da', alla riga (*) uno warning del tipo "nonstandard extension used
: zero-sized array in struct/union". Ossia non e' portabile? Come posso
fare?
Inoltre, come posso aumentare la dimensione della mia struttura?
dato = (struttura*)realloc(dato, dim);
e' portabile? O sarebbe meglio/piu' pulito/coerente usare "malloc" al posto
di "new"?
Per favore non parlatemi di classi/costruttori/distruttori/cattivoni perche'
per ora preferirei non usarli.
Grazie!
Saluti,
    Mardy

 per ora preferirei non usarli.
...appunto usare queste cose che non vuoi usare (e specificamente
un std::vector, o una std::string secondo le tue esigenze!).
Se non vuoi usare il C++, perche` non scrivi invece in C, e quindi
poni le due domande su it.comp.lang.c?
Alex


Mescolare new con realloc sugli stessi puntatori non e' certamente una cosa buona.
Sarebbe meglio usare new/delete oppure malloc/realloc/free.
Prima di chiedere "Come posso fare ?" pero' e' importante chiedersi "Cosa voglio fare ?".
Da quanto ho capito vuoi fare una struttura a dimensione variabile, dove il primo campo e' un int
(suppongo sia la lunghezza totale della struttura (-sizeof(a) forse ?))
Questa cosa in c e' accettabile (realizzandola mediante malloc/realloc/free),
magari mettendo char b[1] per evitare warning ("sprecando" pero' 1 byte nel caso la lunghezza debba essere 0).
In una corretta programmazione in c++, invece e' una cosa veramente terribile, e da evitare.
(ovviamente essendo il c++ compatibile con il c si puo' ugualmente fare)
In particolare new alloca uno (il caso zero non e' sicuro) o piu' oggetti tutti della stessa dimensione.
E in corrispondenza delete li cancella.
Il programma andrebbe fatto piu' o meno cosi':
struct struttura
{
 size_t a;
 char * b;
};
void F_alloc(struttura & s, size_t n)
{
 s.a = n;
 s.b = malloc(n);
};
void F_realloc(struttura & s, size_t n)
{
 s.a = n;
 s.b = realloc(s.b,n);
};
void F_free(struttura & s)
{
 s.a = 0;
 free(s.b);
};
L'uso di new/delete in qusto caso non e' consigliabile (se' e' necessaria la riallocazione).
[ P.S.
Ovviamente con le classi si possono inserire le F_??? nella struct (che e' diventata classe),
evitando di passare ogni volta il parametro "struttura & s".
Con i costruttori e i distruttori potresti anche fare in modo
di inizializzare automaticamante a e b (ragionevolmente a 0),
e di deallocare con free la memoria allocata,
automaticamente insieme all'oggetto struttura.
]

 di "new"?
Non puoi variare la dimensione della struttura dato che questa è fissata
a compile-time grazie alla sua dichiarazione (tieni sempre presente che
la tua è incompleta). Forse il tuo intento era quello di utilizzare un
char *b e non un char b[]. In quel caso devi allocare memoria anche per
il membro b con qualcosa come
dato.b = new char [ nn ];
dove nn è la dimensione che ti serve. Ancora meglio sarebbe di
utilizzare il tipo std::string:
struct struttura {
    int a;
    std::string b;
};
e lasciare che sia esso a risolvere internamente tutti i problemi di
allocazione/deallocazione. Come ulteriore alternativa può darsi che,
invece, a te serva una lista (o altra struttura dinamica) avente come
record la tua struttura. Allora devi aggiungere ad essa un puntatore
allo stesso tipo e... ma questo lo trovi più volte in messaggi vecchi di
questo newsgroup.
EMG

oi continuare a usare il C.
 
 
 

Alex
Saluti,
    Mardy