Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Leverator
Beiträge: 32
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Beitrag von Leverator » Mi Aug 25, 2021 7:41 pm

Hallo zusammen,
da bin ich wieder mit einem neuen Compilerfehler.

Zum Problem:
Ich erzeuge ein Objekt auf dem Stack, welches ein Wertearray auf dem Heap erzeugt. [funktioniert]
Das Wertearray ist ein Ergebnis einer halbwegs komplexen Berechnung, die ich nicht ständig wiederholen möchte, und daher einfach die Werte abspeichere.
Ich möchte viele Objekte in einem Array instanziieren. [funktioniert]
Den vielen Objekten möchte ich jedoch beim Erzeugen einen Pointer oder eine Referenz auf das Objekt auf dem Stack geben, um die Datenhaltung etwas zu optimieren.
Sobald eines der vielen Objekte jedoch die Prozedur aufruft, welche den entsprechenden Wert im Array zurück geben soll, erhalte ich einen Laufzeitfehler.

Das Objekt auf dem Stack:

Code: Alles auswählen

[...]
sigmoid::sigmoid(double a) {
    sigValues = new uint8_t[__sigmoid_count__];
    
    //double a = 10.0;   // = 5; // = 10; // = 20;
    
    double i, wert;
    int index = 0;
    
    for( i=-1.0; i < 1.0; i+=(2.0/__sigmoid_count__) ) {
        wert = __sigmoid_max_val__ / (1.0 + exp(-a*i) );
        sigValues[index] = int( wert + 0.5 );
        index++;
    }
}

uint8_t sigmoid::getSigValue(uint16_t index) {
    return sigValues[index];
}
Versuche ich nun, dieses Objekt den einzelnen vielen Objekten als Pointer oder Referenz zu übergeben, fliegt mir entweder SigSegFault das Programm um die Ohren oder der Compiler mag nicht mehr.

Hier die Fehlermeldung des Compilers, wenn ich versuche die Referenz zu übergeben:

Code: Alles auswählen

src/neuron.hh:16:43: Fehler: nicht-konstante lvalue-Referenz vom Typ »sigmoid&« kann nicht an rvalue vom Typ »sigmoid« gebunden werden
   16 |         sigmoid&        transferFunction={};
      |                                           ^
In Datei, eingebunden von src/neuron.hh:2,
                 von src/neuron.cpp:1:
src/sigmoid.hh:13:9: Anmerkung:   nach benutzerdefinierter Umwandlung: »sigmoid::sigmoid()«
   13 |         sigmoid();
      |         ^~~~~~~
Makefile:15: recipe for target 'obj/neuron.o' failed
make: *** [obj/neuron.o] Error 1
Ausschnitt aus der neuron.hh:

Code: Alles auswählen

class neuron {
    private:
        uint64_t        uniqueID;
        int             InputCount;
        inputConnect    *inputConnections;
        sigmoid&        transferFunction={};

    public:
        uint8_t     outputValue;
        neuron();
        neuron( uint64_t, sigmoid& );
        ~neuron();
        [...]
Wer weiß Rat?

Viele Grüße,
Lev

Leverator
Beiträge: 32
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

Re: Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Beitrag von Leverator » Mi Aug 25, 2021 7:52 pm

Noch kurz nachreichen:
Main-Funktion:

Code: Alles auswählen

int main( int arc, char* argv[] ) {
    std::cout << "Neuron." << std::endl;
    
    sigmoid sigma;
    [...]
    neuron nA(1, &sigma);
    [...]
    nA.calcOutputValue();
    [...]
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Beitrag von Xin » Mi Aug 25, 2021 7:59 pm

Leverator hat geschrieben:
Mi Aug 25, 2021 7:41 pm
sigmoid& transferFunction={};
Was immer es ist... es ist kein C++?!

Du übergibst ein leeres Array, was eine Referenz werden soll. Der Compiler sagt, dass passt vom Typ nicht. Lass einfach das "={}" mal weg.

Hier wäre noch interessant wie der Neuron-Konstruktor aufgebaut ist... wenn Du nur die Referenz auf das Sigmoid-Objekt halten willst, musst Du es in der Init-Liste setzen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Leverator
Beiträge: 32
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

Re: Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Beitrag von Leverator » Mi Aug 25, 2021 8:22 pm

Danke für den Input.
Ich habe den Code entsprechend um die Initializer-List erweitert.

Valgrind meckert trotzdem:

Code: Alles auswählen

[...]
Use of uninitialised value of size 8
==1159==    at 0x400E18: sigmoid::getSigValue(unsigned short) (sigmoid.cpp:38)
==1159==    by 0x400C4E: neuron::calcOutputValue() (neuron.cpp:49)
==1159==    by 0x4010CA: main (main.cpp:76)
==1159==  Uninitialised value was created by a stack allocation
==1159==    at 0x400E70: main (main.cpp:12)
[...]
dafuq?!

Leverator
Beiträge: 32
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

Re: Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Beitrag von Leverator » Mi Aug 25, 2021 8:24 pm

Der ganze Ärger fing übrigens damit an, als ich mir ein Makefile für das Kompilieren geschrieben habe und alle Source-Files in einem eigenen Compile-Vorgang übersetze (mit -c) und zum Schluss das Binärfile mit g++ und den Objectfiles erzeuge...

Leverator
Beiträge: 32
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

Re: Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Beitrag von Leverator » Mi Aug 25, 2021 8:30 pm

Der Standard-Konstruktor von Sigmoid sieht folgendermaßen aus:

Code: Alles auswählen

// ---------------------------------------------------------------------------
sigmoid::sigmoid() {
    sigmoid(10.0);
}

// ---------------------------------------------------------------------------
sigmoid::sigmoid(double a) {
    sigValues = new uint8_t[__sigmoid_count__];
[...]

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Beitrag von Xin » Mi Aug 25, 2021 8:40 pm

Leverator hat geschrieben:
Mi Aug 25, 2021 8:30 pm
Der Standard-Konstruktor von Sigmoid sieht folgendermaßen aus:
Zeig doch mal den Neuron-Konstruktor. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Leverator
Beiträge: 32
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

Re: Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Beitrag von Leverator » Mi Aug 25, 2021 8:41 pm

Code: Alles auswählen

//neuron();
        neuron( uint64_t id, sigmoid& s ) : uniqueID{id}, transferFunction(s) {};

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zugriff auf einzelnes Objekt von mehreren Objekten heraus

Beitrag von Xin » Mi Aug 25, 2021 9:17 pm

Leverator hat geschrieben:
Mi Aug 25, 2021 8:41 pm

Code: Alles auswählen

//neuron();
        neuron( uint64_t id, sigmoid& s ) : uniqueID{id}, transferFunction(s) {};
Der sieht überraschenderweise gut aus. ^^

Das nicht:

Code: Alles auswählen

sigmoid::sigmoid() {
    sigmoid(10.0);
}
Ruf den anderen Konstruktor in der Initialisierungsliste. Hier erstellst Du im Sigmoid-Default-Konstruktor ein anderes sigmoid-Objekt, was Du korrekt initialisierst und dann wegwirfst. Das eigentliche Objekt hingegen bleibt uninitialisiert. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten