Newsgroup: it.comp.lang.c++
Titolo: Errore eccezione non gestita

Ciao a tutti,
premetto che sono niubbo di C++, mentre in passato ho avuto a che fare col
C.
Per imparare, sto scrivendo un programma per controllare le giocate del
superenalotto (tema di moda). Sono alla prima fase, ovvero inserimento
delle giocate.
Ho creato una classe "giocata" in cui sono definiti il n° di schedina e
il n° di giocata, per il confronto coi numeri vincenti ci si penserà in
un secondo momento.
L'allocazione di memoria ovviamente è dinamica, e vengono creati tanti
oggetti "giocata" quanto appunto sono le giocate.
Veniamo al problema, il compilatore compila senza errori, parte il
programma, inserisco numero di schedine e di giocate ed è ok, ma
all'inserimento del primo numero della prima sestina, il programma crasha
con errore di "Eccezione non gestita a 0x104bf00a in primo.exe:
0xC0000005: Violazione di accesso nella scrittura del percorso 0xcdcdcdd5".
Se qualcuno ha qualche idea ringrazio, molto, allego il sorgente sotto.
#include <iostream>
using namespace std;
class giocata
{
public:
	int s;		//numero schedina
	int g;		//numero giocata
	int c[6];	//sestina giocata
};
int main ()
{ 
	giocata ** a;
	int b=-1,n,g,i,j,k;
	int num;
	n=6;
	cout << "Inserisci il numero di schedine: ";
	cin >> num;
	cout << "Inserisci il numero di giocate per scheda: ";
	cin >> g;
	a = new (nothrow) giocata * [num*g];
 
	for(i=0;i<num;++i)
	{
		cout << "- Schedina No " << i+1 << endl;
		for(j=0;j<g;++i)
		{
			cout << "- Giocata No " << j+1 << endl;
			for(k=0;k<6;++k)
			{
				b++;
				cout << "Inserisci il " << k+1 << "° numero: ";
				cin >> a[b]->c[k];
				a[b]->s = i+1;
				a[b]->g = j+1;
			}
		}
	}
	return 0;
}

   cin >> a[b]->c[k];
A cosa punta a[b]? Non viene mai inizializzato. N� viene mai istanziato
alcun oggetto di tipo 'giocata'.
Max

 alcun oggetto di tipo 'giocata'.
Ciao e grazie dell'intervento.
Dal basso della mia niubbiaggine, la riga:
a = new (nothrow) giocata * [num*g];
Non è un'inizializzazione?
a[b], nel primo ciclo di for, dovrebbe puntare all'oggetto a[0].
Dove sbaglio?
Forse devo inizializzare ogni a[b] con 0<b<(num*g) con un costruttore? E'
necessario?
Grazie e ciao,
S.

Aggiornamenti: ho cambiato qualcosa, ora si tratta di un array di oggetti
anzichè di puntatori, inoltre ho corretto un errore nel ciclo for
intermedio.
Resta il problema di eccezione, questa volta posso inserire in genere 5
numeri della sestina, all'inserimento del 5° valore esce l'errore.
Qualche volta invece riesco a inserire tutti i valori, ma ho sempre
l'errore in uscita dal programma.
#include <iostream>
using namespace std;
class giocata
{
public:
	int s;		//numero schedina
	int g;		//numero giocata
	int c[6];	//sestina giocata
};
int main ()
{
	giocata * a;
	int b=-1,n,g,i,j,k;
	int num;
	n=6;
	cout << "Inserisci il numero di schedine: "; 
	cin >> num;
	cout << "Inserisci il numero di giocate per scheda: "; 
	cin >> g;
	a = new giocata [num*g];
 
	for(i=0;i<num;++i)
	{
		cout << "- Schedina No " << i+1 << endl; 
		for(j=0;j<g;++j)
		{
			cout << "- Giocata No " << j+1 << endl; 
			for(k=0;k<6;++k)
			{
				b++;
				cout << "Inserisci il " << k+1 << "° numero: "; 
				cin >> a[b].c[k];
				a[b].s = i+1;
				a[b].g = j+1;
			}
			}
		}
	return 0;
}

 Non � un'inizializzazione?
� l'inizializzazione di 'a', che � un puntatore ad un (o, meglio, al primo
elemento di un) array di puntatori. Gli elementi dell'array (che sono
puntatori) non sono inizializzati.
Max

Stratox ha scritto:

Lasciando da parte che di C++ ce n'è ben poco (*), devi spostare un po' 
di righe in questo modo:
...
	cout << "- Schedina No " << i+1 << endl;
  	b++;
  	a[b].s = i+1;
  	a[b].g = j+1;
  	for(k=0;k<6;++k)
  	{
  		cout << "Inserisci il " << k+1 << "° numero: ";
  		cin >> a[b].c[k];
  	}
...
Ciao
(*) non basta usare class al posto di struct, new al posto di malloc e 
cin-cout al posto di scanf-printf per passare da C a C++ :-)

 cin-cout al posto di scanf-printf per passare da C a C++ :-)
Ecco, qui mi hai proprio scoperto! :D
Ti chiederei come otterresti lo stesso obbiettivo con un approccio
veramente C++, e non tradotto dal C come il mio, però sono in partenza
domani e non so quando potrò leggere la tua risposta.
Se vorrai lasciarla sarà comunque ben gradita!
Ciao,
S.