Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

1

13.05.2017, 15:42

C++ 2-Dimensionales Array als Zeiger an Funktion übergeben...

Hallo,
ganz einfach: Wie macht man das, weil

C-/C++-Quelltext

1
2
3
4
5
void Funktion(int *Array[4][4]){};
void main(){
int *array[4][4];
Funktion(Array);
}

funktioniert ja irgendwie leider nicht :/

Mfg Typ

2

13.05.2017, 16:02

tu dir selbst einen Gefallen und nutz std::array statt plain arrays.

Dann hast du mehrere Optionen. Wenn du dann aber wirklich ein ganzes array übergeben willst, würde ich das folgender Maßen tun.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <array>
using CustomArray = std::array<std::array<int, 4>, 4>;
void myFunction(const CustomArray& _array)
{
}

void main()
{
    CustomArray array;
    myFunction(array);
}


Kleine Erklärung:
"using" ist nichts weiter als ein alias. Heißt, du machst den Typen von std::array<std::array<int, 4>, 4> als "CustomArray" Typ ansprechbar. myFunction erwartet hier ein const CustomArray als Referenz. Kenne deinen Lernstand nicht, eine andere Option wäre allerdings auch, Iteratoren zu erwarten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »anti-freak« (13.05.2017, 16:10)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

13.05.2017, 16:37

Beachte bitte was anti-freak geschrieben hat. Er hat damit absolut recht. Der Vollständigkeit halber aber trotzdem die Antwort auf deine Frage. Ein Array ist im Prinzip ein Zeiger auf das erste Element. Das heißt wenn du ein Array übergibst, übergibst du automatisch schon einen Zeiger. Es würde also reichen das Array so wie es ist zu übergeben.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

void Funktion(int Array[4])  {
        Array[0] = 1337;
}

int main() {
        int array[4];
        array[0] = 42;
        Funktion(array);
        std::cout << array[0] << std::endl;
}


Ich habe deinen Code mal etwas angepasst und ein kleines Beispiel gebastelt. Führ es mal aus und guck was passiert. Es würde also reichen einfach ein 2D Array zu übergeben.
Unabhängig davon, schmeiß das Array raus und benutz std::array ;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

13.05.2017, 18:49

Es geht ja um ein zweidimensionales Array. So durchläuft man das komplette Array.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void Funktion(int breite, int hoehe, int* array)
{
    for (int y = 0; y < hoehe; ++y)
    {
        for (int x = 0; x < breite; ++x)
        {
            array[x + y * breite];
        }
    }
}


AntiFreaks Lösung ist aber zu bevorzugen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

5

14.05.2017, 11:01

Ich werde jetzt das von anti-Freak nutzen, vielen Dank dafür! Was mir allerdings noch unklar ist, wie kann ich dieses CustomArray beschreiben? Wie ein "normales" Array geht nicht, da das ja konstant ?(

Vielen Dank auch für die anderen Antworten!

6

14.05.2017, 13:41

Entferne das const aus der parameterliste. Das sorgt dafür, dass zwar gelesen aber nicht beschrieben werden kann.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

14.05.2017, 21:27

Dann wird aus einer const-Reference allerdings ganz schnell eine ganz normale Referenz, die sich unter Umständen komplett anders verhält als gewünscht sein könnte.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

14.05.2017, 21:55

Dann wird aus einer const-Reference allerdings ganz schnell eine ganz normale Referenz, die sich unter Umständen komplett anders verhält als gewünscht sein könnte.

Wie würdest du denn ein std::array an eine Funktion übergeben welche die Daten verändern soll?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

15.05.2017, 00:53

Übrigens

C-/C++-Quelltext

1
2
3
4
void Funktion(int* (&Array)[4][4])
{
  // ...
}


;)

Generell ist es aber in der Tat empfehlenswert, std::array zu benutzen...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

15.05.2017, 06:49

Dann wird aus einer const-Reference allerdings ganz schnell eine ganz normale Referenz, die sich unter Umständen komplett anders verhält als gewünscht sein könnte.

Wie würdest du denn ein std::array an eine Funktion übergeben welche die Daten verändern soll?
By Reference oder by value, je nach Zweck. Es wurde nicht spezifiziert, ob er die Daten nur innerhalb der Funktion ändern können will, oder ob er die Funktion braucht, um damit einen externen Array zu füllen. Letzteres ist eventuell kein guter Design-Ansatz, sondern vielleicht macht eine Factory-Methode da mehr Sinn, also eine Funktion, wo er keinen existierenden Array rein steckt und mit Daten befüllt bekommt, sondern eine, wo er einen gefüllten Array als return-Value bekommt. Die Situation wurde hier zu ungenau beschrieben für eine optimale Lösung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige