PDA

Visualizza versione completa : [C++] Errore inspiegabile prima dell'esecuzione a runtime


Downloader
28-11-2005, 17.05.24
Sto scrivendo un programmino che prende da un file txt preesistente i cognomi (e non solo, ma ora non mi interessano) presenti e li scrive in un array.

Ecco il codicillo:

#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

struct data
{
int giorno;
int mese;
int anno;
};


struct persona
{
char cognome[20];
char nome[20];
data data_nascita;
char sesso;
};

persona elenco[20];
//int tot=0;
int i=0; // indice dell'array


void lettura()
{

FILE *pf=fopen("c:\\people.txt","r");
char nome_cognome[20];
int c=0;
char var=fgetc(pf);

while (!feof(pf))
{
while (var!=' ')
{
nome_cognome[c]=var;
var=fgetc(pf);
c++;
}

c=0;
strcpy(elenco[i].cognome,nome_cognome); // copio la stringa contenente il cognome dentro l'array di tipo persona precedentemente creato.

while (var==' ')
{
var=fgetc(pf);
}

i++;

}
fclose(pf);
}




La cosa strana che in fase di compilazione tutto file liscio, quando vado a eseguire il programma esce un errore di cui sinceramente non capisco l'origine.

Che ne dite?

tnx! ;)

Dav82
28-11-2005, 18.05.30
Tu esci dal primo ciclo while interno al while pi fuori, se e solo se incontri uno spazio, altrimenti ci rimani dentro... com' fatto il tuo file people.txt?

StackFault dovrebbe significare che accedi ad un'area di memoria cui non hai diritto di accedere (ma non ne sono per nulla sicuro, in Java sai, queste cose... tz :o :p)

(eventualmente col debugger o con delle printf guarda dove si blocca il programma, cos puoi capire dove avviene l'errore ;))

Downloader
28-11-2005, 20.07.00
Originariamente inviato da Dav82
Tu esci dal primo ciclo while interno al while pi fuori, se e solo se incontri uno spazio, altrimenti ci rimani dentro... com' fatto il tuo file people.txt?


Il file di testo preesistente, prepopolato e costituito seguendo uno schema logico che ci stato dato:
cognome
spazio
nome
spazio
giorno nascita
/
mese nascita
/
anno nascita
spazio
sesso

il tutto nella stessa riga.

Quindi dentro ogni ciclo while (anche se ne ho postato solo uno) contiene istruzioni per prendere ogni singolo carattere e metterlo in una determinata zona di array.
L'ultimo while serve per arrivare al primo carattere (del cognome) del prossimo utente.

StackFault dovrebbe significare che accedi ad un'area di memoria cui non hai diritto di accedere (ma non ne sono per nulla sicuro, in Java sai, queste cose... tz :o :p)

Ho pensato la stessa cosa, il problema che dove' che vado a mattere le manaccie per scrivere su zone protette?
Cio ho fatto un sacco di programmi del genere e non mi mai successa una cosa del genere :confused:

Semi.genius
28-11-2005, 21.11.55
while (var!=' ')
{
nome_cognome[c]=var;
var=fgetc(pf);
c++;
}

Il problema risiede qui :p
se il file finisce proprio all'interno di questo ciclo, non controlli se finito il file, perci dovrebbe bastare replicare la condizione del primo while...se non fosse, d pure (non posso controllare per adesso..tra poco posso :))
prova cos
while (var!=' ' && !feof(pf))
{
nome_cognome[c]=var;
var=fgetc(pf);
c++;
}

Downloader
28-11-2005, 23.06.48
Azz, mo che mi ci fai pensare era proprio una cretinata alla fine :p

Grazie per la dritta (Y)

Dr_House
29-11-2005, 00.38.57
Si in effetti non terminando il ciclo lui continuaca e continuafa sino a che non andava a scrivere in aree di memoria riservate, il C fa di questi scherzi, una volta mi capit anche con il VB :D

Bh te l'ha detta gia lui era capitata anche a me sta cosetta

wilhelm
29-11-2005, 14.46.12
Dav: sono curioso: conosco Java 0 ma lui ti controlla che tu non pastrocci con la memoria? O non compila e ti obbliga ad accorgertene?

Dav82
29-11-2005, 15.12.40
No no, la mia era un'iperbole :)

Puoi benissimo riuscire a tentare di scrivere al trentesimo posto di un array di 20 elementi, sia staticamente (a[30], anche se magari un compilatore arguto potrebbe evitare) che dinamicamente (a[i]), e il programma - se non si sono prese le contromisure adeguate (controlli, gestione eccezioni ecc) - crasha irrimediabilmente.

Pi difficile invece dire: voglio scrivere "343" a partire dall'indirizzo di memoria 0xAF43031, che magari allocato al kernel... ecco, quello non si pu fare :p
In pratica in Java la gestione della memoria trasparente al programmatore, non ci si pu riferire direttamente agli indirizzi di memoria come si fa in C (o meglio: fanno, io e il C siamo due cose separate)... per esempio fare i pastrocchi su valori dei puntatori sommati fra loro e usati per referenziare un altro indirizzo... nada :p


Intendevi questo? :) (=> ho sctato scpiecato? :p)

wilhelm
29-11-2005, 15.24.55
Zi, hai sctato scpiecato molto pene!!!

LoryOne
29-11-2005, 21.16.47
Occhio che questo un mix di C e C++.


struct persona
{
char cognome[20];
char nome[20];
data data_nascita;
char sesso;
};

persona elenco[20];


Creare 20 elementi elenco di tipo persona in questo modo, lo consente solo il C++

Semi.genius
30-11-2005, 14.32.03
Originariamente inviato da LoryOne
Occhio che questo un mix di C e C++.
...
Creare 20 elementi elenco di tipo persona in questo modo, lo consente solo il C++
Gi
:) ma molto probabilmente un programma stato impartito dalla scuola..e la scuola non fa distinsione molto spesso tra C e C++:o