[C] Passaggio funzione [RISOLTO]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

[C] Passaggio funzione [RISOLTO]

Messaggio 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
Allegati
ADT_2.tar.bz2
(15.58 KiB) Scaricato 571 volte
Ultima modifica di Blallo il dom 22 ago 2010, 23:39, modificato 1 volta in totale.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] Passaggio funzione

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [C] Passaggio funzione

Messaggio 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 ;)

metrofox
Linux 3.x
Linux 3.x
Messaggi: 760
Iscritto il: gio 7 ago 2008, 12:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)
Località: London

Re: [C] Passaggio funzione [RISOLTO]

Messaggio 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

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [C] Passaggio funzione [RISOLTO]

Messaggio 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...)

Rispondi