[C] Programma che funziona solo con il debug

Da JAVA a C# passando per PHP, SQL ed HTML
Avatar utente
Alessio89
Messaggi: 8097
Iscritto il: martedì 29 novembre 2011, 23:47

Re: [C] Programma che funziona solo con il debug

Messaggio da Alessio89 »

la variabile "minDist" non è inizializzata.

se compili in modalità ANSI-C (c89) o ISO C90 dovrebbe darti errore.

stai usando per caso unilcompilatore C++? Perché anche se compili in modalità C99 o C11 dovrebbe darti errore visto che le variabili vanno comunque inizializzate in C, l'unica differenza è che le versioni recenti del linguaggio permettono di dichiararle in qualsivoglia punto dello scope.

potrebbero esserci altri errori ma intanto ti posso dire che questo sicuramente può (ma non necessariamente) farti crashare l'applicazione poco dopo averla avviata.

Avatar utente
Malo
Messaggi: 156
Iscritto il: sabato 3 dicembre 2011, 14:33

Re: [C] Programma che funziona solo con il debug

Messaggio da Malo »

perdona l'ignoranza ma devo per forza inizializzarla all'inizio, anche se poi lo fa il programma quando richiama la funzione findmin? Come mai? Cmq a me non da nessun problema perchè non è un errore...purtroppo le cose non cambiano anche se la inizializzo...
Ecco la mia CONFIGURAZIONE PC:

Alimentatore RASURBO Silent&Power DLP-55.1 - 550 W, CPU AMD Phenom II X4 960T, Mobo ASUSTeK M5A99X EVO, RAM 2x2GB DD3-1333 Corsair, Video ATI HD 6770, HDD Seagate barracuda SATA3 2TB, Case PowerStation Recom, Mouse logitech MX1000, Windows 7 Ultimate, Monitor Samsung LT27A300 27" LED LCD, Audio Dolby digital 5.1 logitech

Immagine

Avatar utente
Alessio89
Messaggi: 8097
Iscritto il: martedì 29 novembre 2011, 23:47

Re: [C] Programma che funziona solo con il debug

Messaggio da Alessio89 »

Nel C tutte le variabili vanno inizializzate (ed è buona pratica farlo sempre e indipendentemente dal linguaggio).
Nel C89/90 è obbligatorio dichiararle all'inizio dello scope.
Nel C99, e di conseguenza nel C11, puoi dichiararle dove ti pare all'interno dello scope.

Il C++ è diverso, non solo puoi dichiararle dove ti pare ma puoi anche fare a meno di inizializzarle (pessima scelta del comitato ISO) in quanto il comportamento è indefinito (ovvero sta a chi implementa il compilatore decidere come trattare la cosa). Il motivo "ufficiale" è che così facendo chi implementa il compilatore può avere maggiori margini di ottimizzazione o di sicurezza di codice a seconda dell'hardware o del sistema di riferimento, mentre per la maggior parte delle volte questa facoltà viene utilizzata soprattutto per il disassembling a runtime (anche se l'OS in genere ha dei meccanismi di protezione c'è sempre qualche trucchetto per aggirarli).

Pertanto riassumendo: dagli un valore a quella variabile o avrà dentro solo garbage e a seconda di cosa conterrà potrà fare o meno crashare il programma. Non ho letto ancora la logica del programma ma ho visto subito una condizione su quella variabile, probabilmente è lì il problema e poi scusami ma utilizzare una variabile non inizializzata e andarla a leggere non mi sembra una cosa molto corretta da parte di qualsiasi logica di qualsiasi programma.

Avatar utente
Malo
Messaggi: 156
Iscritto il: sabato 3 dicembre 2011, 14:33

Re: [C] Programma che funziona solo con il debug

Messaggio da Malo »

condordo pienamente, tuttavia la variabile ti ripeto che prima di venire letta viene inizializzata dalla funzione findmin! Purtroppo ci avevo già pensato anche io che dentro c'è della roba a caso. Infatti anche inizializzandola, giusto per stare tranquilli, non cambia nulla.
Ecco la mia CONFIGURAZIONE PC:

Alimentatore RASURBO Silent&Power DLP-55.1 - 550 W, CPU AMD Phenom II X4 960T, Mobo ASUSTeK M5A99X EVO, RAM 2x2GB DD3-1333 Corsair, Video ATI HD 6770, HDD Seagate barracuda SATA3 2TB, Case PowerStation Recom, Mouse logitech MX1000, Windows 7 Ultimate, Monitor Samsung LT27A300 27" LED LCD, Audio Dolby digital 5.1 logitech

Immagine

Avatar utente
Malo
Messaggi: 156
Iscritto il: sabato 3 dicembre 2011, 14:33

Re: [C] Programma che funziona solo con il debug

Messaggio da Malo »

gia che ci sono volevo chiederti: ma a sto punto devo inizializzare anche le variabili per gli indici (cioè ad esempio "i" e "j" che le uso solo nei for e basta)?

PS: Ho fatto che inizializzare tutto e bon. Anzi ho fatto di meglio! Ho fatto che pulire tutte le strutture dati una volta allocate in modo che al loro interno ci siano tutti zeri e non porcheria. Ti posto i file aggiornati:
tsp_ga.c
tsp_ga_lib.c
tsp_ga_lib.h
Tuttavia la situa non cambia...
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
Ecco la mia CONFIGURAZIONE PC:

Alimentatore RASURBO Silent&Power DLP-55.1 - 550 W, CPU AMD Phenom II X4 960T, Mobo ASUSTeK M5A99X EVO, RAM 2x2GB DD3-1333 Corsair, Video ATI HD 6770, HDD Seagate barracuda SATA3 2TB, Case PowerStation Recom, Mouse logitech MX1000, Windows 7 Ultimate, Monitor Samsung LT27A300 27" LED LCD, Audio Dolby digital 5.1 logitech

Immagine

Avatar utente
Alessio89
Messaggi: 8097
Iscritto il: martedì 29 novembre 2011, 23:47

Re: [C] Programma che funziona solo con il debug

Messaggio da Alessio89 »

Malo ha scritto:condordo pienamente, tuttavia la variabile ti ripeto che prima di venire letta viene inizializzata dalla funzione findmin! Purtroppo ci avevo già pensato anche io che dentro c'è della roba a caso. Infatti anche inizializzandola, giusto per stare tranquilli, non cambia nulla.
Può essere letta anche se non inizializzata nel caso utilizzi con il compilatore C++, ma il risultato varia a seconda del garbage che dipende non solo dall'OS (Windows ad esempio sovrascrive con 0 ogni locazione di memoria di un programma una volta che questo è terminato) ma anche dall'andamento dello Stack e del programma in sé.
Malo ha scritto:gia che ci sono volevo chiederti: ma a sto punto devo inizializzare anche le variabili per gli indici (cioè ad esempio "i" e "j" che le uso solo nei for e basta)?

PS: Ho fatto che inizializzare tutto e bon. Anzi ho fatto di meglio! Ho fatto che pulire tutte le strutture dati una volta allocate in modo che al loro interno ci siano tutti zeri e non porcheria. Ti posto i file aggiornati:
tsp_ga.c
tsp_ga_lib.c
tsp_ga_lib.h
Tuttavia la situa non cambia...
In che senso inizializzare le variabili i e j? è ovvio che vanno inizializzate altrimenti come fai a ciclare?

Il C (e il C++) non hanno i valori di default dei tipi fondamentali come in java.

Ora non ho tempo di guardare, ma ti consiglio di utilizzare il debugger a questo punto. Solitamente io consiglierei di utilizzare il compilatore C++ anche per il codice C in quanto solitamente più ottimizzati e certe schifezze che puoi fare col C non te le passa o ti da quantomeno dei warning, tuttavia in questo caso ti consiglio di forzare il compilatore C e non quello C++, potrebbero esserci altre variabili non inizializzate (che sono forse l'unica cosa che il compilatore C ti trova sempre rispetto a quello C++ che al massimo da dei warning se opportunamente configurato).

Avatar utente
Malo
Messaggi: 156
Iscritto il: sabato 3 dicembre 2011, 14:33

Re: [C] Programma che funziona solo con il debug

Messaggio da Malo »

Utilizzo gnu gcc compiler integrato in code::blocks. Ho inzializzato tutte tutte le variabili, come ti dicevo, almeno bon. Ad ogni modo non capisco la tua domanda
In che senso inizializzare le variabili i e j? è ovvio che vanno inizializzate altrimenti come fai a ciclare?
essendo variabili indice che uso appunto solo per i cicli for, queste vengono inzializzate in automatico quando scrivo
for(i=0; condizione2; i++)
quell'i=0 me la inizializza a zero, quindi anche se prima conteneva garbage, ora contiene zero e cicla. Stesso discorso vale per le altre che non avevo inzializzato. Ti assicuro che il programma non andava a leggere niente di sporco, solo le inzializzava dopo nel codice e non subito all'inizio.
Ad ogni modo, ti ripeto che ora il problema non dovrebbe più sussistere perchè è tutto inizializzato (anche le varie strutture dati).
Grazie mille dell'aiuto, quando hai tempo di guardare il codice, il patatrak avviene la quarta volta (se lasci i valori in input così come sono) che viene richiamata loadRow(tmpPop,bestOf4Route,k,n); cioè alla riga 207
Inoltre nota che se come valori di n metti 5 e di popSize metti 8 (all'inizio nella dichiarazione), il programma termina tranquillamente (ovviamente solo in debug, se eseguo la release si impalla). proprio non capisco :(
Ecco la mia CONFIGURAZIONE PC:

Alimentatore RASURBO Silent&Power DLP-55.1 - 550 W, CPU AMD Phenom II X4 960T, Mobo ASUSTeK M5A99X EVO, RAM 2x2GB DD3-1333 Corsair, Video ATI HD 6770, HDD Seagate barracuda SATA3 2TB, Case PowerStation Recom, Mouse logitech MX1000, Windows 7 Ultimate, Monitor Samsung LT27A300 27" LED LCD, Audio Dolby digital 5.1 logitech

Immagine

Avatar utente
Malo
Messaggi: 156
Iscritto il: sabato 3 dicembre 2011, 14:33

Re: [C] Programma che funziona solo con il debug

Messaggio da Malo »

Volevo avvisare che ho risolto, quindi il thread si può anche chiudere :)
In pratica le matrici allocate in modo dinamico non erano allocate correttamente...ho risolto usando quello che c'è scritto qui http://stackoverflow.com/questions/9177 ... rrays-in-c
Grazie comunque!
Ecco la mia CONFIGURAZIONE PC:

Alimentatore RASURBO Silent&Power DLP-55.1 - 550 W, CPU AMD Phenom II X4 960T, Mobo ASUSTeK M5A99X EVO, RAM 2x2GB DD3-1333 Corsair, Video ATI HD 6770, HDD Seagate barracuda SATA3 2TB, Case PowerStation Recom, Mouse logitech MX1000, Windows 7 Ultimate, Monitor Samsung LT27A300 27" LED LCD, Audio Dolby digital 5.1 logitech

Immagine

Bloccato