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

1

05.03.2011, 16:58

zweidimensionales array mit variablennamen an funktion übergeben

Hallo Community,

ich weiß nicht, ob ich das Thema mit dem Titel richtig getroffen habe, aber schaun wir mal... Ich möchte gerne ein zweidimensionales Array an eine Funktion übergeben, nur will ich keine Zahlen mit dem Array übergeben sondern die Namen von Variablen, damit man später die Zahlen nur an einer Stelle ändern braucht. Wenn ich die Variablennamen durch Zahlen ersetze funktioniert es, wenn ich die Namen übergeb bekomme ich Fehler. Hier mal die Codebespiele:

Das funktioniert einwandfrei:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;

void FeldInfo(int Feld[5][5], int Breite, int Hoehe);
int main ()
{
    const int Breite = 5;
    const int Hoehe = 5;

    int Feld[5][5];
    
    
    FeldInfo(Feld, Breite, Hoehe);

    return 0;
}

void FeldInfo(int Feld[5][5], int Breite, int Hoehe)
{
    for (int y=0; y<Hoehe; y++)
    {
        for (int x=0; x<Breite; x++)
        {
            Feld[x][y] = 1;
        }
    }

    for (int j =0; j<Hoehe; j++)
    {
        for (int i=0; i<Breite; i++)
        {
            cout << Feld[i][j];
        }
        cout << endl;
    }
}


Das funktioniert nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;

void FeldInfo(int Feld[Breite][Hoehe], int Breite, int Hoehe);
int main ()
{
    const int Breite = 5;
    const int Hoehe = 5;

    int Feld[Breite][Hoehe];
    
    
    FeldInfo(Feld, Breite, Hoehe);

    return 0;
}

void FeldInfo(int Feld[Breite][Hoehe], int Breite, int Hoehe)
{
    for (int y=0; y<Hoehe; y++)
    {
        for (int x=0; x<Breite; x++)
        {
            Feld[x][y] = 1;
        }
    }

    for (int j =0; j<Hoehe; j++)
    {
        for (int i=0; i<Breite; i++)
        {
            cout << Feld[i][j];
        }
        cout << endl;
    }
}

Da bekomm ich ne Liste voll Fehlermeldungen mit denen ich nichts anfangen kann. MSDN hat mir auch nicht wirklich weitergeholfen. :wacko:
"--------------------Konfiguration: AufgabeArraysStrukturen - Win32 Debug--------------------
Kompilierung läuft...
AufgabeArraysStrukturen.cpp
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(4) : error C2065: 'Breite' : nichtdeklarierter Bezeichner
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(4) : error C2057: Konstanter Ausdruck erwartet
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(4) : error C2466: Reservierung eines Arrays der konstanten Groesse 0 nicht moeglich
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(4) : error C2065: 'Hoehe' : nichtdeklarierter Bezeichner
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(4) : error C2057: Konstanter Ausdruck erwartet
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(4) : error C2466: Reservierung eines Arrays der konstanten Groesse 0 nicht moeglich
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(4) : error C2087: '<unbekannt>' : Feldindex fehlt
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(13) : error C2664: 'FeldInfo' : Konvertierung des Parameters 1 von 'int [5][5]' in 'int [][1]' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(18) : error C2057: Konstanter Ausdruck erwartet
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(18) : error C2466: Reservierung eines Arrays der konstanten Groesse 0 nicht moeglich
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(18) : error C2057: Konstanter Ausdruck erwartet
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(18) : error C2466: Reservierung eines Arrays der konstanten Groesse 0 nicht moeglich
D:\C++\Test\AufgabeArraysStrukturen_Zeiger\AufgabeArraysStrukturen.cpp(18) : error C2087: '<unbekannt>' : Feldindex fehlt
Fehler beim Ausführen von cl.exe.

AufgabeArraysStrukturen.exe - 13 Fehler, 0 Warnung(en)"

Kann mir da jemand helfen? Gibt es da einfach eine grundlegende Sache die man so nicht machen kann? Ich dachte die Variablennamen sind quasi Stellvertreter für die Werte weshalb das doch eig. funktionieren sollte...

Die Smileys da oben sind Zeile achtzehn umgewandelt...

Danke

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

05.03.2011, 17:17

da das array auf dem stack abgelegt wird muss die größe zur kompilerzeit bekannt sein.
höhe und breite müssten in dem fall konstante globale variablen oder makros(ihh) sein damit es klappt.
"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?

3

05.03.2011, 17:22

Hm... ok. Danke für die schnelle Antwort. Im Originalbeispiel aus dem Buch hat man der Einfachheit halber globale Variablen genommen heißt es dort. Wenn ich das ganze nun mit lokalen Variablen machen will, kann ich das ganze dann über Zeiger oder Referenzen lösen oder geht das auch nicht?

4

05.03.2011, 17:24

Doch, wenn die auf dem Heap sind, ist das kein Problem...;)

5

05.03.2011, 18:58

Zitat

Doch, wenn die auf dem Heap sind, ist das kein Problem...;)
Meinst du die lokalen Variablen oder die Zeiger/Referenzen?

6

05.03.2011, 19:25

Ob das Array auf dem Heap liegt oder nicht dürfte hier keinen Unterschied machen.
Wenn du die Dimensionen variabel haben möchtest, solltest wohl auf Zeiger umstellen. Am einfachsten wäre es, du nimmst dein zweidimensionales Array und übergibst es als int* (-> cast), da es intern ja sowieso nur eindimensional hinterlegt ist, dazu noch die Größen und berechnest dann die entsprechende Elementadresse.


Wenn du es als int** übergeben möchtest, müsstest wirklich ein Array von Zeigern haben, was die Sache unnötig kompliziert macht, wenn du die Größen schon zur Kompilierzeit kennst.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

05.03.2011, 19:33

Ob das Array auf dem Heap liegt oder nicht dürfte hier keinen Unterschied machen.

achja? wie erstellt man ein array dessen größe erst zur laufzeit bekannt ist auf dem stack?

wenn du die funktionen für arrays verschiedener größe schreiben willst musst du einen zeiger und die größe des arrays übergeben, dann kannst du mit hilfe der zeigerarithmetik die positionen berechnen.
"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?

8

05.03.2011, 19:35

Hm... aha. Ich versteh gerade Bahnhof aber das liegt wohl einfach daran, dass ich noch ziemlich "frisch" in C++ bin. :-) Aber ich werd mir mal noch was dazu anlesen...

Meinst du mit "und übergibst es als int* (-> cast)", dass ich das Array in einen int casten und einen Zeiger drauflegen soll?

Andere Sache: Wenn ich eine Variable global und konstant initialisiere, dann kann sie doch durch den Programmcode nicht ohne Weiteres geändert werden, oder?
Kann ich dann nicht einfach globale konstante Variablen verwenden oder spricht da etwas dagegen?

9

05.03.2011, 19:52

Zitat

Meinst du mit "und übergibst es als int* (-> cast)", dass ich das Array in einen int casten und einen Zeiger drauflegen soll?
So ungefähr (Größe etc. muss natürlich dann auch noch alles mit):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void f(int* arr) 
{ 
} 
int main() 
{ 
int arr[3][2]; 
f((int*)arr); 
}


Das ist das, was NachoMan im zweiten Teil seines Posts auch nochmal erwähnte.

Zitat

Andere Sache: Wenn ich eine Variable global und konstant initialisiere, dann kann sie doch durch den Programmcode nicht ohne Weiteres geändert werden, oder?
Kann ich dann nicht einfach globale konstante Variablen verwenden oder spricht da etwas dagegen?
Ja, kann nicht ohne Weiteres geändert werden.
Ja, du kannst einfach globale Variablen verwenden.
Ja, globale Variablen haben meist einen schlechten Ruf, sie "müllen" den zumeist eh schon überfüllten globalen Namensraum zu. In einem so kleinen Projekt macht das natürlich nichts, sollte man sich aber nicht angewöhnen. Was denke ich hauptsächlich dagegen spricht ist, dass man sie von überall aus ändern kann (-> schlecht kontrollierbar, fehleranfällig). Da deine const sind wäre es ja dann nicht sooo wild.

Zitat

achja? wie erstellt man ein array dessen größe erst zur laufzeit bekannt ist auf dem stack?

Weiß ich nicht...gar nicht? Ich habe nie behauptet, dass man das machen würde. Es ging darum, dass du ihm globale Variablen vorschlugst, er dann "lokale Variablen" und es "über Zeiger oder Referenzen lösen" wollte und ihm daraufhin gesagt wurde, dass die Daten (das Array) auf dem Heap sein müssten.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

10

05.03.2011, 22:28

es ging mir einfach darum, dass er erwartet hat, dass "breite" und "hoehe" in zeile 4 im zweiten code bekannt sind, sie werden aber erst ein paar zeilen drunter local deklariert. das brachte mich zur annahme er sei noch nicht weit genug für zeigerarithmetik in einem 2d array. mal ganz davon abgesehen, dass es hier überflüssig ist. in dem stadium ist es eher unwahrscheinlich, dass er zwei verschiedengröße 2darrays hat für die er die gleichen funktionen nutzen kann. also reicht eine globale größe für das feld und mit zeigern arbeitet er ja sowieso wenn er ein array übergibt.

anstelle des casts kannst du auch Feld[0] übergeben.
ausserdem sollte man sich C++-style casts angewöhnen^^

die position im array kannst du mit y*breite+x berechnen.
"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?

Werbeanzeige