Zu große Strukturen
-
Guten Abend,
Ich bin gerade dabei eine Simulation für künstliche Neuronale Netze zu programmieren. Dabei wollte ich das neuronale Netz als Struktur darstellen. Dieses Netz beinhaltet ein 255*255 großes, zwei dimensionales Array von Neuronen. Jedes Neuron wiederum speichert einige Werte.
Wenn ich nun versuche mir durch das Makro sizeof() die Größe dieser Struktur ausgeben zu lassen, so erhalte ich eine Fehlermeldung "Speicherzugriffsfehler (Speicherabzug geschrieben)". Der selbe Fehler trifft auch auf, wenn ich versuche einen Zeiger auf diese Struktur einer Funktion zu übergeben.
Offensichtlich ist die Struktur zu groß, da der Fehler entfällt verringere ich die maximale Größe. Wie kann man auch große Strukturen handeln?
Ich hoffe ihr könnt mit helfen,
Guten Abend.
-
Nein, was du beschreibst passiert nicht. Code!
-
//Neuronstruktur struct Neuron { double aktivierung; double schwellwert; double klein_delta; double netzeingabe; double gewichte[255]; int gewichte_len; //Aktivierungsfunktion double (*ak_funktion)(double); }; //Neuronales Netz struct NeuronNetz { Neuron Schichten[4][255]; int Schichtmengen[4]; int Schichtanzahl; }; //Initialisiert das Netz void InitNeuronNetz(NeuronNetz* netz, int schichtanzahl, int* neuronenproschicht) { //Die jeweilige Anzahl an Neuronen aller Schichten speichern for(int i = 0; i < schichtanzahl; i++){netz->Schichtmengen[i] = neuronenproschicht[i];} //Input Gewichte gleich 1 setzen for(int i = 0; i < neuronenproschicht[0]; i++) { netz->Schichten[0][i].gewichte_len = 0; //Keine Verbindungen zu anderen Neuronen netz->Schichten[0][i].klein_delta = 0.0; netz->Schichten[0][i].netzeingabe = 0.0; netz->Schichten[0][i].aktivierung = 0.0; netz->Schichten[0][i].schwellwert = 0.0; netz->Schichten[0][i].ak_funktion = linear; } //Die restlichen Schichten durchgehen srand(time(0)); for(int h = 1; h < schichtanzahl; h++) { //Für jede Schicht jedes Neuron durchgehen for(int i = 0; i < neuronenproschicht[h]; i++) { //Standart Werte setzen netz->Schichten[h][i].klein_delta = 0.0; netz->Schichten[h][i].netzeingabe = 0.0; netz->Schichten[h][i].aktivierung = 0.0; netz->Schichten[h][i].schwellwert = 0.0; netz->Schichten[h][i].ak_funktion = sigmoid; netz->Schichten[h][i].gewichte_len = 0; //Und soviele Gewichte zufällig setzen wie es Neuronen in der vorherigen Schicht gibt for(int j = 0; j < netz->Schichtmengen[h - 1]; j++) { //Werte zwischen -1 und 1 netz->Schichten[h][i].gewichte[j] = rndm(); netz->Schichten[h][i].gewichte_len++; } } } for(int i = 0; i < neuronenproschicht[schichtanzahl-1]; i++) { netz->Schichten[schichtanzahl-1][i].gewichte_len = 0; //Keine Informationsverarbeitung in der Input Schicht netz->Schichten[schichtanzahl-1][i].klein_delta = 0.0; netz->Schichten[schichtanzahl-1][i].netzeingabe = 0.0; netz->Schichten[schichtanzahl-1][i].aktivierung = 0.0; netz->Schichten[schichtanzahl-1][i].schwellwert = 0.0; netz->Schichten[schichtanzahl-1][i].ak_funktion = linear; for(int j = 0; j < netz->Schichtmengen[schichtanzahl-2]; j++) { netz->Schichten[schichtanzahl-1][i].gewichte[j] = rndm(); netz->Schichten[schichtanzahl-1][i].gewichte_len++; } } } //Aufruf der Funktion in main.cpp NeuronNetz netz; InitNeuronNetz(&netz, 4, S);Der Code Funktioniert, solange das neuronale Netz ein geringes Ausmaß hat, wie in diesem Fall gegeben.
Ändere ich jedoch die Größe auf 255*255, so gibt es einen Fehler, ausgelöst in der main.cpp//Neuronales Netz struct NeuronNetz { Neuron Schichten[255][255]; int Schichtmengen[255]; int Schichtanzahl; };
-
Vielleicht klappt
NeuronNetz *netz=new NeuronNetz; InitNeuronNetz(netz, 4, S); delete netz;
-
Der Fehler tritt auf, wenn du das Objekt auf dem Stack anlegst:
int main() { NeuronNetz netz; }sollte den Fehler auch zeigen.
Lösung: Heapspeicher, z.B. wie volkards Code
-
Funktioniert einwandfrei, danke
