Visualizza la versione completa : 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
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.
ok grazie ecco il 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;
}
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:
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).
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?
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 =.
#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..
L'ultima scanf() è errata
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")
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 :madai!?:
#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;
}
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?