Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24

Discussione: [C] Liste concatenate

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143

    [C] Liste concatenate

    Ciao, ho degli esercizi da fare sulle liste concatenate ma mi sono bloccata al primo, cioè "crea nodo". Il codice è:

    codice:
     
    #include <stdio.h>
    #include <string.h>
    
    #define N 10;
    
    typedef enum{FALSE, TRUE} bool;
    typedef enum{ERROR, OK} status;
    typedef struct _nodo* lista;
    
    lista crea_nodo(char* s);
    
    struct _nodo {
    	char* str; //stringa == il nostro dato
    	lista nxt; //puntatore al prossimo elemento
    } nodo;
    
    menu() {
    	system("clear");
    	printf("\n0 - Uscita");
    	printf("\n1 - crea_nodo");	
    	printf("\nInserisci una risposta: ");
    	int risp;
    	scanf("%d", &risp);
    	getchar();
    	return risp;
    }
    
    main() {
    	
    	lista l;
    	char stringa[N];
    	
    	while(1) {
    			int scelta = menu();
    			switch(scelta) {
    				case 0: 
    					exit(0);
    
    				case 1: 
    					printf("\nCreo un nodo. Inserisci una stringa: \n");
    					scanf("%s", stringa);
    					crea_nodo(stringa);
    					break;
    
    				default: 
    					exit(0);
    			}
    		}	
    }
    
    /*
    	Restituisce un nodo inizializzato con s.
    */
    lista crea_nodo(char* s) {
    	lista result = (lista)malloc(sizeof(nodo));
    	strcpy(result->str, s);
    	result->nxt = NULL;
    	return result;	
    }
    
    Come errore il compilatore mi da questo
    codice:
    lista.c: In function ‘main’:
    lista.c:47:15: error: expected ‘]’ before ‘;’ token
    lista.c:53:6: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
    lista.c:56:18: error: ‘stringa’ undeclared (first use in this function)
    lista.c:56:18: note: each undeclared identifier is reported only once for each function it appears in
    lista.c: In function ‘crea_nodo’:
    lista.c:114:24: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
    Cosa sbaglio?

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Innanzitutto il tipo bool esiste già in stdbool.h quindi non ti serve ridefinirlo, puoi semplicemente includere la libreria.
    Poi devi ricordarti che ogni funzione ha un tipo di ritorno, non puoi dichiarare menu() senza il tipo di ritorno (int menu()) e lo stesso vale per il main, che secondo lo standard C deve ritornare un intero.
    Define + una direttiva al preprocessore che sostituisce una parola con una o più parole, quindi se dici:

    codice:
    #define N 10;
    Ogni volta che scrivi "N" viene sostituito con "10;", non con "10", quindi c'è un punto e virgola di troppo.
    Per quanto riguarda il codice non si sa se è logicamente corretto, quando finisci di scriverlo facci sapere se c'è qualcosa che non va (sii specifico nello spiegare cosa non va).

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    stdbool.h in realtà rientra nello standard C99, pertanto la ridefinizione di un tipo boolean potrebbe essere necessaria se l'op deve/vuole compilare il programma in C90.
    Consiglio inoltre di includere l'header stdlib.h per risolvere il warning di "implicit declaration" su exit() e malloc().
    every day above ground is a good one

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Originariamente inviato da Who am I
    Innanzitutto il tipo bool esiste già in stdbool.h quindi non ti serve ridefinirlo, puoi semplicemente includere la libreria.
    Poi devi ricordarti che ogni funzione ha un tipo di ritorno, non puoi dichiarare menu() senza il tipo di ritorno (int menu()) e lo stesso vale per il main, che secondo lo standard C deve ritornare un intero.
    Define + una direttiva al preprocessore che sostituisce una parola con una o più parole, quindi se dici:

    codice:
    #define N 10;
    Ogni volta che scrivi "N" viene sostituito con "10;", non con "10", quindi c'è un punto e virgola di troppo.
    Per quanto riguarda il codice non si sa se è logicamente corretto, quando finisci di scriverlo facci sapere se c'è qualcosa che non va (sii specifico nello spiegare cosa non va).
    Grazie per le risposte!
    Sono alle prime armi, non sapevo che bool esistesse già..
    Ho corretto il punto e virgola ma mi da ugualmente questo errore:
    codice:
     
    lista.c: In function ‘main’:
    lista.c:53:6: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
    lista.c: In function ‘crea_nodo’:
    lista.c:108:24: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
     

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da YuYevon
    stdbool.h in realtà rientra nello standard C99, pertanto la ridefinizione di un tipo boolean potrebbe essere necessaria se l'op deve/vuole compilare il programma in C90.
    Consiglio inoltre di includere l'header stdlib.h per risolvere il warning di "implicit declaration" su exit() e malloc().
    every day above ground is a good one

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Originariamente inviato da YuYevon
    Ops non l'avevo visto..
    Comuqnue ora mi compila ma dopo aver inserito una stringa (es "ciao") mi da
    codice:
    Errore di segmentazione (core dump creato)
    ..

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    In crea_nodo() allochi spazio solo per il nodo ma non per il suo campo "str", col risultato che la strcpy() esegue un'operazione di scrittura in memoria non lecita.
    every day above ground is a good one

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Originariamente inviato da YuYevon
    In crea_nodo() allochi spazio solo per il nodo ma non per il suo campo "str", col risultato che la strcpy() esegue un'operazione di scrittura in memoria non lecita.
    Ah, e come dovrebbe essere il codice?

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Vediamo se ho capito.. Con questa istruzione
    codice:
    lista result = (lista)malloc(sizeof(nodo));
    sto facendo spazio per allocare un nodo (struttura nodo) il quale e' compotsto da un'array di caratteri. Per allocare spazio per un array di caratteri lungo N dovrei fare
    codice:
    str result = (str*)malloc(sizeof(str));
    ? Mi sa di no..

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se è un puntatore a char deve essere char * ... no ? E se i caratteri sono N + il terminatore allora

    result->str = (char *)malloc(sizeof(char)*(N+1));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.