PROBLEMA Salve a tutti, problema esecuzione programma con Dev C++?

Pubblicità

_Omi_

Utente Attivo
Messaggi
259
Reazioni
21
Punteggio
38
Salve ho un grossissimo problema con Dev C++, praticamente quando compilo e poi eseguo il programma, mi apre la finestra Cmd ma il programma è come se non si avviasse. E' tutto nero e dopo un po termina la sua esecuzione, sempre con la finestra Cmd aperta però. Non capisco davvero cosa possa essere visto che il programma funzionava fino ad ieri e poi ad un tratto non funziona più dopo 3-4 esecuzioni. Chiedi un aiuto a voi esperti. Ah dimenticavo di dirvi, che sono alle prime armi con il C++, quindi andateci piano :D.
 

Allegati

  • aaa.webp
    aaa.webp
    6.9 KB · Visualizzazioni: 244
Va in crash, ma senza codice non possiamo dirti molto. ;)
Posso copia incollare il codice qui? Pensavo fosse vietato, pardon. Eccolo comunque, è un semplice cerca di un numero tra un numero definito di elementi:
#include <iostream>
using namespace std;

int main(){
int dim,riemp,cerca;
int vet[dim];
int D,R=-1;
do{
do{
cout<<"Inserisci la dimensione del vettore : ";
cin>>dim;
if(dim<0 || dim>100)
cout<<"La dimensione deve essere un valore numerico compreso tra 0 e 100\n\n"; //Blocco definizione riempimento e dimensione (7-23)//
}while(dim<0 || dim>100);
do{
cout<<"Inserisci il riempimento : ";
cin>>riemp;
if(riemp<0 || riemp>100)
cout<<"Il riempimento deve essere valore numerico compreso tra 1 e 100\n\n";
}while(riemp<0 || riemp>100);
if(riemp>dim)
cout<<"Il riempimento non puo\' essere maggiore della dimensione\n\n";
}while(riemp>dim);

if(riemp==0 || dim==0)
cout<<"L'insieme e\' vuoto.\n";
else{
for(int i=0; i<riemp; i++){
cout<<"Inserisci l'elemento numero "<<i+1<<": ";
cin>>vet;
}
cout<<"\n";
cout<<"Inserisci il numero da cercare : ";
cin>>cerca;



do{
D++;
if(cerca==vet[D])
cout<<"Il primo elemento trovato e\' in posizione : "<<D+1<<endl;
}while(cerca!=vet[D] && D<riemp);

}


return 0;
system("PAUSE");
}

--- i due messaggi sono stati uniti ---
Posso copia incollare il codice qui? Pensavo fosse vietato, pardon. Eccolo comunque, è un semplice cerca di un numero tra un numero definito di elementi:
#include <iostream>
using namespace std;

int main(){
int dim,riemp,cerca;
int vet[dim];
int D,R=-1;
do{
do{
cout<<"Inserisci la dimensione del vettore : ";
cin>>dim;
if(dim<0 || dim>100)
cout<<"La dimensione deve essere un valore numerico compreso tra 0 e 100\n\n"; //Blocco definizione riempimento e dimensione (7-23)//
}while(dim<0 || dim>100);
do{
cout<<"Inserisci il riempimento : ";
cin>>riemp;
if(riemp<0 || riemp>100)
cout<<"Il riempimento deve essere valore numerico compreso tra 1 e 100\n\n";
}while(riemp<0 || riemp>100);
if(riemp>dim)
cout<<"Il riempimento non puo\' essere maggiore della dimensione\n\n";
}while(riemp>dim);

if(riemp==0 || dim==0)
cout<<"L'insieme e\' vuoto.\n";
else{
for(int i=0; i<riemp; i++){
cout<<"Inserisci l'elemento numero "<<i+1<<": ";
cin>>vet;
}
cout<<"\n";
cout<<"Inserisci il numero da cercare : ";
cin>>cerca;



do{
D++;
if(cerca==vet[D])
cout<<"Il primo elemento trovato e\' in posizione : "<<D+1<<endl;
}while(cerca!=vet[D] && D<riemp);

}



return 0;
system("PAUSE");
}


P.S. Devo ancora finire di completare il programma.
 
L’errore è evidentemente in int vet[dim]
Se si vuole utilizzare l’array C-type è bene imparare come effettivamente si usa.
Non puoi dichiarare un array con una dimensione indefinita. Perciò:
C++:
const int size = 100;
int vet[size];

cout << "Inserisci la ...";
int dim;
cin >> dim;
//...
Comunque manca l’indentazione e il codice va sotto l’appropriato tag (come il mio).

Comunque DevC++ non va più utilizzato perché non più supportato
 
L’errore è evidentemente in int vet[dim]
Se si vuole utilizzare l’array C-type è bene imparare come effettivamente si usa.
Non puoi dichiarare un array con una dimensione indefinita. Perciò:
C++:
const int size = 100;
int vet[size];

cout << "Inserisci la ...";
int dim;
cin >> dim;
//...
Comunque manca l’indentazione e il codice va sotto l’appropriato tag (come il mio).

Ciao, no ho inserito poi dopo la dimensione. Comunque ora penso di avere risolto, praticamente in alto a destra del programma Dev ci sono una serie di versioni di Dev che si può scegliere, tra questi Dev per 64 bit e Dev per 32 bit. Quando eseguivo prima ero su Dev 64 bit e quindi penso che un bug non mi eseguiva il programma, appena ho cliccato su Dev 32 bit, me lo ha eseguito.
Grazie a tutti per la disponibilità.
 
Devi utilizzare il tag CODE quando posti codice, specificando se vuoi anche il linguaggio (per evidenziare la sintassi); il problema di formattazione è stato causato da questo.

Comunque è sbagliato ciò che stai facendo, come ti ha fatto notare anche _Achille.
Il tuo vettore ha dimensione 0, non quella specificata. Funziona solo "per caso", in quanto sovrascrivi zone di memoria (virtuale) alle quale puoi accedere, altrimenti avresti errori.
La variabile D non è mai inizializzata, contiene un valore "sporco" però. Quando incrementi vai ad incrementare questo valore.
 
Devi utilizzare il tag CODE quando posti codice, specificando se vuoi anche il linguaggio (per evidenziare la sintassi); il problema di formattazione è stato causato da questo.

Comunque è sbagliato ciò che stai facendo, come ti ha fatto notare anche _Achille.
Il tuo vettore ha dimensione 0, non quella specificata. Funziona solo "per caso", in quanto sovrascrivi zone di memoria (virtuale) alle quale puoi accedere, altrimenti avresti errori.
La variabile D non è mai inizializzata, contiene un valore "sporco" però. Quando incrementi vai ad incrementare questo valore.

Ah ho capito, quindi non mi da errore, perchè per caso dim è inizializzata in zone di memoria "scrivibili". Non me ne ero reso conto. A questo punto però già che ci troviamo, vorrei porti una domanda. Se ho un vet[8] e int D=0. Se incremento con un ciclo for il vet[D] da 0 a 10 però, quindi inserisco un elemento in più rispetto a quello che poteva contenere il vettore, sto scrivendo su aree di memoria non prefissate giusto? Perchè il programma non mi da errore..
 
Il programma non ti dà errore perché il vettore è definito localmente e quindi viene allocato nello stack invece che nello heap. Anche se quindi tu non lo allochi, il programma accede a memoria "legalmente" accessibile (lo stack) anche se non allocata (ossia il compilatore non ne ha riservato spazio). In parole povere, vai a scrivere e leggere una zona di memoria che viene magari riservata ad altro, con le dovute conseguenze. Tieni conto che in questi casi il programma si comporta in maniera diversa se lo usi nel debugger (dove la memoria viene monitorata) o nella versione compilata.
È il classico errore di allocazione di memoria e di memoria corrotta che fa impazzire i programmatori C e C++. In piccoli programmi come il tuo l'errore è facile da trovare. Quando si hanno migliaia di linee di codice, sono dolori.
 
Quelle variabili e quell'array sono nello stack. Considera questo codice, che è più breve (in C).

C:
#include <stdio.h>

int main()
{
    int var = 1;
    int array[2];
    
    array[2] = 100;
    
    printf("%d\n", var);
    
    return 0;

}

Ho compilato con gcc. Il risultato è, forse ti sorprenderà, 100. Questo perchè l'array è di 2 dimensioni; subito dopo sullo stack ci sarebbe la variabile 'var', ma uscendo dal limite superiore dell'array vai a sovrascrivere la cella di memoria destinata invece alla variabile.

Ho modificato leggermente il codice:
C:
#include <stdio.h>

int main()
{
    int var = 1;
    int array[2];
    
    array[2] = 100;
    
    printf("%d\n", var);
    printf("Indirizzi: %p | %p\n", &array, &var);
    
    return 0;
}

L'output evidenzia quelli che sono gli indirizzi: il primo elemento del vettore e quello della variabile.

Codice:
100
Indirizzi: 0060FEA4 | 0060FEAC

0x0060FEA4 è quindi array[0]; va da sè che array[1] sia 0x0060FEA8 ed array[2] invece 0x0060FEA8C, che è lo stesso dell'indirizzo della variabile.

L'array è semplicemente uno spazio allocato, in questo caso staticamente, di un certo numero di elementi. In alcuni linguaggi (Java ad esempio) vengono sollevate eccezioni quando si superano i limiti di un array, in altri no.

Non so se sai cosa accade quando accedi ad un array nella pratica. L'indice che passi tra parentesi viene in realtà moltiplicato per la dimensione degli elementi che contiene; questo valore viene sommato all'indirizzo del primo elemento.
Per essere chiaro: se hai un array di int, dell'ampiezza di 32bit, ovvero 4 byte, ed accedi alla posizione 0, accade questo:

Codice:
(0 * 4) + 0x0060FEA4 = 0x0060FEA4    // Primo elemento
(1 * 4) + 0x0060FEA4  = 0x0060FEA8  // Secondo elemento
(2 * 4) + 0x0060FEA4  = 0x0060FEAC  // Terzo elelemento

nel caso sopra riportato non si trova il terzo elemento, ma si sovrascrive lo stack.
 
Pubblicità
Pubblicità
Indietro
Top