Array übergeben



  • Hallo,

    Ich habe in der Sache ein Problem, warum auch immer.
    Man kann ja echt jeden scheiß machen, aber warum kann ich nicht ganz einfach ein komplettes Array übergeben?

    Ich finde dazu auch nichts im Netz, da ich ein Array übergeben möchte, der keine feste größe hat, und anscheint ist da unmöglich!

    Gib's da eine Möglichkeit?



  • nimm std::vector

    Wenn du einer Funktion ein Array als Parameter gibst, wird dieses vom Compiler zu einem Pointer degradiert. Du müsstest wenn, dann die Größe des Arrays als zusätzlichen Parameter mitgeben...



  • hmm ja ok, aber ist das mit Array's nicht möglich oder wie?
    Ich meine ich bin kein größer könner, aber man kann kein einfaches Array übergeben?

    PS: Ok, muss ich mich mal belesen, weil ich nix dazu gefunden habe, bloß wo finde ich sowas, wenn ich es nicht finde? -.-



  • Natürlich kann man das.

    #include <iostream>
    using namespace std;
    
    void f( int* a, int size)
    {
       for( int i=0; i<size; ++i ) cout << a[i];
    }
    
    int main() {
    	int a[] ={ 1,2,3,4};
        f(a,4);
    }
    


  • allgemein macht man sowas mit dem iterator-pattern. dann bist du auch für andere datenstrukturen offen.



  • ahh okay, ich bedanke mich für das Beispiel 🙂
    So verstehe ich das schon eher.

    mfg



  • Ach mein Post wurde schon wieder gelöscht. Ich habe keine Lust mehr.


  • Mod

    nwp3 schrieb:

    Ach mein Post wurde schon wieder gelöscht. Ich habe keine Lust mehr.

    Das war dann wohl volkard.



  • b4nan1 schrieb:

    ahh okay, ich bedanke mich für das Beispiel 🙂
    So verstehe ich das schon eher.

    In dem Beispiel wird aber nicht das Array übergeben, sondern nur die Anfangsadresse.
    Du arbeitest da auf dem Original. Wenn du in f etwas an *a änderst, hat das auswirkungen auf das a aus main.
    Bei size wird der Wert kopiert, da ist das nicht so.



  • asfdlol schrieb:

    allgemein macht man sowas mit dem iterator-pattern. dann bist du auch für andere datenstrukturen offen.

    Man kann den Ball auch mal flach halten.
    Nicht alles wird besser, nur weil man mit Templates draufkloppt.



  • hustbaer schrieb:

    asfdlol schrieb:

    allgemein macht man sowas mit dem iterator-pattern. dann bist du auch für andere datenstrukturen offen.

    Man kann den Ball auch mal flach halten.
    Nicht alles wird besser, nur weil man mit Templates draufkloppt.

    joa, da hast du recht. wenn er einfach eine einzelne funktion hat die ein array als argument annimmt, dann wären iteratoren overengineering. ich wollte nur mal das stichwort in den raum werfen, daher hab ich auch kein codebeispiel gebracht. vielleicht hat er ja demnächst einen einsatzort wo er wieder darauf zurückkommt und es ganz sinnvoll / nützlich findet. 🙂



  • Ja das eine ist Call by Value, und das andere by Referenz.

    Aber warum das eine Beispiel in einer schleife, wenn er so wieso nur den ersten wert mit gibt?

    Ob jetzt zeiger oder nicht, die beiden Methoden bringen mir nichts, da das das gleiche ist.

    Ob Zeiger (Index[0]), oder Normale variabel, beides das gleiche.



  • b4nan1 schrieb:

    Ja das eine ist Call by Value, und das andere by Referenz.

    auf welche zwei dinge beziehst du dich? ein array kannst du nicht per value übergeben.

    b4nan1 schrieb:

    Aber warum das eine Beispiel in einer schleife, wenn er so wieso nur den ersten wert mit gibt?

    na damit demonstriert er doch wie er auf jedes element des arrays zugreifen kann nur mit dem pointer auf das erste element und mit der array-länge.

    b4nan1 schrieb:

    Ob jetzt zeiger oder nicht, die beiden Methoden bringen mir nichts, da das das gleiche ist.

    was willst du denn machen dass du glaubst, dass das nicht reicht? du kannst damit jedes element des arrays modifizieren wie du möchtest.

    b4nan1 schrieb:

    Ob Zeiger (Index[0]), oder Normale variabel, beides das gleiche.

    dass man den zeiger übergibt ist sinngemässer wenn man auf nachfolgende elemente des arrays zugreifen will.



  • Ich will eine Bubbelsort Funktion bauen, damit ich die einfach überall einbauen kann. (So allgemein zeugs).

    Ne also mein Compiler erkennt nur den ersten Wert von dem Array, was ich übergeben will.
    Ich habe da auch eine schleife drinne, was die größe eigentlich ermittelt.

    Aber ich bekomme immer nur den ersten wert, mehr nicht, und das ist mein PROBLEM das man einfach nicht ein piss Array übergeben kann, und wir arbeiten schon mit Speicheradressen, kranke Objecte, aber so ein Array macht das so kompliziert als würde ich ne Engine bauen wollen!!! Lächerliche finde ich das ja.



  • b4nan1 schrieb:

    Ich will eine Bubbelsort Funktion bauen, damit ich die einfach überall einbauen kann. (So allgemein zeugs).

    Ne also mein Compiler erkennt nur den ersten Wert von dem Array, was ich übergeben will.
    Ich habe da auch eine schleife drinne, was die größe eigentlich ermittelt.

    Aber ich bekomme immer nur den ersten wert, mehr nicht, und das ist mein PROBLEM das man einfach nicht ein piss Array übergeben kann, und wir arbeiten schon mit Speicheradressen, kranke Objecte, aber so ein Array macht das so kompliziert als würde ich ne Engine bauen wollen!!! Lächerliche finde ich das ja.

    hä? dabei wurde dir auf der ersten seite ziemlich als erster post die lösung genannt:

    manni66 schrieb:

    Natürlich kann man das.

    #include <iostream>
    using namespace std;
     
    void f( int* a, int size)
    {
       for( int i=0; i<size; ++i ) cout << a[i];
    }
     
    int main() {
    	int a[] ={ 1,2,3,4};
        f(a,4);
    }
    

    innerhalb von f kannst du dann auf a[0] bis und mit a[size - 1] zugreifen.



  • b4nan1 schrieb:

    Ich will eine Bubbelsort Funktion bauen, damit ich die einfach überall einbauen kann. (So allgemein zeugs).

    Ne also mein Compiler erkennt nur den ersten Wert von dem Array, was ich übergeben will.
    Ich habe da auch eine schleife drinne, was die größe eigentlich ermittelt.

    Aber ich bekomme immer nur den ersten wert, mehr nicht, und das ist mein PROBLEM das man einfach nicht ein piss Array übergeben kann, und wir arbeiten schon mit Speicheradressen, kranke Objecte, aber so ein Array macht das so kompliziert als würde ich ne Engine bauen wollen!!! Lächerliche finde ich das ja.

    Sorry, lächerlich ist eher Dein Versuch, das zu kapieren. Wenn Du das alles krank findest, solltest Du Dir vielleicht ein anderes Betätigungsfeld suchen.

    Nur so als Tip: Lerne und verstehe die Bedeutung folgender Begriffe (und zwar in dieser Reihenfolge):
    Array, Zeiger, Zeigerarithmetik, By value und by reference.
    Dann solltest auch Du Dein Problem lösen können.

    mfg Martin



  • Und kein Mensch nutzt Bubblesort!
    Und kennste std::sort btw?



  • Nathan schrieb:

    Und kein Mensch nutzt Bubblesort!

    Bubblesort ist optimal, wenn du nur sequenziellen Zugriff hast und einen kleinen RAM. Wird schon manchmal verwendet.

    Nathan schrieb:

    Und kennste std::sort btw?

    Abgesehen davon, dass std::sort sehr ungenau spezifiziert ist, das in der Praxis implementierte Introsort ist nicht immer in allen Fällen optimal.



  • Also ich habe jetzt was im Netz gefunden, und das auch verstanden das dieses Problem in C++ mit Zeiger gelöst wird.

    PS: Ich brauche für sowas nichts fertiges, da man auch Algorithmen kennen bzw lernen sollte, wie diese funktionieren etc... da ich noch keine 10 Jahre Programmiere 🙂


Log in to reply