Grundlage: Referenz auf Array deklarieren



  • Hallo Community,

    ich habe ein int Array[900] für Messwerte angelegt.
    Nach der Auswertung der 900 Messwerte möchte ich bestimmte Messwerte, welche sich als schlecht erwiesen haben versenden.
    Zuerst habe ich diese in ein weiteres Array geschrieben, was allerdings zuviel Speicher benötigt (µC).
    Jetzt habe ich gedacht ich verwende Referenzen. Diese sollen dann auf die Speicherbereiche der schlechten Werte zeigen. (wenn ich das so richtig verstanden habe).

    Kann man ein Referenz Array anlegen? Gibt es sowas überhaupt?
    Wenn ich das so mache:

    int messwert[900];
    int &mwrz[900]=messwert;
    

    gibt es Fehler.
    Wenn ich das deklariere:

    int messwerte[900];
    int &mwrz=messwert;
    

    gibt es keine Fehler aber dann habe ich nur den letzten schlechten Wert auf den ich zugreifen kann (denke ich).

    Wie kann ich das so deklarieren das ich die Referenz &mwrz wie ein Array verwenden kann?
    Ich möchte in dem messwerte Array nichts ändern. Ich möchte nur die schlechten Werte lesen können und später versenden.

    Ich hoffe das war so einigermaßen verständlich.



  • christofj schrieb:

    Jetzt habe ich gedacht ich verwende Referenzen. Diese sollen dann auf die Speicherbereiche der schlechten Werte zeigen. (wenn ich das so richtig verstanden habe).

    Du verstehst dich also selber nicht?

    Was sind "die Speicherbereiche"?



  • (wenn ich das so richtig verstanden habe).

    Er will wohl damit sagen wenn er Zeiger richtig verstanden hat.

    Wieso willst du überhaubt eine Referenz auf das gesamte Array? Da wären dann ja wieder alle Werte drin und nicht nur die schlechten.

    Wenn dann müsstest du Referenzen auf die Werte in einem anderen Array speichern. Aber eine Referenz oder ein Pointer zu speichern braucht auch nicht weniger Platz als ein int. Das wäre was anderes wenn du ein komplexes Objekt hättest.



  • std::vector und std::array sind dein Freund.


  • Mod

    Du denkst viel zu kompliziert. Wenn du schon ein Array benutzt, dann nutz auch dessen Eigenschaften aus! Bei Arrays hast du mit dem Index einen eindeutigen Verweis auf ein bestimmtes Element und da du genau weißt, wie groß dein Array ist, kannst du sogar den Datentyp für den Index auf etwas einschränken, dass speichersparend Werte bis 900 speichern kann. Wohingegen eine allgemeine Referenz mindestens genügend Speicherplatz haben muss, um jeden Ort im Speicher deiner Maschine beschreiben zu können, was wohl viel mehr als 900 Stellen sein werden.

    Aber vielleicht gibt es auch eine viel bessere Lösung, wenn du dich ganz von deiner Idee verabschiedest. Statische Arrays mit mehreren hundert Einträgen klingen stets nach unnötiger Platzverschwendung. Nutzt du die immer alle aus? Ebenso bei deinem Zwischenspeicherarray: Da sagst du ja schon sofort, dass es weniger als 900 Werte sind, die du versenden willst, wieso also ein Array mit 900 Werten?

    Oder noch einen Schritt zurück: Wieso überhaupt die Werte speichern, die du später wieder verwirfst? Möglicherweise kann man auch einen Algorithmus finden, bei dem man nur wenige Werte zwischenspeichern muss, und sich dann gezielt nur die gesuchten Werte merkt. (Möglicherweise auch nicht. Kommt halt drauf an, was du genau machst.)



  • manni66 schrieb:

    christofj schrieb:

    Jetzt habe ich gedacht ich verwende Referenzen. Diese sollen dann auf die Speicherbereiche der schlechten Werte zeigen. (wenn ich das so richtig verstanden habe).

    Du verstehst dich also selber nicht?

    Was sind "die Speicherbereiche"?

    Nun ja, wie ich geschrieben habe, habe ich zuerst alle "schlechten Werte" in ein neues Array geschrieben.
    Mit Referenzen habe ich noch nicht gearbeitet. Daher auch der Titel Grundlage.. und im weiteren Text die Frage nach Deklaration der Referenz.
    Bei Referenzen habe ich das bis jetzt so verstanden das diese keinen Speicher belegen und nur auf Speicherbereiche zeigen.
    So z.B.:

    int zahl;
    int &ref=zahl;
    

    Demnach kann ich über die Variable ref den Wert in der Variablen zahl ändern.

    Jetzt möchte ich über die Referenz Variable den Inhalt meines Messwerte Arrays auslesen.
    Da ich nun ein Array habe möchte ich die Referenz Variable auch als Array anlegen. Verwenden will ich das ungefähr so:

    refarray[m]=messwertearray[i];
    

    Später möchte ich über refarray[m] bestimmte Werte aus den messwertearray[i] auslesen / versenden.



  • SeppJ schrieb:

    Du denkst viel zu kompliziert. Wenn du schon ein Array benutzt, dann nutz auch dessen Eigenschaften aus! Bei Arrays hast du mit dem Index einen eindeutigen Verweis auf ein bestimmtes Element und da du genau weißt, wie groß dein Array ist, kannst du sogar den Datentyp für den Index auf etwas einschränken, dass speichersparend Werte bis 900 speichern kann. Wohingegen eine allgemeine Referenz mindestens genügend Speicherplatz haben muss, um jeden Ort im Speicher deiner Maschine beschreiben zu können, was wohl viel mehr als 900 Stellen sein werden.

    Danke für diesen Hinweiß! Manchmal verstrickte ich mich selbst in den ganzen Möglichkeiten.

    Danke auch an die Anderen.


  • Mod

    christofj schrieb:

    Bei Referenzen habe ich das bis jetzt so verstanden das diese keinen Speicher belegen und nur auf Speicherbereiche zeigen.

    Computer können - entgegen landläufiger Meinung - nicht zaubern. Wie soll man sich Information merken, ohne diese irgendwo zu speichern? Auch die Information, wo etwas ist, ist eine Information.

    Was du wahrscheinlich meinst sind einfache Fälle wie eben dein Beispiel

    int zahl;
    int &ref=zahl;
    

    wo zahl und ref im gleichen Gültigkeitsbereich leben und der Compiler ganz unzweifelhaft beweisen kann, dass ref immer ein Verweis auf zahl ist und daher überall, wo ref benutzt wird, stattdessen gleich zahl benutzen kann, so dass ref am Ende nur in der Phantasie des Programmierers existiert aber im echten Programm keinen Speicherplatz hat.

    Mach es nur ein kleines bisschen komplizierter und das geht nicht mehr:

    void foo(int &ref) {ref += 1};
    

    Wenn der Compiler den allgemeinen Code für die Funktion foo erzeugt, dann kann sich ref auf alles mögliche beziehen. Auf was, das kann der Compiler an der Stelle gar nicht wissen und das können auch ganz verschiedene Dinge sein:

    int main()
    {
      int zahl1, zahl2;
      foo(zahl1);
      foo(zahl2);
    }
    

    Also muss der Code von foo irgendwie die Information speichern, auf was sich ref gerade bezieht.



  • christofj schrieb:

    Kann man ein Referenz Array anlegen? Gibt es sowas überhaupt?

    Was ist ein "Referenz-Array"? Meinst Du eine Referenz auf ein Array oder ein Array aus Referenzen?

    Ich nehme an, du möchtest eine Referenz auf ein Array.

    christofj schrieb:

    Wenn ich das so mache:

    int messwerte[900];
    int &mwrz[900] = messwerte;
    

    gibt es Fehler.

    Du musst auf die Präzedenz der Operatoren "Deklaratoren" aufpassen. Das [] bindet stärker als das & . Du versuchst hier also ein Array aus Referenzen zu deklarieren. Du möchtest aber eine Referenz auf ein Array. Das geht so:

    int messwerte[900];
    int (&mwrz)[900] = messwerte;
    

    christofj schrieb:

    Wenn ich das deklariere:

    int messwerte[900];
    int &mwrz = messwerte;
    

    gibt es keine Fehler

    Das ist seltsam. Das sollte gar nicht kompilieren.

    christofj schrieb:

    Wie kann ich das so deklarieren das ich die Referenz &mwrz wie ein Array verwenden kann?

    Ich möchte in dem messwerte Array nichts ändern. Ich möchte nur die schlechten Werte lesen können und später versenden.

    Zum Beispiel:

    const int (&ar)[900] = messwerte;
    

    Oder so:

    const auto& ar = messwerte;
    

    Was ich bei Arrays/Vektoren auch immer sehr praktisch finde ist:

    span<const int> ar = messwerte;
    

    Ein span bezieht sich auf irgendwo im Speicher hintereinander liegende Objekte, wobei die Anzahl zur Laufzeit im span selbst gespeichert wird. Diesen "Vokabeltyp" gibt es aber (noch) nicht in der Standardbibliothek. Den muss man sich woanders organisieren (z.B. GSL).


Anmelden zum Antworten