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

_Omi_

Utente Attivo
257
21
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.png
    aaa.png
    7.9 KB · Visualizzazioni: 244

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Va in crash, ma senza codice non possiamo dirti molto. ;)
 

_Omi_

Utente Attivo
257
21
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");
}

Post unito automaticamente:

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.
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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
 
  • Mi piace
Reazioni: Andretti60

_Omi_

Utente Attivo
257
21
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à.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 

_Omi_

Utente Attivo
257
21
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..
 

Andretti60

Utente Èlite
6,440
5,091
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.
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 
  • Mi piace
Reazioni: _Achille

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili