Referenz auf ein Array



  • Ich möchte in einer Funktion ein schon definiertes Array verändern. Kann ich das Array als Referenz übergeben oder mittels eines Zeigers?


  • Mod

    Man kann theoretisch Referenzen zu Arrays fester Größe machen. Z.B.:

    void foo(int (&bar)[10]);
    

    Die Größe kann man auch Templatisieren, falls sie zur Compilezeit bekannt ist, aber nicht zu dem Zeitpunkt an dem man die Funktion schreibt. Ist die Größe erst zur Laufzeit bekannt, muss ein Pointer her. Oder in allen Fällen besser: Eine passende Containerklasse aus der Standardbibliothek.



  • ich habe einfolgendes definiert: int feld[9]
    dann müsste doch der Funktions-Aufruf lauten: foo(feld)
    Dann kommt immer der Fehler: "Nichtaufgelöstes externes Symbol".
    Vielleicht bin ich ja auch zu blöd...


  • Mod

    Tja, dann wirst du wohl ein nichtaufgelöstes externes Symbol haben. Aber verrate besser niemandem wie es heißt.



  • Ich habe mir extra fürs Forum ne Glaskugel gekauft. Leider bringt die mich bei deinem Problem nicht weiter. Deshalb:

    1. Vollständigen, aufs Minimum reduzierten Code posten
    2. Vollständige Fehlermeldung posten.


  • Wenn ich den Aufruf mit foo(feld[9]) mache, kommt:
    Konvertierung des Parameters 1 von 'int' in 'int (&)[9]' nicht moeglich

    Wenn ich den Aufruf mit foo(feld[]) mache, kommt:
    Syntaxfehler : ']'

    Wenn ich den Aufruf mit foo(&feld) mache, kommt:
    Konvertierung des Parameters 1 von 'int (*)[9]' in 'int (&)[9]' nicht moeglich

    Wenn ich den Aufruf mit foo(feld[9]) oder foo(feld) mache, kommt:
    Nichtaufgeloestes externes Symbol

    wie soll ich das Feld denn sonst noch übergeben???



  • SeppJ schrieb:

    Tja, dann wirst du wohl ein nichtaufgelöstes externes Symbol haben. Aber verrate besser niemandem wie es heißt.

    👍



  • MatzeW schrieb:

    Wenn ich den Aufruf mit foo(feld[9]) mache, kommt:
    Konvertierung des Parameters 1 von 'int' in 'int (&)[9]' nicht moeglich

    Wenn ich den Aufruf mit foo(feld[9]) [...] mache, kommt:
    Nichtaufgeloestes externes Symbol

    Was denn nun.
    Lies dir bitte mal den Link in meiner Signatur durch. Und dann poste uns bitte den Code so, dass wir ihn in den Compiler stecken und möglichst die gleiche Fehlermeldung bekommen. Dazu gehört, dass du uns zeigst, wie du die Funktion ggf. in Headern deklariert hast, wie du sie definiert hast, und wie du sie aufrufst, inklusive der Definition der Variablen, die du beim Aufruf übergibst.
    Und bitte poste nicht irgendwas was so ähnlich aussieht wie das, was du in der IDE hast, sondern nutze Copy&Paste für den Code, den du aufs Wesentliche reduziert hast und der dir den Fehler bringt.


  • Mod

    Das erste was du bekommst sind alles Compilerfehler. Was kein Wunder ist, weil das ist ja auch falsch so. Das nichtaufgelöste externe Symbol das du bei foo(feld) bekommst ist ein Linkerfehler. Das heißt, der Code wurde richtig übersetzt, was kein Wunder ist, er ist ja auch richtig, aber es kann kein komplettes Programm erstellt werden weil du irgendwas deklariert und benutzt hast, was nirgendwo genau definiert ist.

    Meine Glaskugel flüstert mir schon eine Ahnung (oder eher Befürchtung), was du falsch gemacht hast. Aber ich möchte hier mal nicht pumuckls Erziehungsbemühungen untergraben. Außerdem würde es, wenn ich Recht habe, bedeuten, dass du noch einmal die absoluten Grundlagen zur C++-Syntax wiederholen musst.



  • MatzeW schrieb:

    Ich möchte in einer Funktion ein schon definiertes Array verändern. Kann ich das Array als Referenz übergeben

    Kommt drauf an.

    MatzeW schrieb:

    oder mittels eines Zeigers?

    Ja.



  • Habe die Lösung gefunden!!! SeppJ hat mir dabei sehr geholfen: ich hatte bei der Funktionsdefinition "klasseDlg::" vor dem Funktionsnamen vergessen, kam aber durch die verschiedenen Fehlermeldungen nicht drauf!
    Wenn Dummheit weh täte, müsste ich den ganzen Tag schreien...
    Ich danke euch allen trotzdem für eure Unterstützung!



  • übrigens ist eine Array-Übergabe als Referenz sogar umständlich, wie ich erfahren habe. So ist es viel einfacher:

    Beispiel: int feld[9];
    Deklaration: void funktion(typ *array, int laenge);
    Aufruf: funktion(feld, 9);

    also ohne Angabe von [] oder *, da ein Array automatisch ein Zeiger ist!



  • MatzeW schrieb:

    da ein Array automatisch ein Zeiger ist!

    Falsch.



  • MatzeW schrieb:

    da ein Array automatisch ein Zeiger ist!

    Setzen, 6.



  • Bei Übergabe eines Arrays wird aber immer auf Feld[0] verwiesen. Ausserdem funktioniert es ja in meinem Programm optimal?!

    Wiederaufstehen, 1 😃


  • Mod

    Wenn du nicht verstehst, was du das tust, dann lass es lieber. Setzen, 4-.



  • Das nennt sich call-by-reference (wenn ihr englisch könnt...hähä). Bei Übergabe eines Arrays in einer Funktion zerfällt dies automatisch in einen Zeiger, das ist nunmal so - basta. Wenn ihr das nicht glaubt, verweise ich auf Jürgen Wolf.

    Aufstehen, 1+
    Lehrer muss in Frührente 🤡


  • Mod

    MatzeW schrieb:

    Wenn ihr das nicht glaubt, verweise ich auf Jürgen Wolf.

    Bitte sag, dass du einen Smiley vergessen hast und das ein Scherz ist.



  • trollododol



  • Einen Smiley habe ich nicht vergessen. Ich finde den Jürgen Wolf mit seinem Buch C++ von A...Z auch gar nicht schlecht.
    Fehler sind sowieso überall enthalten. ⚠

    Und wenn ich euch alle Bücher und Tutorials über C++, in denen viel Müll ist, in einem Array aufzählen würde, dann hätte für euch der Begriff Stack-Overflow sicherlich eine neue Bedeutung! 😞

    Tatsache ist ausserdem, dass sein Code ja letztlich funktionierte


Anmelden zum Antworten