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 🙂


Log in to reply