Oppure

Loading
01/09/11 13:05
drewnik99
Devo dichiarare un array di strurre vuoto e poi nel corso del programma riallocare la memoria per l'array ogni volta che vi aggiungo una struttura. Prima però devo utilizzare malloc? La dichiarazione è corretta?

struct comp pa[0], *ppa = pa;



Se utilizzo malloc, il compilatore restituisce un errore.

pa = malloc(sizeof(struct comp));


Qualche suggerimento? Grazie mille in anticipo per qualsialsi risposta.
aaa
01/09/11 13:45
comina8
Allora...array di strutture vuol dire puntatore ad una cella di memoria che conterrà via via tutte gli elementi dell'array...

struct ciao array[0];


vuol dire dichiarare un array vuoto non più modificabile.

struct ciao *array;


Vuol dire dichiarare un puntatore che, se inizializzato allocando l'apposita memoria, costituirà un array (o altro ma in questo caso non ci interessa).

Quindi:

struct ciao *array;
array=(struct ciao*)malloc(NumeroElementiArray*sizeof(struct ciao));
array[0].elementoStruttura=qualcosa;
... //etc etc...


Una volta dichiarato un puntatore lo puoi allocare dove vuoi e quando ti serve, ricordati solo di liberare la memoria quando non la usi più:

free(array);
aaa
01/09/11 14:06
drewnik99
Posto tutta la funzione:

struct comp *comps = 0;
struct comp *ccompx(const char name[])
{
struct comp *p;
struct comp *pa;
glob = 0;
pa = (struct comp*) malloc(sizeof(struct comp));
if(!pa)
{
    puts("Ricerca interrotta.");
    return 0;
}
int s;
for(p = comps, s = 1; p; p = p->n, s++)
{
    int i = 0;
for(; name[i] != p->name[i]; i++);
if(p && name[i] == p->name[i])
{
    int a = 1;
    for(; name[i + a] == p->name[i + a]; a++);
    if(a == strlen(name))
    {
        pa[s - 1] = p; // errore
        glob++;
        realloc(pa, sizeof(struct comp) * s + 1);
        if(!pa)
        {
            puts("Ricerca non completata.")
            goto ret;
        }
    }
    return 0;
}
}
ret:
return pa;
}


Qual è l'errore in quell'assegnamento?
Ultima modifica effettuata da drewnik99 01/09/11 17:31
aaa
01/09/11 15:46
comina8
La variabile "ppa" non la usi da nessuna parte quindi puoi dichiarare solo "pa" assegnandole poi il ritorno della funzione malloc...

Inoltre non vedo nessuna free e nella funzione realloc devi passare "pa" non "*pa".

p non lo inizializzi (non usi la malloc).

Probabilmente il programma ti va in crash...
aaa
01/09/11 17:00
drewnik99
*ppa serve, perchè se il programma non riesce a riallocare la memoria, realloc restituisce un puntatore nullo e occorre un altro puntatore perchè la funzione restituisca la struttura.
L'errore lo restituisce il compilatore, durante la compilazione, non in esecuzione.
Perchè dovrei inizzializzare p con malloc?
aaa
01/09/11 17:18
comina8
Postato originariamente da drewnik99:

*ppa serve, perchè se il programma non riesce a riallocare la memoria, realloc restituisce un puntatore nullo e occorre un altro puntatore perchè la funzione restituisca la struttura.
L'errore lo restituisce il compilatore, durante la compilazione, non in esecuzione.
Perchè dovrei inizzializzare p con malloc?


Perché dichiari un puntatore nullo e pretendi che punti a delle celle di memoria...
Ma che errore ti dà il compilatore che facciamo prima...
aaa
01/09/11 17:22
drewnik99
Errore: incompatible types when assigning to type 'struct comp' from type 'struct comp *'|
Ultima modifica effettuata da drewnik99 01/09/11 17:35
aaa
01/09/11 22:43
drewnik99
Ho apportato le seguenti modifiche:

struct comp *p = (struct comp*)malloc(sizeof(struct comp));
    if(!p)
    {
        //
    }
    struct comp **pv = 0;
    struct comp ***point;
    int s;
    for(p = comps, s = 1; p; p = p->n, s++)
    {
        unsigned int i = 0;
        for(; name[i] != p->name[i]; i++);
        if(p && name[i] == p->name[i])
        {
            unsigned int a = 1;
            for(; name[i + a] == p->name[i + a]; a++);
            if(a == strlen(name))
            {
                pv = (struct comp **) realloc(pv, sizeof(struct   comp*) * (s + 1));
                if(!pv)
                {
                    goto ret;
                }
                point = &pv;
                pv[s] = p;
            }
            continue;
        }
    }
    pv[0]->code = s; // l'elemento 0 funge da contatore degli
ret:                         // elementi totali
    return point;
}



Se volessi che la funzione restituisse questo vettore di strutture, in modo da poterlo utilizzare nella funzione principale, quali modifiche dovrei apllicare al codice?
Ultima modifica effettuata da drewnik99 01/09/11 22:58
aaa