Inhalt eines Arrays übergeben
-
Hallo,
Ich habe Probleme, den Inhalt eines Arrays an eine Funktion zu Übergeben.signed char func(signed char *ar) { signed char br[2]; br[0] = ar[0]; br[1] = ar[1]; return br; } int main() { signed char test[2] = { 1, 1 } signed char *gr = new signed char; gr = func(test); }
Aber da übergebe ich ja die Adresse des Arrays test. Ich öchte nur die Werte Übergeben, so dass ich in der Funktion Werte ändern darf. Wie mache ich das am besten?
-
Du kannst einmal nen zeiger auf das erste Array Element machen und den dann übergeben ... dann musste den zeiger immer ++ machen um aufs nächste Object zu kommen ...
Dann kannstes aber auch einfach so machenvoid blub(int bar[10]) { for(int i=0;i<10;i++) { cout<<bar[i]<<endl; } } int main() { int foo[10]={10,20,30,40,50,60,70,80,90,100}; blub(foo); return 0; }
-
Aber wenn ich jetzt in blub den wert verändere:
void blub(int bar[10]) { for(int i=0;i<10;i++) { bar[i] = 0; } }
dann ändere ich doch die werte in foo, oder?
-
also mit
bar[i] = 0;
setzt du ja JEDEN wert auf '0'
jeden wert den du in 'foo' an 'blub' übergibst (das hört sich an: foo an blub)
-
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ändertWie 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-Datamfg 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