Newsgroup: it.comp.lang.c++
Titolo: Array del CxxxO!!!

Salve a tutti.
Per mettere alla prova le mie (scarse) capacita' di programmare in c++, sto
cercando di realizzare una classe array, semplicissima, per carita', ma
giusto per fare un po' di esercizio.
Solo che c'e' un problema che mi blocca e non riesco a superarlo. La
questione e' questa:
io vorrei inizializzare l'oggetto array (della classe che ho creato) con una
parte di un array predefinito. Quindi, se non sbaglio, devo passare al
momento dell'inizializzazione due puntatori, che puntano all'intervallo di
valori che voglio inserire. E cosi' faccio, solo che quando vado ad eseguire
il programma dopo averlo compilato (la compilazione va a buon fine), il
programmino che ho fatto per testare l'array mi da un errore. E questo sia
con il dev c++, ultima versione (ver 5, beta 5) sia con il visual c++ 6.0
sp4 (che tra l'altro mi da un errore a tempo di compilazione per via di un
valore const int definito private, e anche quello e' un mistero...).
So che la domanda a voi puo' sembrare sciocca e estremamente semplice, ma io
non so piu' che pesci pigliare. Qualcuno puo' aiutarmi e dirmi dove sbaglio?
Inserisco qui sotto la classe array e il programmino per testarla. Grazie
in anticipo a tutti quelli che vorranno aiutarmi.
Stefano
***Classe Array***
#include <iostream>
using namespace std;
class array {
public:
 //Costruttori
 array ();  //Costruttore di default: Inizializza l'array ad una dimensione
di default con valori di zero.
 array (int); //Costruttore che inizializza l'array di una certa dimensione
con tutti gli elementi con valori di zero
 array (int, int); //Costruttore che inizializza l'array di una certa
dimensione ed ogni valore e' inizializzato al secondo int
 array (int*, int*); //Costruttore che inizializza l'array con tutto o parte
di un array predefinito. Nella chiamata vengono passati due puntatori che
puntano uno al primo valore da inserire, l'altro all'ultimo valore da
inserire piu' uno
 //Distruttore
 ~array();
 //Funzione di test di stampa degli array
 void stampa(); //Stampa tutto l'array.
private:
 int* ia;
 int _size;
 static const int sz=10; //Questo con Visual c++ 6.0 non funziona...
};
array::array()
{
 _size=sz;
 ia = new int[sz];
 for (int ix=0; ix<sz; ix++)
  ia[ix]=0;
}
array::array (int x)
{
 _size=x;
 ia = new int[_size];
 for (int ix=0; ix<_size; ix++)
  ia[ix]=0;
}
array::array (int x, int y){
 _size=x;
 ia=new int[_size];
 for (int ix=0; ix<_size; ix++)
  ia[ix]=y;
}
array::array (int* x, int* y){
 int z=y-x;
 _size=z;
 for (int ix=0;ix<_size; ix++)
  ia[ix]=*(x+ix);
}
void
array::stampa()
{
 for (int ix=0; ix<_size; ix++)
  cout << ia[ix] << endl;
}
array::~array()
{
 delete [] ia;
}
***Programma di Test***
#include "array.h"
using namespace std;
int main(){
 array primo;
 array secondo(12);
 array terzo(12,4);
 int a[7]={1,2,3,4,5,6,7};
 array quarto(a,a+3);
 primo.stampa();
 int w;
 cin >> w;
 //secondo.stampa();
 //terzo.stampa();
 return 0;
}

  static const int sz=10; //Questo con Visual c++ 6.0 non funziona...
	Il VC6 non supporta le varibaili static int inizializzate all'interno
della classe, violando lo standard. Basta che lo definisci fuori:
const int array::sz = 10;
e dentro ci lasci solo la dichiarazione.
	Per il resto posta l'errore che ti da' a run time, poi ti leggo il
codice :-)
_dave_

   ia[ix]=*(x+ix);
Non ti sembra che manchi qualcosa in questo costruttore?
Max


Per favore, non mi fare domande criptiche (o ostodomantiche come dice un
certo poeta catartico...). Sono alle prime armi, se pensassi che mancava
qualcosa, l'avrei inserito. E comunque, per ribadirlo... secondo me non
manca niente. Tra l'altro ho fatto una prova anche togliendo il corpo della
funzione (lasciando solo le parentesi graffe)... e la cosa e' lo stesso, mi
da sempre l'errore a tempo di esecuzione (per che errore, leggi il messaggio
precedente).
Ciao
Xatrius


Compilando con il Dev C++ (v. 4.9.5.0 beta 5) ricevo questo errore:
Test4 ha causato un errore in TEST4.EXE
Test4 verra' chiuso.
Clicco su Debug e apre il vc++ 6.0 sp4
Il quale mi mostra il seguente messaggio di errore:
Unhandled exception in test4.exe: 0xC0000005: Access Violation
Compilando invece con il VC++ 6.0 sp4, ricevo questo errore:
Debug Assertion Failed!
Program C:\windows\desktop\debug\test4.exe
file: dbgheap.c
Line: 1050
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
Mi da riprova, ignora, Termina.
Clicco su riprova, mi da l'errore Test4 ha causato... etc.
Vado su Debug e mi apre un file in cui appare una freccia a fianco
alla seguente riga di codice:
 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
Ciao.
Xatrius

 qualcosa, l'avrei inserito. 
Scusa, ma era così evidente che pensavo bastasse soltanto attirare la tua
attenzione. Manca la parte in cui viene allocato l'array con new[] e 'ia'
viene inizializzato. Negli altri costruttori c'è, in questo no. Tutto qui.
Se 'ia' non viene inizializzato con un valore valido (zero oppure un
valore restituito da new[]), l'istruzione delete[] nel distruttore avrà
comportamento indefinito.
Max

 che non permette queste cose?
	E' il VC6 :-) Che io sappia e' stato corretto nel 
VC.NET
.
_dave_


Oh cazzo! E' vero! Mi sono dimenticato di creare l'array! Ti credo che non
funzionava!
Grazie. Non me ne ero proprio accorto, porca miseria.
Ora va tutto bene, grazie ancora.
Ciao
Xatrius