Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di drew
    Registrato dal
    Oct 2009
    Messaggi
    11

    [C]Problema vettore di strutture e allcazione dinamica

    codice:
    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;
    }
    Questa è tutta la funzione. Perchè pa[s - 1] = p; non è corretto?
    ~Drew~

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Intanto credo che pa debba essere un vettore di puntatori quindi :

    codice:
    struct comp **pa;
    poi quando allochi la memoria dovresti usare :
    codice:
    (void *)pa = malloc(sizeof(struct comp *));
    Credo che cs nn ti dia errori.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Probabilmente, come detto da linoma, il problema è che l'operatore "parentesi quadre" si può utilizzare solo quando si ha a che fare con i vettori.

    Il tuo pa, invece, è un puntatore.

  4. #4
    Originariamente inviato da closerToTheEdge
    Probabilmente, come detto da linoma, il problema è che l'operatore "parentesi quadre" si può utilizzare solo quando si ha a che fare con i vettori.

    Il tuo pa, invece, è un puntatore.
    Scusami ma è una "boiata pazzesca" ;-)
    Le parentesi quadre costituiscono una scorciatoia sintattica:
    codice:
    v[i] = p;
    è equivalente a:
    codice:
    *(v + i) = p;
    Nel suo caso:
    codice:
    struct comp *p;
    struct comp *pa;
    ...
     pa[s - 1] = p;
    è errato perché cerca di ficcare in un "comp", un "comp *". Perciò il suggerimento di linoma.
    ;-)

  5. #5
    Data l'idiozia sulle parentesi quadre (scusate ... sto alle prime armi ), provo a rifarmi.

    Oltre ovviamente al giusto "errore" di assegnare un comp* a un comp (che è stato già segnalato), ne vorrei aggiungere un altro.

    Spero non sia una boiata pure questa. Nel codice postato all'inizio, non si aggiorna pa con il valore di ritorno della realloc.
    Eppure realloc non è detto che "ingrandisca" sempre l'area di memoria puntata da pa (in tal caso, l'indirizzo rimarrebbe lo stesso).
    Se questa è insufficiente, alloca una NUOVA area di memoria e restituisce quindi il nuovo puntatore, cioè un diverso indirizzo di cui non si tiene conto di volta in volta.

    Quando questo accade, pa continua a puntare alla vecchia area di memoria non più utilizzata.

    Ho riacquistato qualche punto o continuo lo sprofondo nell'abisso???

  6. #6

  7. #7
    Originariamente inviato da MacApp
    http://it.wikipedia.org/wiki/Malloc#realloc
    importante il punto in cui dice: "Si deve sempre utilizzare una variabile temporanea."
    ;-)
    Grazie per il chiarimento! Si impara più frequentando questo forum che leggendo libri!

    Ad ogni modo, anche Wikipedia concorda nel tenere in considerazione il risultato di realloc, e non dare per scontato che il puntatore continui a riferire la stessa area di memoria precedente alla chiamata.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.