Visualizzazione dei risultati da 1 a 10 su 15

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Chiami crea_modo con un carattere, non con un puntatore a caratteri. Inoltre chiami insert che prende un carattere con un puntatore a un puntatore a carattere.
    Leggi i warning che ottieni come prima cosa.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  2. #2
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Chiami crea_modo con un carattere, non con un puntatore a caratteri. Inoltre chiami insert che prende un carattere con un puntatore a un puntatore a carattere.
    Leggi i warning che ottieni come prima cosa.
    codice:
    struct Infof
    {
        char nome[12];
        char telefono[10];
    };
    struct albero
    {
        struct Infof info;
        struct albero *left;
        struct albero *right;
    };
    typedef struct albero bst;
    bst *crea_nodo(char name)
    {
        bst *nuovo = (bst *)malloc(sizeof(bst));
        puts(&name);
        strcpy(nuovo->info.nome, &name);
        printf("Inserisci numero di telefono: ");
        scanf("%s",nuovo->info.telefono);
        nuovo->left  = NULL;
        nuovo->right = NULL;
        return nuovo;
    }
    bst *insert(bst *padre, char *nom)
    {
        if(padre == NULL)
        {
            return crea_nodo(nom);
        }
        if(strcmp(padre->info.nome, &nom) < 0)
        {
            return insert(padre->left, nom);
        }
        else if (strcmp(padre->info.nome, &nom) > 0)
        {
            return insert(padre->right, nom);
        }
        return padre;
    }
    void preorder(bst *nodo)
    {
        if(nodo != NULL)
            {
                printf("Nome: %s\n", nodo->info.nome);
                printf("Numero di telefono: ");
                printf("%s",nodo->info.telefono);
                puts("");
                preorder(nodo->left);
                preorder(nodo->right);
            }
    }
    int main()
    {
        bst *head = NULL;
        char nome[12];
        printf("Inserisci nome: ");
        gets(nome);
        head = insert(head, nome);
        short int grado;
        printf("Inserisci il grado della radice: ");
        scanf("%hi", &grado);
        grado = pow(2,grado)-2;
        short int i;
        for(i = 0; i < grado; i++)
        {
            printf("Inserisci nome: ");
            scanf("%s", &nome);
            insert(head, *nome);
        }
        preorder(head);
        return 0;
    }
    ci sono 3 warning ma quello interessante è :warning: passing argument 1 of 'crea_nodo' makes integer from pointer without a cast

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    In insert passi a strcmp un char ** ma si aspetta un char * e passi a crea_nodo un char ma si aspetta un char *.
    Inoltre se hai un variabile char c, &c non è equivalente a una stringa, una stringa è terminata da '\0'.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    In insert passi a strcmp un char ** ma si aspetta un char * e passi a crea_nodo un char ma si aspetta un char *.
    Inoltre se hai un variabile char c, &c non è equivalente a una stringa, una stringa è terminata da '\0'.
    il problema per adesso non è lo strcmp perché già solo se inserisco la radice e pongo il grado uguale ad 1 non mi stampa correttamente il nome della radice. Comunque ho cambiato la insert mettendo char * (stessa cosa anche a crea_nodo). Per quanto riguarda e stringhe io ho usato la gets. Se uso la scanf e guardo cosa contiene la memoria la variabile è memorizzata correttamente.

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Il problema è che non hai capito come lavorano i puntatori e come è rappresentata una stringa. I tipi sono messi a caso e i problemi nel codice sono ovvi se comprendi i due aspetti di cui sopra. I punti in cui ci sono errori li ho già esposti, sono quelli e quelli rimangono, tuttavia se non capisci perché stai sbagliando è meglio se ristudi tali parti da un manuale.

    Inoltre non dovresti mai sottovalutate un warning, l'unico warning accettabile è quello che ti aspetti prima di compilare la prima volta.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Il problema è che non hai capito come lavorano i puntatori e come è rappresentata una stringa. I tipi sono messi a caso e i problemi nel codice sono ovvi se comprendi i due aspetti di cui sopra. I punti in cui ci sono errori li ho già esposti, sono quelli e quelli rimangono, tuttavia se non capisci perché stai sbagliando è meglio se ristudi tali parti da un manuale.

    Inoltre non dovresti mai sottovalutate un warning, l'unico warning accettabile è quello che ti aspetti prima di compilare la prima volta.
    non sottovaluto i warning è solo che i due successivi fanno parte di una porzione di codice non interessante. Per quanto riguarda i puntatori so come funzionano ma sto avendo problemi con le stringhe. Ho cambiato come dici tu ma non va.

    codice:
    struct Infof
    {
        char nome[12];
        char telefono[10];
    };
    struct albero
    {
        struct Infof info;
        struct albero *left;
        struct albero *right;
    };
    typedef struct albero bst;
    bst *crea_nodo(char *name)
    {
        bst *nuovo = (bst *)malloc(sizeof(bst));
        puts(&name);
        strcpy(nuovo->info.nome, &name);
        printf("Inserisci numero di telefono: ");
        scanf("%s",nuovo->info.telefono);
        nuovo->left  = NULL;
        nuovo->right = NULL;
        return nuovo;
    }
    bst *insert(bst *padre, char *nom)
    {
        if(padre == NULL)
        {
            return crea_nodo(nom);
        }
        if(strcmp(padre->info.nome, &nom) < 0)
        {
            return insert(padre->left, nom);
        }
        else if (strcmp(padre->info.nome, &nom) > 0)
        {
            return insert(padre->right, nom);
        }
        return padre;
    }
    void preorder(bst *nodo)
    {
        if(nodo != NULL)
            {
                printf("Nome: %s\n", nodo->info.nome);
                printf("Numero di telefono: ");
                printf("%s",nodo->info.telefono);
                puts("");
                preorder(nodo->left);
                preorder(nodo->right);
            }
    }
    int main()
    {
        bst *head = NULL;
        char nome[12];
        printf("Inserisci nome: ");
        gets(nome);
        head = insert(head, &nome);
        short int grado;
        printf("Inserisci il grado della radice: ");
        scanf("%hi", &grado);
        grado = pow(2,grado)-2;
        short int i;
        for(i = 0; i < grado; i++)
        {
            printf("Inserisci nome: ");
            scanf("%s", &nome);
            insert(head, *nome);
        }
        preorder(head);
        return 0;
    }

  7. #7
    Risolto. Mi stavo complicando la vita inutilmente

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