Repository 32bit  Forum
Repository 64bit  Wiki

[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.

[C] Passaggio funzione [RISOLTO]

Messaggioda Blallo » sab ago 21, 2010 18: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 23 volte
Ultima modifica di Blallo il dom ago 22, 2010 22:39, modificato 1 volta in totale.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3244
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [C] Passaggio funzione

Messaggioda targzeta » sab ago 21, 2010 22: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
targzeta
Iper Master
Iper Master
 
Messaggi: 6200
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] Passaggio funzione

Messaggioda Blallo » dom ago 22, 2010 22: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 ;)
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3244
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [C] Passaggio funzione [RISOLTO]

Messaggioda metrofox » lun ago 23, 2010 1: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
metrofox
Linux 2.6
Linux 2.6
 
Messaggi: 758
Iscritto il: gio ago 07, 2008 11:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)

Re: [C] Passaggio funzione [RISOLTO]

Messaggioda Blallo » lun ago 23, 2010 1: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...)
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3244
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron