Dynamisches Array zurückgeben.



  • Ich will ein int Array zurückgeben, dessen Länge erst zur Laufzeit bekannt ist (also mit new erstellen). Ich hab dann ihn als Zeiger Definiert (int *Positionen)
    Jedoch wenn ich vom anderen Zeiger (z) einer int Variable etwas zuweisen will funktioniert das nicht (Zugriffsverweigerung) 😕

    void Suche_Positionen(AnsiString String,AnsiString Zeichen,int *Positionen)
    {
    //......
    Positionen[j] = i;
    //......
    }
    
    main()
    {
    //...
    int i;
    int *z;
    i = z[0]
    //....
    }
    


  • Hallo,

    Zugriffsverweigerung

    Schöne Bezeichnung. 🙂
    Dein z ist ja auch nicht gültig, da du keinen Speicher allokiert hast. Du hast doch new schon erwähnt, solltest also wissen wie das geht.



  • Hallo

    oder besser gleich std::vector benutzen.

    bis bald
    akari



  • //j wird vorher ermittelt
    Positionen = new int[j-1];
    //.....
    Suche_Positionen(.....,z); //der Aufruf.
    

    ,und da das ein Zeiger ist (Positionen) bezieht er sich doch darauf. 😕



  • Hallo

    Zum einen war dieser Ausschnitt nicht schon im ersten Post zu sehen. Zum Andern sagt er auch nicht viel aus, zum Beispiel ob j zur Laufzeit wirklich größer 1 ist und ob der Inhalt von Positionen über z wirklich an Suche_Positionen gegeben wird. Daalso noch immer nicht der relevante und komplette Ablauf für uns zu sehen ist, können wir dazu nicht viel sagen, außer das du den Debugger benutzen sollst und/oder std::vector.

    bis bald
    akari



  • void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            //Zum Testen
            int i;
            int *z;
            Suche_Positionen("12i456i890i","i",z);
            i=z[0];
    }
    
    void Suche_Positionen(AnsiString String,AnsiString Zeichen,int *Positionen)
    {
            int i=0,j=0;
            while (true)
            {
                    i = Suchen(String,Zeichen,i+1);
                    if (i==0) break;
                    j++;
            }
            Positionen = new int[j-1];
            i=0;j=0;
            do
            {
                    i = Suchen(String,Zeichen,i+1);
                    Positionen[j] = i;
                    j++;
            } while(i==0);
    }
    


  • Hallo

    /Edit : Okay langsam wird klarer.

    int *z; // z wird nie initialisert.
    Suche_Positionen("12i456i890i","i",z);
    i=z[0];
    

    Du müßtest schon Suche_Positionen mit der Adresse von z, und bei der Funktion selber mit einer Pointer auf Pointer arbeiten. Oder mit einer Referenz auf Pointer.
    Das ganze Gefuddle kannst du dir aber sparen wenn du std::vector verwendest (Ja das ist schon der dritte Hinweis...)

    bis bald
    akari



  • Wie lasse ich denn, den Zeiger (z) auf den bereich, der in der Funktion erstellt wurde, zeigen. Deswegen ist er nicht in der aufrufenden Funktion deklariert.



  • Hallo

    grundsätzlich

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            //Zum Testen
            int i;
            int *z;
            Suche_Positionen("12i456i890i","i",z);
            i=z[0];
    }
    
    void Suche_Positionen(AnsiString String,AnsiString Zeichen,int *&Positionen) // Referenz auf Pointer
    {
      ...
            Positionen = new int[j-1];
      ...
    }
    

    Allerdings erstellst du durch das new ein Element zu wenig, und außerdem must du ja das Suchen zweimal machen.

    Deshalb solltest du das ganze lieber so machen

    #include <vector> // Am Anfang der Datei
    ...
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            //Zum Testen
            int i;
            std::vector<int> z;
            Suche_Positionen("12i456i890i","i",z);
            if (!z.empty())
            {
              i=z[0];
            }
    }
    
    void Suche_Positionen(AnsiString String,AnsiString Zeichen,std::vector<int>& Positionen)
    {
            int i=0
            while (i != 0)
            {
              i = Suchen(String,Zeichen,i+1);
              if (i!=0) Positionen.push_back(i);
            }
    }
    

    Desweiteren weiß ich ja nicht was die Funktion Suche() machen, aber hoffentlich etwas anders als AnsiString::Pos

    bis bald
    akari



  • Ja danke hab es hinbekommen
    Von dieser Vektor Sache hatte ich noch nie was gehört.
    Danke für die Hilfe. 👍



  • Dann informier dich bitte darüber. vector ist Teil das C++Standards.
    z.Bsp. hier im Magazin
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-143816.html


Anmelden zum Antworten