|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
C, l'ennesima mano per un newbie
[Per chi non avesse voglia di leggere tutto, la domanda è in fondo alla pagina]
Salve, in questi giorni sto tempestando questo forum di domande riguardanti il c, scusatemi ma per me questo è l'unico posto dove posso chiarire i miei dubbi. Magari per voi queste possono essere domande stupide ma per uno come me sono fondamentali per non creare nella testa un casino enorme che mi fa solo confondere le idee. Devo creare la giusta struttura dati per implementare questo problema: gestire i prestiti di una biblioteca e per ogni prestito memorizzare i seguenti dati: -nome, cognome e matricola dello studente che preleva il testo; -titolo, autore e codice numerico del libro; -data del prestito; -scadenza; Dovrei fare anche altre cose ma quelle probabilmente ve le chiederò dopo... Codice:
#include <stdio.h>
#include <malloc.h>
typedef int bool;
typedef struct student *student;
typedef struct student {
char *nome;
char *cognome;
char *matricola;
};
typedef struct book *book;
typedef struct book {
char *titolo;
char *autore;
int codice;
};
typedef struct date *date;
typedef struct date {
int giorno;
int mese;
int anno;
};
typedef struct prestito *prestito;
typedef struct prestito {
student studente;
book libro;
date data;
date scadenza;
} prestitoDescriptor;
void main () {
prestito ListaPrestiti;
ListaPrestiti=(prestito) malloc (sizeof(prestitoDescriptor));
prestito armando;
armando=(prestito) malloc (sizeof(prestitoDescriptor));
armando->studente->nome="Armando";
armando->studente->cognome="Contestabile";
armando->studente->matricola="150221";
printf ("%s", armando->studente->matricola);
}
Ultima modifica di VegetaSSJ5 : 26-10-2003 alle 15:22. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Semplicemente perchè il codice è sbagliato:
char *nome; char *cognome; char *matricola; Non sono stringhe, ma solamente puntatori a char... Queste sono stringhe... char nome[50]; char cognome[50]; char matricola[50]; |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Roma
Messaggi: 542
|
Dicesi Segmentation Fault...
In pratica scrivendo char* nome_stringa, crei un puntatore a carattere ma NON allochi spazio in memoria per la stringa stessa, quindi quando lo vai ad eseguire e richiami quella stringa non sai in che porzione di memoria il dato viene scritto, se sei fortunato la scrive nella porzione riservata al processo de tuo programma, altrimenti...crash!!! Quando devi creare una variabile che contiene una stringa alloca sempre un tot di byte (con il metodo descritto da cionci, cioè dichiarandola come array di caratteri).
__________________
Il 90% dei problemi di un computer si trova tra la tastiera e la sedia. XP2500+@3200+|A7N8X Deluxe|1,25 GB DDR400|Radeon 9550|HD 160+320 GB SATA|WinXP Pro|Fastweb 6 Mb/s |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Probabilmente con lcc viene allocato diversamente lo spazio nello heap rispetto ad altri compilatori... Ciò non vuol certo dire che lcc è migliore degli altri...è solo un caso che non ti genere un errore...
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
E per copiare una stringa ricordati di usare la strcpy().
Codice:
char str[50]; // spazio allocato
str = "stringa"; // NO! Questo e' sbagliato!
// risultato indefinito
strcpy(str, "stringa"); // Questo e' giusto
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:29.



















