• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

[C++] 2D Array übergeben

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
Ich habe ein kleines Problem. Ich würde gerne wissen, wie ich 2D Arrays über eine Methode übergeben kann. Ist nur die Frage, ob ich das über vector im vector machen soll oder über Arr[x][y].

Da ich leider noch nicht soo viele Erfahrungen mit C++ habe und ich dennoch eine dynamische Bibliothek (C++ weil Plattformübergreifend) erstellen möchte, bin ich mit den Anleitungen im Internet noch etwas Ratlos, da ich diese nicht richtig durchdringe. Also es wäre nett, wenn mir das jemand gut erklärt oder mir einen Link zu einem guten Tutorial oder Ähnlichem gibt.

Danke
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Vielleicht hilft Dir ja das hier. Ist zwar für C beschrieben, gilt aber für C++ genauso.

MacApple
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
mhh, ich merke grade, dass ich nicht übergeben, sondern zurückgeben meine. Aber dennoch Danke für den Link. Es hat mich etwas überrascht, dass man in C keine Arrays zurückgeben kann, aber mir ist grade eingefallen, dass man ja auch Array als Argument übergeben kann und diesen so befüllen.
 

ImperatoR

Roter Astrachan
Registriert
02.12.06
Beiträge
6.261
Du kannst auch einfach mit Zeigern arbeiten. Ich weiß nicht, was du damit bezwecken willst, daher kann ich auch keine genaue Aussage treffen.

Soll die Funktion ein neues Feld zurückliefen, oder bearbeitet die Funktion nur das Feld?
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
naja ich habe grade gelesen, dass wenn ich ein neues Array erstelle, kann ich darauf nicht mehr zugreifen nach der Rückgabe, da ja alles neu deklarierte in einer Methode abgebaut wird. Mit static würde ich auch sehr ungerne arbeiten.
Darum werde ich wohl einfach das Array in ein struct packen und so zurückgeben. Dies scheint mir die einfachste Möglichkeit zu sein.
 

Jamsven

London Pepping
Registriert
21.11.07
Beiträge
2.046
Ach herrlich....
du brauchst das Array nicht zurückgeben, wenn du call by reference verwendest.
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
das habe ich in meinem zweiten Beitrag hier gemeint. Mal sehen welche Variante mir am besten gefällt.
 

Jamsven

London Pepping
Registriert
21.11.07
Beiträge
2.046
Da ein Array kein Datentyp, sondern eine Datenstruktur ist, wird das meistens per Referenz gemacht.
Wenn du eine Kopie von dem Ursprungsarray machen willst, musst du schon mit dynamischer Speicherverwaltung arbeiten.
Also mit malloc und free arbeiten.
http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_016_006.htm

Aber das ist jetzt alles C ich habe schon lange kein C++ mehr geschrieben und kann dir jetzt nicht sagen ob des unter C++ bequemer geht.
 
Zuletzt bearbeitet:

ImperatoR

Roter Astrachan
Registriert
02.12.06
Beiträge
6.261
Anstatt malloc nimmt man new, statt free nimmt man delete. :)
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
das ist mir schon klar. Wäre halt nur schick, dass man das als Rückgabewert zurückgeben kann, weil mit Pointer zurückgeben in C++ ist das so ne Sache, da ja in der Methode erstelle Objekte am Ende abgebaut werden. Darum habe ich nach einem Weg gesucht das gesamte Array und nicht nur den Pointer zurückzugeben.
 

ImperatoR

Roter Astrachan
Registriert
02.12.06
Beiträge
6.261
Code:
#include <iostream>

int* f();

int main (int argc, char * const argv[]) {
    
	int* a = f();
	
	a[0] = 1;
	
	std::cout << a[0] << '\n';
	
	delete a;
	
    return 0;
}

int* f()
{
	int* a = new int[10];
	return a;
}

Oder du erstellst in der Funktion einen Vektor und nimmst diesen als Rückgabetyp. Ich wüsste nicht, wie man das sonst machen kann.
 
  • Like
Reaktionen: karolherbst

Jamsven

London Pepping
Registriert
21.11.07
Beiträge
2.046
das ist mir schon klar. Wäre halt nur schick, dass man das als Rückgabewert zurückgeben kann, weil mit Pointer zurückgeben in C++ ist das so ne Sache, da ja in der Methode erstelle Objekte am Ende abgebaut werden. Darum habe ich nach einem Weg gesucht das gesamte Array und nicht nur den Pointer zurückzugeben.

Das ist schlichtweg falsch, wenn du new und delete benutzt. Der mit new reservierte Speicher bleibt bis zum Programmende hin reserviert. Du musst nur die Speicheradresse übergeben und gespeichert halten. delete gibt erst den Speicher erst vorzeitig wieder frei.

Sprich mit new reservierst du so lange Speicher, bis du delete aufrufst und das auch über die Funktionsblöcke hinaus. Wichtig ist nur, dass dein Programm dazwischen weiß wo(Pointer) du Speicher reserviert hast.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: karolherbst

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
ohje... ich habe den Fehler gefunden. Bin durch ImperatoR und Jamsven darauf gekommen

Es heißt nicht
Code:
JuliacColor** array;
array = new JuliaColor *[height];
sondern
Code:
JuliaColor **array = new JuliaColor *[height];

... ohje, das hätte ich ja früher bemerken sollen, dann kann ich des auch einfach aus der Methode zurückgeben... ach herje. Danke vielmals für die ganzen Gedankenstupser