Inhalt eines Arrays übergeben



  • void blub(int bar[10])
    {
        for(int i=0;i<10;i++)
        {
            bar[i] = 0;
        }
    } 
    
    int main()
    {
        int foo[10]={10,20,30,40,50,60,70,80,90,100};
    
        blub(foo);
    
        cout << foo[0] << endl;
        cout << foo[1] << endl;
        return 0;
    
    }
    

    usw. würde doch jetzt immer 0 ausgeben
    damit hätte ich in der function blub foo geändert



  • 😕 wie gesagt, in der funktion 'blub' werden die werte vom foo-array auf '0' gesetzt



  • Wenn du zwar Werte ändern willst, aber nicht an den Original-Daten, dann
    musst du in jedem Fall ne Kopie von deinem Array übergeben.

    In deinem Fall zum Beispiel:

    // natürlich vorher genügend Speicher für destination anfordern."
    memcpy("destination", foo, sizeof(foo));
    blub("destination");
    

    mfg JJ



  • Paulaner schrieb:

    void blub(int bar[10])
    {
        for(int i=0;i<10;i++)
        {
            bar[i] = 0;
        }
    } 
    
    int main()
    {
        int foo[10]={10,20,30,40,50,60,70,80,90,100};
    
        blub(foo);
        
        cout << foo[0] << endl;
        cout << foo[1] << endl;
        return 0;
    
    }
    

    usw. würde doch jetzt immer 0 ausgeben
    damit hätte ich in der function blub foo geändert

    Wie bereits von enno-tyrant gesagt, änderst du hiermit die Werte von foo über die Funktion blub(). (Doppelt gesagt hält besser 🙂 )
    Wenn du dagegen Kopien des Arrays foo machen willst, daher dass wenn du zwar dass Array foo an die Funktion blub übergibst, diese aber nur mit Kopien arbeiten bzw. diese verändern soll, musst du afaik sowas in der Art schreiben:

    void blub(int* bar, const unsigned int size)
    {
            int* bar2 = new int[size];
            // Kopieren
            for(unsigned int i = 0; i < size; ++i)
                    bar2[i] = bar[i];
            // Kopien Veraendern
            for(unsigned int i = 0; i < size; ++i)
                    bar2[i] = 0;                
    
            delete[] bar2;                                
    }
    
    int main()
    {
        int foo[10]={10,20,30,40,50,60,70,80,90,100};
    
        blub(foo, 10);
    
        cout << foo[0] << endl;
        cout << foo[1] << endl;
        return 0;
    
    }
    

    Wie du wahrscheinlich bemerkst werden hier nur Kopien verändert, die Werte von foo bleiben aber unberührt

    //Edit: Zu spät... Aber ich denke, die Posts ergänzen sich trotzdem 🙂

    Caipi



  • Hi Caipi,

    bisschen schneller kann man so einen POD-Array aber schon umkopieren. 😃 😃

    mfg JJ



  • Sorry, aber mir fällt (bei meinem SEHR beischeidenem Wissen) keine andere Möglichkeit ein! Meinst du vielleicht Möglichkeiten aus der STL?

    Mal ganz davon abgesehen, was ist ein POD-Array?

    Caipi



  • Vorletztes Posting 🙂

    Das gute alte memcpy() funktioniert ja auch noch in C++.
    POD = Plain-Old-Data

    mfg JJ



  • Ich dachte memcpy() funktioniert nur bei Zeichenketten und Zeichen?
    Wenn dem nicht so ist, kannst du mir vielleicht sagen, warum folgender Code nicht funktioniert?

    int main()
    {
        int foo[5] = { 0, 1, 2, 3, 4 };
        int bar[5] = { 0, 0, 0, 0, 0 };
        memcpy(bar, foo, 5);
    
        for(unsigned int i = 0; i < 5; ++i)
            cout << bar[i] << " ";
    
        return 0;
    }
    

    Caipi



  • Kleines Detail 🙂

    memcpy(bar, foo, sizeof foo);
    

    mfg JJ



  • Super Danke!
    Und das ist wirklich schneller als meine Variante? Warum? Es müssen doch auch irgendwie Kopien erstellt werden.

    Caipi



  • Klar wird ne Kopie erstellt wie bei dir, nur halt nicht mittels Schleife, sondern
    "Low-Level", gewissermassen knapp über "Assembler-Niveau". 🙂
    Du kopierst mit einem Schlag halt den gesamten Speicherbereich.

    mfg JJ



  • Alles klar, Danke! Wieder ne Menge gelernt 🙂

    Caipi


Anmelden zum Antworten