[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.
Avatar utente
Blallo
Packager
Packager
Messaggi: 3287
Iscritto il: ven ott 12, 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]

Messaggioda Blallo » sab ago 21, 2010 19:50

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 169 volte
Ultima modifica di Blallo il dom ago 22, 2010 23:39, modificato 1 volta in totale.
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.

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

Re: [C] Passaggio funzione

Messaggioda targzeta » sab ago 21, 2010 23:46

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
Blallo
Packager
Packager
Messaggi: 3287
Iscritto il: ven ott 12, 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

Messaggioda Blallo » dom ago 22, 2010 23:34

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 ;)
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.

metrofox
Linux 2.6
Linux 2.6
Messaggi: 760
Iscritto il: gio ago 07, 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]

Messaggioda metrofox » lun ago 23, 2010 2:20

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: 3287
Iscritto il: ven ott 12, 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]

Messaggioda Blallo » lun ago 23, 2010 2:36

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...)
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti