Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    puntatori a funzione

    Ciao a tutti
    C'è qualcosa che non mi quadra nell'assegnamento delle funzioni ad altre funzioni.
    codice:
    typedef struct elem {
      void *key; /** chiave */
      struct elem *next; /** informazione */
    } node;
     
    typedef struct {
      node *head; /** la testa della lista */
      int (*compare) (void *, void *); /** la funzione per confrontare due chiavi */
      void *(*copyk) (void *); /** la funzione per copiare una chiave */
    } list;
    
    int compare_int(void *a, void *b) {
        int *ai, *bi;
        ai = (int *) a;
        bi = (int *) b;
        return ((*ai) - (*bi));
    }
    
    void* copy_int(void *a) {
      int *ai;
      if ( ( ai = malloc(sizeof(int) ) ) == NULL ) return NULL;
      *ai = *(int *) a;
      return (void *) ai;
    }
    
    list new_int_list(void){
    	list nwl;
    	nwl.head = NULL;
    	nwl.compare = compare_int;
    	nwl.copyk = copy_int;
    }
    
    int main(){
    	list nwl; int a=1,b=2,c=3; int *x; 
    	nwl = new_int_list();
    	printf("Risultato : %d \n",nwl.compare(&a,&b));
    	x = (int *) copy_int(&a);
    	printf("Risultato : %d \n",*x);
    	x = (int *) nwl.copyk(&a);
    	printf("Risultato : %d \n",*x);
    	return 0;
    }
    La prima x riesce a stamparmela.
    Alla seconda mi da errore di segmentazione.

    Ma questo è molto strano, visto che ho assegnato a copyk = copy_int???

    Aiutatemi, non ci capisco più nulla!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296

    Moderazione

    Il linguaggio va indicato anche nel titolo, come da Regolamento.

    Qui l'ho aggiunto io. Tienilo a mente per il futuro.

    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    La funzione new_int_list() non restituisce nulla, hai dimenticato l'istruzione return alla fine.
    every day above ground is a good one

  4. #4
    non è possibile che errore idiota.
    Non me ne sono accorto perchè la funzione compare funzionava, e allora mi dicevo cosa sbaglio???

    Grazie, mi hai sbloccato il lavoro.

    ps: scusate dell'errore nel titolo

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Comunque ti consiglio di evitare la return di una struct perché si tratta di restituire tanti byte quanto è la dimensione della struct. Nel tuo caso si tratta di pochissimi byte quindi la questione è di poca importanza, ma in generale comunque è meglio allocare la struttura in main() e passarla per riferimento alla funzione per farla modificare. In questo modo fai solo il passaggio di un parametro "indirizzo" che è di un numero fisso di byte a prescindere dalla dimensione della struct (4 o 8 o altro a seconda del sistema/compilatore che hai).
    every day above ground is a good one

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.