PDA

View Full Version : [C++] Sto impazzendo, mi crasha su un "for (..)"


dupa
28-06-2005, 09:22
Sto diventando pazzo, non riesco a capire perchè ma un programma c++ mi crasha quando esegue un'istruzione for. in pratica


cout << endl << "uno";
if (capacity > limit ) {
cout << "due";
for (q = 1; q < iterazioni; q++) {
cout << "tre";


A video mi manda "uno", mi manda "due"... ma al "tre" NON ci arriva perchè mi crasha con il seguente messaggio:


L'istruzione a "0x0041d641" ha fatto riferimento alla memoria a "0x000001c0". La memoria non poteva essere "read".

Fare clic su OK per terminare l'applicazione
Fare clic su Annulla per eseguire il debug dell'applicazione



Sto decisamente impazzendo, l'unica possibilità credo che sia un problema di gestione della memoria..
Qualcuno ha idee su come venirne fuori?

Uso Eclipse+CDT+MinGW

tglman
28-06-2005, 09:56
il problema secondo me risale alla dichiarazione e utilizzo delle variabili "q" e "iterazioni", come sintassi è corretta.......... ma quelle due variabili cosa sono???

RaouL_BennetH
28-06-2005, 12:35
non vedendo nessun'altra parte del codice sorgente, mi sorge però spontanea una domanda in base alla mia (fallace) logica:

se hai: capacity > limit

il programma non dovrebbe fermarsi?

Facendo un discorso meramente intuitivo, leggendo il nome delle variabili, è come se leggessi:

se la capacità è maggiore del limite vai avanti.

Scusa se sparo, ma credo manchino i pezzi essenziali del tuo codice. :)

71104
28-06-2005, 13:07
posta il sorgente intero o almeno il codice di tutta la funzione, è un problema sicuramente banale.

PS: ma fare il debug no eh? :D

illy
28-06-2005, 14:21
secondo me il problema potrebbe essere banalmente nell'assegnameto di "iterazioni", controlla

dupa
28-06-2005, 16:35
La situazione è molto più complicata del previsto.

Alcune premesse.. in compilazione non ci sono problemi.. quindi in termini di sintassi il codice è corretto.

in pratica ero convinto che quel

cout << "tre"

non venisse eseguito (almeno credo.. visto che a video non appariva nulla)

successivamente però all'interno di quel for ci sono delle istruzioni nelle quali si butta un un ofstream alcuni valori... e parte di quelle istruzioni viene eseguita :fagiano:


Cerco di farmi capire


cout << endl << "uno";
if (capacity > limit ) {
cout << "due";
for (q = 1; q < iterazioni; q++) {
cout << "tre";
// altra roba....
oggettoofstream << "pippo";



In pratica a video mi appare "uno" e "due", e NON mi appare "tre" ma nel file puntato da oggettoofstream mi appare "pippo".

Mi sembra una cosa totalmente assurda..
Purtroppo non posso postare il codice completo visto che una roba sviluppata all'univ, non scritta da me e quindi nn vi posso dare il tutto (anche perchè sono svariate migliaia di righe di codice e dubito che abbiate la pazienza di leggervele ;) )

Cmq altra cosa...
in pratica prima il codice era fatto così

c'erano varie classi ognuna definite in un .h

pippo.h
pluto.h
gigio.h
topo.h

e infine c'era:

pollo.cpp

che conteneva un main... che caricava da un file i dati da esaminare..

Ora visto che la mia parte di lavoro sulla tesi consiste nell'estendere il lavoro fatto precedentemente ho trasformato pollo in modo da farlo diventare una classe che al posto di leggere i dati da file li ottiene andando a impostare i suoi attributi da un altro file con un main..

ho cambiato pollo.cpp in pollo.h

ora quindi c'è:

pippo.h
pluto.h
gigio.h
topo.h
pollo.h

e

main.cpp


In sostanza.. l'errore mi salta fuori nella fase di elaborazione dei dati.. il fatto è che nella versione con pollo.cpp NON mi dà questo errore.

In quella invece dove l'ho reso una classe mi dà l'errore anche se il codice per quella sezione è IDENTICO..

Sinceramente la cosa più probabile è un problema di gestione della memoria, allocazione ecc. ecc. perchè tra le varie classi ce ne sono alcune che usano grosse matrice e roba del genere.. :(

Son disperato.. nn so quando riuscirò a finire sta cavolo di tesi, se mai la finirò..

Molz
29-06-2005, 08:25
Se non stampa "tre" molto probabilmente e' perché lo tiene nel buffer e non arriva a svuotarlo a video prima di crushare, prova a scrivere così

cout << "tre"<<endl;
visto che l'istruzione oggettoofstream << "pippo"; la esegue, l'errore deve essere dopo, quindi metti una stampa a ogni riga di codice dopo per individuarlo.
Buona fortuna

Poix81
29-06-2005, 11:30
prova a fare un flush dello standard output.

ciao ciao