PDA

Visualizza la versione completa : [c++] memoria non written..


raphi01
13-10-2003, 18:40
ciao a tutti

ho un programma che da solo funziona e mi apre un wave mettendo i valori dei due canali dentro due vettori..
adesso l'ho incorporato in un altro programma e mi da questo errore:

Errore di applicazione:
L'istruzione a "0x0042513b" ha fatto riferimento alla memoria "0x004826a8". La memoria non poteva essere "written".

quello che mi sembra strano e' che se tolgo la riga:

system("pause");

non mi da piu' nessun errore..
cos'e' che non capisco???

ciao e grazie

$$$
13-10-2003, 19:52
forse "due vettori.. " superi i limiti di memoria allocata :-|

raphi01
14-10-2003, 11:56
..ma mi da errore solo se tengo la riga:

system("pause");

..se la tolgo funziona bene..
..?!?..

$$$
14-10-2003, 14:43
prova a mttere quel cmd prima della modifica del vettore e dimme

raphi01
14-10-2003, 16:34
..ops, non so bene cosa ho fatto ma adesso non ho piu' quell'errore.. ne ho altri!!
quello che faccio e' questo:

int main(int argc, char* argv[])
{
const char* NomeFileWave = "RANDOM.wav";

//class WaveFile
WaveFile FileWaveToOpen;

//DDCRET WaveFile::OpenForRead (const char *Filename)
FileWaveToOpen.OpenForRead(NomeFileWave);

//DDCRET WaveFile::ReadSamples (INT32 num,WaveFileSample sarray[])
//n_sample_global=numero di campioni letti in OpenForRead
INT32 num = n_sample_global;

//struct WaveFileSample
//{
// INT16 chan [MAX_WAVE_CHANNELS];
//};
WaveFileSample sarray[351285];

//DDCRET WaveFile::ReadSamples (INT32 num, WaveFileSample sarray[])
FileWaveToOpen.ReadSamples ( num, sarray );

for(int i=0;i<=n_sample_global-1;i++)
{
cout << i << "] " << sarray[i].chan[0] << " " << sarray[i].chan[1] << endl;
}

//DDCRET WaveFile::Close()
FileWaveToOpen.Close();

return 0;
}

il mio problema e' che a priori non so la lunghezza di sarray perche' dipende dal file scelto dall'utente e, comunque, oltre una certa dimensione mi da errore di "exception unknown software exception"..
come faccio??
..non ho ancora capito come allocare la memoria dinamicamente..

PS: le dichiarazioni le ho trovate bellefatte in internet, le chiamate sono mie..

$$$
14-10-2003, 22:54
in generale la memoria la allochi con NEW
tuttavia x file molto grossi ti conviene
allocare memoria virtuale non dalla heap/ram :-|
ad anzi allocare a blocchi cioe invece di allorare 10Mb
meglio fare 10 blocchi uno dopo l'altro da 1 mb :-|

raphi01
15-10-2003, 13:01
..l'idea di usare la new l'ho capita ma non ho capito come farlo..

..invece di fare:

//DDCRET WaveFile::ReadSamples (INT32 num,WaveFileSample sarray[])
WaveFileSample sarray[310272];
FileWaveToOpen.ReadSamples ( num, sarray );

dovrei fare:

//DDCRET WaveFile::ReadSamples (INT32 num,WaveFileSample sarray[])
WaveFileSample *sarray = new WaveFileSample;
FileWaveToOpen.ReadSamples ( num, sarray );

???

cosi' compila bene ma eseguendo mi da errore di applicazione: la memoria non poteva essere "written"..

..e come si fa ad allocare la memoria a blocchi? non ho ancora trovato esempi che me lo facessero capire..

grazie!!

Loading