|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
[C]Alcuni dubbi sulle strutture
Sto tentando di far funzionare il seguente programma:
Codice:
#include <stdio.h>
struct part {
int partNumber;
char *partName[25];
};
typedef struct part Part;
main()
{
struct part a;
char pause;
printf ("Inserire un numero ed una stringa:\n");
scanf ("%d%s", &a.partNumber, &a.partName);
printf ("%d e %s", a.partNumber, *a.partName);
printf ("\nPremere una lettere per terminare il programma.\n");
scanf ("%c", &pause);
return 0;
}
Inoltre mi sapete dire per quale motivo nella riga Codice:
printf ("%d e %s", a.partNumber, *a.partName);
Il mio libro per le stringhe utilizza 3 diverse notazioni (le ultime due utilizzano un puntatore alla struttura), tutte PRIVE di asterisco iniziale: Codice:
printf ("%s", a.partName);
printf ("%s", ptr->partName);
printf ("%s", (*ptr).partName);
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Morale della favola: mi sa che hai usato un asterisco in più.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
La mia idea era di utilizzarlo come un vettore che potesse contenere una stringa ed in effetti, così come l'ho definito, ne dovrebbe poter contenere 25, cosa inutile.
L'ho corretto in: char partName eliminando anche l'asterisco dalla scanf, ma il programma continua a bloccarsi. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Codice:
#include <stdio.h>
#include <stdlib.h>
struct part {
int partNumber;
char partName[25];
};
int main(int argc, char **argv) {
struct part p;
scanf("%d", &p.partNumber);
scanf("%s", p.partName);
printf("\nPart Number:\t%d", p.partNumber);
printf("\nPart Name:\t%s", p.partName);
printf("\n");
return 0;
}
Codice:
char *partName[25]; Codice:
char partName[25]; PS: utilizzare typedef e poi usare struct <nomestruttura> non ha molto senso. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Purtroppo queste strutture mi stanno dando parecchi grattacapi, è l'ultimo argomento che devo affrontare per l'esame, ma che fatica.
Si, ho corretto tutto ed ho capito le varie differenze, ma purtroppo il programma da te postato mi da' ancora il classico errore di XP! Ed inoltre mi spieghi perchè ad una scanf hai utilizzato l'ampersand ed all'altra no? Ultima modifica di Composition86 : 30-08-2008 alle 19:58. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
perchè partName è già un puntatore a carattere (al primo di 25)
__________________
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Quote:
Vorrei aggiungere un po' di domande, ammetto che sto trovando l'argomento strutture un po' complicato. Sto cercando di realizzare un programma (ancora incompleto) che mi archivi i dati di 5 persone, cioè nome cognome ed età: Codice:
//Gestione di un archivio di persone
#include <stdio.h>
struct persona {
char *nome[5];
char *cognome[5];
int *eta[5];
};
typedef struct persona Persona;
struct persona dati[5];
void chiediDati (Persona *);
main()
{
char pause;
int i;
printf ("Verranno ora richiesti i dati anagrafici relativi a 5 persone\n\n");
for (i = 0 ; i <= (5 - 1) ; i++) {
printf ("Inserire nome\n");
scanf ("%s", (*dati).nome);
printf ("Inserire cognome\n");
scanf ("%s", (*dati).cognome);
printf ("Inserire eta'\n");
scanf ("%d", &(*dati).eta);
}
for (i = 0 ; i <= (5 - 1) ; i++) {
printf ("Dipendente %d", i);
printf ("Nome: %s",(*dati).nome );
printf ("Cognome: %s",(*dati).cognome);
printf ("Eta': %d", (*dati).eta);
}
printf ("Inserire una lettera per terminare");
scanf ("%c", &pause);
return 0;
1) La struttura: al suo interno compaiono due vettore di 5 puntatori a carattere che mi servono per nome e cognome ed un vettore di 5 puntatori a numero per l'età: è corretto? 2) Il primo ciclo for: funziona correttamente, ma per puro caso, in quanto ho dovuto introdurre quegli asterischi nelle scanf, andando contro ciò che mi sembrava di aver capito dalla teoria: mi potreste spiegare a cosa servono e se si può avere un'altra forma che non ne faccia uso? 3) Il secondo ciclo for: non funziona e non ho idea sul come farlo funzionare. Se uso la forma del tipo Codice:
printf ("Nome: %s", dati.nome );
printf ("Cognome: %s",dati.cognome);
printf ("Eta': %d", dati.eta);
request for member `nome' in `dati', which is of non-aggregate type `persona[5]' Ditemi voi, la confusione è abbastanza. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Aspetta, mi sa che stai facendo casino con i tipi. Una struttura non fa altro che definire un'area di memoria che è "strutturata" in diversi campi. Definisci la strutturazione dei campi e i tipi che questi contengono, e poi definisci la struttura intera come fosse una variabile comune. Solo, i singoli campi li leggi accedendo al loro nome con la forma "variabile.campo". Se hai un puntatore alla struttura, o la dereferenzi esplicitamente ("(*variabile).campo") o usi l'operatore freccia ("variabile->campo").
Codice:
struct esempio
{
int numero;
char stringacorta[10];
};
int main()
{
struct esempio *var1;
struct esempio var2;
var2.numero = 123;
var2.stringacorta = "Ciao!";
var1 = &var2;
printf("%s\n", var2.stringacorta);
printf("%d\n", var1->numero);
return 0;
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#9 | |||
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
Quote:
Alla scanf tu devi passare un parametro (o più di uno) in scrittura. Per realizzare questo tipo di passaggio di parametro in C è necessario ricorrere al passaggio per indirizzo. Il simbolo & davanti ad una variabile semplice significa “prendi l’indirizzo di memoria di questa variabile”, se con una variabile di tipo int ha senso, con una variabile di tipo array di char (ma in generale con qualsiasi tipo di array) non ha senso dato che il nome con cui ti riferisci all’array (nel nostro caso partName) indica già un indirizzo di memoria. Se invece di aver acquisito una stringa con la scanf avessi voluto acquisire un singolo caratteri avrei scritto: Codice:
scanf(“%c”, &partName[0]); Quote:
Codice:
#include <stdio.h>
struct persona {
char nome[25];
char cognome[25];
int eta;
};
struct persona dati[5];
main() {
char pause;
int i;
printf ("Verranno ora richiesti i dati anagrafici relativi a 5 persone\n\n");
for (i = 0; i < 5; i++) {
printf ("Inserire nome\n");
scanf ("%s", dati[i].nome);
printf ("Inserire cognome\n");
scanf ("%s", dati[i].cognome);
printf ("Inserire eta\n");
scanf ("%d", &dati[i].eta);
}
for (i = 0; i < 5; i++) {
printf("Dipendente %d\n", i);
printf("Nome: %s\n", dati[i].nome );
printf("Cognome: %s\n", dati[i].cognome);
printf("Eta': %d\n", dati[i].eta);
}
printf ("Inserire una lettera per terminare");
scanf ("%c", &pause);
return 0;
}
|
|||
|
|
|
|
|
#10 | ||||
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Quote:
Quote:
Quote:
Quote:
Adesso vedo se riesco a sfruttare i vostri consigli. Vi ringrazio per l'enorme aiuto! |
||||
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Però devi stare attento a non fare un minestrone; quando provi nuove cose cerca sempre di chiederti se sono coerenti con la loro definizione e se ti sembrano corrette, per prima cosa. Se credi che tutto possa funzionare ed è logicamente corretto, butta giù del codice e fai la prova empirica. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:43.




















