Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636

    problema ordinamento struct (in C)

    ciao a tutti
    sono nuovo nella programmazione in C e sto avendo alcuni problemi

    devi ordinare una struttura secondo un determinato campo

    io considero

    cognome = cantanti[j].lastname;

    ove cognome è di tipo chat mentre cantanti[j].lastname è un campo dela struttura
    mi da il seguente errore

    cantanti.c:47: error: request for member `lastname' in something not a structure or union

    qualcuno sa dirmi perché?

    vi ringrazio

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: problema ordinamento struct (in C)

    Originariamente inviato da jurij7
    qualcuno sa dirmi perché?
    Senza codice è impossibile aiutarti... quell'errore significa semplicemente che stai richiedendo l'accesso al campo "lastname" in qualcosa che non è né una struttura né una union, ma di più non ti si può dire se non mostri il codice.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    ok grazie ecco il codice

    codice:
     
    #include <stdio.h>
    #include <stdlib.h>
    #define numcar 25
    #define massimo 30
    
    
    
    /*
     * 
     */
    int main(){
    
       struct cantante {
        char lastname[numcar];
        char firstname[numcar];
        double dischi;
    } cantanti[massimo];
    
        int I;
        int i;
        int j = 0;
        char cognome;
        char nome;
        double disco ;
    
        for (I = 0; I <= massimo; I++){
            printf ("Inserire cantante %d :", I );
            printf ("Cognome : ");
            scanf ("%25s", cantanti[I].lastname);
            printf ("Nome : ");
            scanf ("%25s", cantanti[I].firstname);
            printf ("Totale dischi : ");
            scanf ("%f", cantanti[I].dischi);
            }
    
    
        for (i = 0; i < massimo - 1; i++){
            for (j = i + 1; j < massimo; j++){
             if (cantanti[i].dischi > cantanti[j].dischi){
                 cognome = cantanti[j].lastname;
                 cantanti[j].lastname = &cantanti[i].lastname;
                 cantanti[i].lastname = cognome;
                 nome = cantanti[j].firstname;
                 cantanti[j].firstname = cantanti[i].firstname;
                 cantanti[i].firstname = nome;
                 disco = cantanti[j].dischi;
                 cantanti[j].dischi = cantanti[i].dischi;
                 cantanti[i].dischi = disco;
             }
    
            }
        }
       
        printf ("Stampa ordinata\n");
        printf ("COGNOME\tNOME\tDISCHI\t\n");
         for (I = 0; I <= massimo; I++){
             printf ("%s%s%f", cantanti[I].lastname, cantanti[I].firstname, cantanti[I].dischi);
         }
        return 0;
    }

  4. #4
    codice:
    cognome = cantanti[j].lastname; //Questo non ha senso perché cognome è un char, non una stringa
    cantanti[j].lastname = &cantanti[i].lastname; //Questo non ha senso perché lastname è un array di char e non un puntatore
    cantanti[i].lastname = cognome; //Questo non ha senso perché stai cercando di assegnare ad un array di char un singolo char
    //Idem per gli altri campi
    La soluzione corretta:
    codice:
        int I;
        int i;
        int j = 0;
        char buffer[numcar];
        double disco ;
    
        for (I = 0; I <= massimo; I++){
            printf ("Inserire cantante %d :", I );
            printf ("Cognome : ");
            scanf ("%25s", cantanti[I].lastname);
            printf ("Nome : ");
            scanf ("%25s", cantanti[I].firstname);
            printf ("Totale dischi : ");
            scanf ("%f", cantanti[I].dischi);
            }
    
    
        for (i = 0; i < massimo - 1; i++){
            for (j = i + 1; j < massimo; j++){
             if (cantanti[i].dischi > cantanti[j].dischi){
                 strcpy(buffer,cantanti[j].lastname);
                 strcpy(cantanti[j].lastname,&cantanti[i].lastname);
                 strcpy(cantanti[i].lastname,buffer);
                 strcpy(buffer,cantanti[j].firstname);
                 strcpy(cantanti[j].firstname,cantanti[i].firstname);
                 strcpy(cantanti[i].firstname,buffer);
                 strcpy(buffer,cantanti[j].dischi);
                 strcpy(cantanti[j].dischi,cantanti[i].dischi);
                 strcpy(cantanti[i].dischi,buffer);
             }
    
            }
        }
    Ricorda: le stringhe si copiano con strcpy (e, se non sei sicuro della lunghezza massima della stringa di origine, si usa strncpy a scanso di buffer overflow).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    ok grazie tante
    quindi '=' si usa solo con le vriabili semplici ?
    inoltre come noti nel programmino il campo disco è double...cosa devo utilizzare per copiarlo?

  6. #6
    Originariamente inviato da jurij7
    ok grazie tante
    quindi '=' si usa solo con le vriabili semplici ?
    Sì, per le variabili non-array. Di conseguenza non si può usare per le stringhe, che sono array di char.
    inoltre come noti nel programmino il campo disco è double...cosa devo utilizzare per copiarlo?
    Basta un normale =.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define numcar 25
    #define massimo 3
    
    
    
    /*
     * 
     */
    int main(){
    
       struct cantante {
        char lastname[numcar];
        char firstname[numcar];
        double dischi;
    } cantanti[massimo];
    
        int I;
        int i;
        int j = 0;
        char buffer[numcar];
        double disco;
    
    
        for (I = 0; I <= massimo; I++){
            printf ("Inserire cantante %d :\n", I );
            printf ("Cognome : ");
            scanf ("%25s", cantanti[I].lastname);
            printf ("Nome : ");
            scanf ("%25s", cantanti[I].firstname);
            printf ("Totale dischi : ");
            scanf ("%30f", cantanti[I].dischi);
            }
    
    
        for (i = 0; i < massimo - 1; i++){
            for (j = i + 1; j < massimo; j++){
             if (cantanti[i].dischi > cantanti[j].dischi){
                 strcpy(buffer,cantanti[j].lastname);
                 strcpy(cantanti[j].lastname,cantanti[i].lastname);
                 strcpy(cantanti[i].lastname,buffer);
                 strcpy(buffer,cantanti[j].firstname);
                 strcpy(cantanti[j].firstname,cantanti[i].firstname);
                 strcpy(cantanti[i].firstname,buffer);
                 disco = cantanti[j].dischi;
                 cantanti[j].dischi = cantanti[i].dischi;
                 cantanti[i].dischi = disco;
    
             }
    
            }
        }
       
        printf ("Stampa ordinata\n");
        printf ("COGNOME\tNOME\tDISCHI\t\n");
         for (I = 0; I <= massimo; I++){
             printf ("%25s%25s%30f", cantanti[I].lastname, cantanti[I].firstname, cantanti[I].dischi);
         }
        return 0;
    }
    sembra ok....ma quando lo mando in esecuzione...mi esce uno strano messaggio
    potresti provarlo ?
    p.s.non so se sia il netbeans che mi da problemi..

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    L'ultima scanf() è errata

    codice:
    scanf ("%30f", cantanti[I].dischi);
    innanzitutto il secondo argomento deve essere un puntatore alla variabile a cui vuoi assegnare un valore leggendolo da tastiera.

    Poi, a che ti serve specificare "30" del codice di formato? Tra l'altro, per leggere un valore double (e il campo dischi è proprio di questo tipo) il codice di formato da utilizzare è %lf ("Long Float")

    codice:
    scanf ("%lf", &cantanti[I].dischi);
    Ah, già che ti trovi includi pure l'header file string.h per la funzione strcpy().

    Una curiosità: perché usi un tipo double per "dischi" che dovrebbe essere un tipo intero? Non penso sia perché hai bisogno di 64 bit per rappresentare il numero dei dischi di un autore
    every day above ground is a good one

  9. #9
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> //Necessaria per strcpy
    #define NUMCAR 25 //Le macro si solito si scrivono tutte in maiuscolo per distinguerle
    #define MASSIMO 3
    #define ARRSIZE(arr)    (sizeof(arr)/sizeof(*arr))  //Macro che ottiene le dimensioni di un array allocato sullo stack
    
    int main(){
    
        struct cantante {
            char lastname[NUMCAR];
            char firstname[NUMCAR];
            unsigned int dischi; //Non sono necessari i double, non credo che nessuno abbia mai pubblicato frazioni di dischi...
        } cantanti[MASSIMO];
        //La variabile I non serve, si può riciclare i
        int i;
        int j = 0;
        char buffer[NUMCAR];
        double disco;
    
    
        for (i = 0; i < MASSIMO; i++){ //i deve essere solo minore, mai essere uguale a MASSIMO, altrimenti sfori dall'array
            printf ("Inserire cantante %d :\n", i);
            printf ("Cognome : ");
            scanf ("%24s", cantanti[i].lastname); //Occhio, il numero massimo di caratteri da acquisire è 24, il 25 è riservato al NUL
            cantanti[i].lastname[ARRSIZE(cantanti[i].lastname)-1]=0; //Mi assicuro che il buffer sia NUL-terminated
            printf ("Nome : ");
            scanf ("%24s", cantanti[i].firstname);
            cantanti[i].firstname[ARRSIZE(cantanti[i].firstname)-1]=0;
            printf ("Totale dischi : ");
            scanf ("%u",&cantanti[i].dischi);
            //Se cantanti[i].dischi fosse stato un double come era prima avresti dovuto mettere:
            //scanf ("%lf", &cantanti[i].dischi);
        }
    
    
        for (i = 0; i < MASSIMO - 1; i++){
            for (j = i + 1; j < MASSIMO; j++){
                if (cantanti[i].dischi > cantanti[j].dischi){
                    strcpy(buffer,cantanti[j].lastname);
                    strcpy(cantanti[j].lastname,cantanti[i].lastname);
                    strcpy(cantanti[i].lastname,buffer);
                    strcpy(buffer,cantanti[j].firstname);
                    strcpy(cantanti[j].firstname,cantanti[i].firstname);
                    strcpy(cantanti[i].firstname,buffer);
                    disco = cantanti[j].dischi;
                    cantanti[j].dischi = cantanti[i].dischi;
                    cantanti[i].dischi = disco;
                }
            }
        }
    
        printf ("Stampa ordinata\n");
        //In questo modo le intestazioni sono allineate come le scritte
        printf ("%25s%25s%30s\n","COGNOME","NOME","DISCHI");
        for (i = 0; i < MASSIMO; i++){
            printf ("%25s%25s%30u", cantanti[i].lastname, cantanti[i].firstname, cantanti[i].dischi);
        }
        return 0;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    grazie siete tutti molto gentili
    una curiosità
    perchè scanf ("%lf", &cantanti[I].dischi); e non per gli altri campi ?
    forse perchè gli altri sono array di stringhe e quindi senza '&' è già puntatore?

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.