Pagina 1 di 1

[C] Passaggio funzione [RISOLTO]

Inviato: sab 21 ago 2010, 19:50
da Blallo
Sto usando un ADT di liste
dal main passo una funziona così

Codice: Seleziona tutto

if (!list_insert ((*lpN), tmpDat, comp_by_name))
        {
            fclose(fp);
            return FAILURE;
        }

        if (!list_insert ((*lpV), tmpDat, comp_by_mark))
        {
            fclose(fp);
            return FAILURE;
        }
dove le comp_by_name e comp_by_mark vengono passate alle operazioni della lista in questo modo

Codice: Seleziona tutto

int list_insert(list_t *lp, data_t *tmpDat, int (comp_function)(data_t *, data_t *))
{
    node_t *node, *n_prev, *n_next;

    if (lp == NULL)
        return LIST_ERROR;

    node=alloc(tmpDat);

    if ((comp_function(node->value, lp->head->value)) < 0)/*head insertion*/
    {
        node->next=lp->head;
        lp->head=node;

        lp->elem_num++;

        return LIST_SUCCESS;
    }

    n_prev=lp->head;
    n_next=n_prev->next;
    while ((n_next != NULL) && (comp_function(n_next->value, node->value) < 0))/*body-bottom insertion*/
    {
        n_prev=n_next;
        n_next=n_prev->next;
    }
    n_prev->next=node;
    node->next=n_next;
    lp->elem_num++;

    return LIST_SUCCESS;
}
solo che al momento del passaggio alla funzione reale, definita nel file contenente il "tipo di dato", mi da un segfault
metto l'archivio con tutti i file qui sotto
è un progetto codeblocks, quindi chi lo usa e vuole darmi una mano ha già tutto "impaginato"
grazie a tutti

Re: [C] Passaggio funzione

Inviato: sab 21 ago 2010, 23:46
da targzeta
Il problema non è il riferimento alla funzione, ma nella gestione delle liste.

Codice: Seleziona tutto

if ((comp_function(node->value, lp->head->value)) < 0)/*head insertion*/
fai un debug in questo punto (list.c, riga 58) e vedrai che lp->head è NULL, quindi riferendo a lp->head->value hai un segfault.

Emanuele

Re: [C] Passaggio funzione

Inviato: dom 22 ago 2010, 23:34
da Blallo
Grazie Spina
in effetti è proprio così, e ho anche capito il perchè (sono un PIRLA)
se la lista è vuota, deve dare come testa il primo nodo disponibile
quindi un semplice

Codice: Seleziona tutto

    if (lp->head == NULL)
    {
        lp->head = node;
        return LIST_SUCCESS;
    }
piazzato dopo il primo if (lp == NULL)
risolve il problema
grazie dell'interessamento ;)

Re: [C] Passaggio funzione [RISOLTO]

Inviato: lun 23 ago 2010, 2:20
da metrofox
se la lista è vuota, deve dare come testa il primo nodo disponibile
quindi un semplice
Eh, anche io sto studiando le liste per ora dal libro dei deitel, appena hai detto quella frase m'è venuto un flashback :D

Re: [C] Passaggio funzione [RISOLTO]

Inviato: lun 23 ago 2010, 2:36
da Blallo
metrofox ha scritto:Eh, anche io sto studiando le liste per ora dal libro dei deitel, appena hai detto quella frase m'è venuto un flashback :D
Ottimo libro il D&D (mi ricorda qualcos'altro sto diminutivo...)