|
|
|
|
Strumenti |
09-05-2016, 13:23 | #1 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
[C] Clion - Strano comportamento della console IDE
Come da titolo, sto usando CLion come IDE.
Non riesco a capire per quale ragione mi runna il programma a metà In parole povere: devo stampare il contenuto di una matrice, a volte (raramente) lo stampa tutto, a volte si ferma prima della fine. Con il terminale di ubuntu nessun problema: stampa tutta la matrice. Probabilmente è una banalità, ma non riesco a capire dove mettere le mani. Se avete qualche idea, tutto è ben accetto |
09-05-2016, 16:18 | #2 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
Quote:
In ogni caso, allego la funzione che crea la matrice, e la funzione che la stampa Codice:
Posto** creaSala(){ Posto **v = calloc(numerofile,sizeof(Posto*)); assert(v!=NULL); int fila ; int posto; Posto *seat; for(fila=0;fila<numerofile;fila++){ *(v+fila)=calloc(postixfila,sizeof(Posto)); assert(*(v+fila)!= NULL); for(posto=0;posto<postixfila;posto++){ seat = nuovoPosto(posto+1, fila+1); v[fila][posto] = *seat; } } return v; } void stampaSala(Posto **sala){ int fila; int posto; int numposto; int numfila; Posto *temp; for(fila =0; fila<numerofile; fila++){ printf("--- Fila numero %d --- \n",numfila+1 ); for(posto=0;posto<postixfila;posto++){ temp = &sala[fila][posto]; numposto =getnumposto(temp); numfila = getnumfila(temp); printf("numero di fila: %d \n",numfila ); printf("numero di posto: %d \n",numposto ); if(temp->occupato==false){ printf("il posto è libero \n\n"); } } } } |
|
09-05-2016, 21:23 | #3 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
Quote:
Ho notato un'altra cosa: con lo stesso input il programma si "ferma" in diversi punti. A volte scrive qualche riga, a volte quasi tutte, a volte tutto. Potrebbe essere un problema di timeout ? Ultima modifica di Vexem : 09-05-2016 alle 21:29. |
|
10-05-2016, 06:37 | #4 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
cosa fa nuovoPosto()?
__________________
In God we trust; all others bring data |
10-05-2016, 08:24 | #5 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
È il costruttore della struct posto.
Gli argomenti indicano fila e numero del posto.
__________________
CPU AMD Ryzen 5 3600X | Motherboard MSI B450 Gaming Plus | GPU ASUS Dual Radeon RX 5700 EVO OC Edition 8GB | RAM Crucial Ballistix Elite 2*8GB 3600MHz CL16 DDR4 | PSU LC-Power LC6850M 850W | SSD Crucial P2 CT1000P2SSD8 | Monitor Samsung U28E590D + Samsung U28R552UQR | Case be quiet! Pure Base 500DX Black | Speakers Logitech Z623 |
10-05-2016, 08:30 | #6 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Quello che mi fa pensare e' l'uso della nuovoPosto(); Codice:
seat = nuovoPosto(posto+1, fila+1);
__________________
In God we trust; all others bring data |
|
10-05-2016, 09:09 | #7 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
Quote:
Codice:
#include <stdlib.h> #include "Posto.h" #include <stdbool.h> Posto *nuovoPosto(int numposto, int numfila){ Posto *x = (Posto*)calloc(1,sizeof(Posto)); x->numfila = numfila; x->numposto = numposto; x->occupato = false; } void cancellaPosto(Posto *x){ free(x); } void prenotaposto(Posto *x){ x->occupato=true; } void cancellaprenotazione(Posto *x){ x->occupato=false; } int getnumposto(Posto *x){ return x->numposto; } int getnumfila(Posto *x){ return x->numfila; } void setnum(Posto *x,int num){ x->numposto=num; } void setfila(Posto *x,int fila){ x->numfila=fila; } Codice:
void distruggiSala(Posto **v,int n){ int i; for(i=0;i<n;i++){ free(v[i]);} free(v) ; } Credo comunque di aver dimenticato una free(seat), ma ti anticipo subito che il risultato non cambia Ultima modifica di Vexem : 10-05-2016 alle 09:20. |
|
10-05-2016, 09:29 | #8 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ok, grazie.
Una cosa che salta subito all'occhio e' Codice:
seat = nuovoPosto(posto+1, fila+1); Codice:
v[fila][posto] = *seat; Cosa succede a seat? Sembra proprio che venga perso, vale a dire stai perdendo memoria. Non credo che questo sia il tuo problema, ma prima di tutto lo sistemerei, visto che il leakage e' in un ciclo e quindi vai a perdere piu' record. Per quanto riguarda il problema della stampa parziale: hai provato a mettere una printf() ad ogni esecuzione del ciclo?
__________________
In God we trust; all others bring data |
10-05-2016, 09:40 | #9 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
Quote:
Quindi la free(seat) va inserita nel ciclo, non fuori ? In ogni caso ho provato a mettere una printf() ovunque, il processo semplicemente si interrompe all'improvviso, ogni volta in un punto diverso. In ogni caso, grazie per il tuo aiuto ! |
|
10-05-2016, 09:54 | #10 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Hai creato una funzione cancellaPosto(), ti suggerisco di usarla. Per quanto riguarda la nuovoPosto() non fai il controllo se la memoria e' effettivamente allocata. Dalle altre parti hai messo un'assert, ti suggerisco di fare altrettanto. Tornando al problema principale (i.e. il processo si interrompe all'improvviso): purtroppo stiamo lavorando su pezzi di codice, quindi si possono fare solo delle ipotesi. Quando un processo si interrompe all'improvviso, normalmente controllo che la memoria a cui ha fatto accesso sia valida (allocata, inizializzata, ...). Purtroppo non lo si puo' fare, qui; lo puoi fare? Se ti serve un parere, puoi pubblicare il codice per intero. Altra cosa: i cicli sono regolati dalle variabili numerofila e postixfila ed anche quelli compaiono nel codice all'improvviso. Occorrerebbe accertarsi che il loro valore sia corretto e non vengano sovrascritte inavvertitamente. Inoltre, conoscendomi (e' un errore che faccio spesso) controllerei anche lo SCOPE di quelle variabili: magari hanno il valore corretto ma inavvertitamente potrei aver dichiarato una variabile locale con lo stesso nome, che quindi andrebbe a nascondere quella con il valore corretto. Sei in questo caso? Quindi, visto che parlavamo di printf(), stamperei: - le variabili numerofile e postixfila all'inizio dei cicli; - le variabili di ciclo, le vorrei vedere incrementarsi; - metterei una printf() di saluti alla fine del programma, per vedere se effettivamente arrivo fino li'. Infine mi accerterei che non sia uno dei soliti problemi di certi IDE tipo: bufferizzazione dell'output, chiusura immediata della finestra al termine dell'esecuzione, ecc.
__________________
In God we trust; all others bring data |
|
10-05-2016, 10:10 | #11 | ||||
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
Quote:
Non ero sicuro se metterla dentro o fuori dal ciclo. Quote:
Codice:
int main() { printf("Inserire numero di file: "); scanf("%d",&numerofile); printf("Inserire posti per fila: "); scanf("%d",&postixfila); Sala = creaSala(); stampaSala(Sala); distruggiSala(Sala,numerofile); return 0;} http://paste.ofcode.org/pJjRr76KqbHXM4KeMV9Jaf Posto.h http://paste.ofcode.org/FUrpAijA6tLFa2RhnQe8r9 Quote:
Quote:
Ultima modifica di Vexem : 10-05-2016 alle 10:19. |
||||
10-05-2016, 10:27 | #12 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Me n'e' scappata una importante. Perdona, la vecchiaia...
Codice:
#include <stdlib.h> #include "Posto.h" #include <stdbool.h> Posto *nuovoPosto(int numposto, int numfila){ Posto *x = (Posto*)calloc(1,sizeof(Posto)); x->numfila = numfila; x->numposto = numposto; x->occupato = false; } Altrimenti il programma puo' far di tutto, compreso terminare inaspettatamente.
__________________
In God we trust; all others bring data |
10-05-2016, 10:31 | #13 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
Quote:
Ho inserito un "return x" ma niente, continua ad interrompersi. Strano che il compilatore non mi abbia detto nulla. Tu hai provato a farlo partire ? Ecco cosa fa Ultima modifica di Vexem : 10-05-2016 alle 10:44. |
|
10-05-2016, 10:45 | #14 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Sembra funzionare. Cmq resta la curiosita': hai aggiunto le printf()? Soprattutto: immagino che il tuo ambiente ti dia a disposizione un debugger. Hai provato a farlo girare con il debugger? Cosa ti dice?
__________________
In God we trust; all others bring data |
|
10-05-2016, 10:51 | #15 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ops, ho visto l'immagine DOPO aver postato la mia risposta.
Come ti dicevo, ho provato a farlo girare e sembra funzionare, ma cosi' non e' nel tuo ambiente. Nel mio test ho desunto l'implementazione di Posto.h dal resto del codice; potresti pubblicare invece la tua versione?
__________________
In God we trust; all others bring data |
10-05-2016, 10:54 | #16 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
Quote:
Il debugger me lo runna correttamente, ma non so come interpretare questo fatto :| ecco Posto.h http://paste.ofcode.org/FUrpAijA6tLFa2RhnQe8r9 |
|
10-05-2016, 11:15 | #17 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Davvero strano, anche perche' a me continua a funzionare.
C'e' un altro errore minore: Codice:
printf("--- Fila numero %d --- \n", numfila + 1); Codice:
printf("--- Fila numero %d --- \n", fila + 1); Sarebbe opportuno provare ad escludere delle parti per vedere se almeno si arriva alla fine. Il programma pero' e' gia' piuttosto scarno, non so cosa si possa escludere. Proverei escludendo l'inizializzazione (i.e. commentandola): Codice:
Posto** creaSala(){ Posto **v = (Posto **)calloc(numerofile, sizeof(Posto*)); assert(v != NULL); int fila; int posto; Posto *seat; for (fila = 0; fila<numerofile; fila++){ *(v + fila) = (Posto *)calloc(postixfila, sizeof(Posto)); assert(*(v + fila) != NULL); for (posto = 0; posto<postixfila; posto++){ //seat = nuovoPosto(posto + 1, fila + 1); //v[fila][posto] = *seat; //free(seat); } } return v; } ALTRA COSA: aspetta a fare la distruggiSala(), commenta anche quella. Vediamo se si arriva in fondo, prima.
__________________
In God we trust; all others bring data |
10-05-2016, 11:39 | #18 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
Quote:
Commentando l'inizializzazione, stampa tutti 0 ma si interrompe comunque. Togliendo distruggiSala() non cambia nulla (oltre all'ovvio memory leak). A questo punto direi che è un problema (o magari un'impostazione) dell'IDE. Provo a farlo runnare sulla macchina virtuale con ubuntu del portatile , vediamo cosa succede. Male che vada, cambio ambiente |
|
10-05-2016, 12:29 | #19 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Per esempio, cambia la stampa: Codice:
void stampaSala(Posto **sala){ int fila; int posto; int numposto; int numfila; Posto *temp; for (fila = 0; fila<numerofile; fila++){ //printf("--- Fila numero %d --- \n", numfila + 1); originale printf("--- Fila numero %d --- \n", fila + 1); for (posto = 0; posto<postixfila; posto++){ temp = &sala[fila][posto]; // numposto = getnumposto(temp); // numfila = getnumfila(temp); numposto = temp->numposto; numfila = temp->numfila; printf("numero di fila: %d \n", numfila); printf("numero di posto: %d \n", numposto); // if (temp->occupato == false){ // printf("il posto e' libero \n\n"); // } } } } Altra cosa: incrementa il livello dei warning fino al massimo, cioe' al livello piu' pedante possibile, cosi' da avere piu' informazioni su quanto sta succedendo...
__________________
In God we trust; all others bring data |
|
10-05-2016, 14:03 | #20 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 387
|
Quote:
Nessun warning compilando con -Wall. Oggi pomeriggio cercherò un altro ide su cui emigrare In ogni caso, grazie mille ! |
|
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:41.