c++ 2D-Array einfacher Denkfehler

Gast #4532812
Lesenswert?

Hallo,
habe vor kurzen mit Programmieren angefangen. Begonnen habe ich mit der 
Sprache c++. Nun hängt es an einem 2D-array, obwohl ich dachte, dass ich 
das schon begriffen hätte. Also schätze ich muss es ein einfacher 
anfänger-/denk-fehler sein.
Folgender Code ist das Problem:

#include <iostream>
#include <cstdio>
# include <string>
#include <conio.h>
#include <dos.h>
using namespace std;
int main()
{
    int feld[3][3];
    feld[0][3]=3;
    feld[1][0]=1;
    cout<<feld[0][3];

    system("PAUSE");
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get();
    return 0;
}
Er gibt mir dann "1" aus. Wenn ich // vor feld[1][0]=1; schreibe gibt er 
mir "3" aus.
Diesen Zusammenhang verstehe ich nicht.
Danke für eure Hilfe
#4532837
Lesenswert?

Davon abgesehen wäre es sinnvoll sich zunächst auf den Standard zu 
konzentrieren. Das heißt die "conio.h" und "dos.h" wegzulassen. Wenn du 
dann noch alles in der Konsole machst, dann brauchst du auch deinen 
"system("PAUSE");"-Befehl nicht mehr.

Desweiteren solltest du dir bewusst sein, dass C und C++ 
unterschiedliche Sprachen sind. Du bindest nämlich eine aus der C-Welt 
kommende Header-Datei ein ("cstdio") die für C++ "angepasst" wurde.

Zuguterletzt: wenn du Quellcode postest, solltest du entsprechende Tags 
nutzen um die Lesbarkeit zu erhöhen.

Gruß
Dennis
Gast #4532877
Lesenswert?

Okay. danke.
wo wir gerade dabei sind - bei Funktionen verstehe ich das nicht mit den 
globalen variablen.
Ich bekomme da eine Fehlermeldung bei cout<<feld[i][o]<<" "; da ich feld 
dort noch nicht definiert habe. ich meine aus dem informatikuntericht 
von vor ein paar Jahren, dass man sowas mit public int löst oder so. 
aber hier bekomme ich das nicht auf die kette.
und wenn ich mir videos/tutorials zu funktionen angucke geht es nie um 
int's oder arrays die von einer anderen funktion ausgegeben werden 
sollen.
danke für eure hilfe
1
#include <iostream>
2
# include <string>
3
using namespace std;
4
int erzeugen()
5
{
6
    for(int i =0;i<=3;i++)
7
    {
8
         for (int o=0;o<=3;o++)
9
         {
10
              cout<<feld[i][o]<<" ";
11
         }
12
         cout<<"\n";
13

14
}
15
int main()
16
{
17
    public int feld[4][4];
18
    feld[0][0]=0;
19
    feld[0][1]=1;
20
    feld[0][2]=2;
21
    feld[0][3]=3;
22
    feld[1][0]=1;
23
    feld[1][1]=0;
24
    feld[1][2]=0;
25
    feld[1][3]=0;
26
    feld[2][0]=2;
27
    feld[2][1]=0;
28
    feld[2][2]=0;
29
    feld[2][3]=0;
30
    feld[3][0]=3;
31
    feld[3][1]=0;
32
    feld[3][2]=0;
33
    feld[3][3]=0;
34
    erzeugen();
35
   
36
    cout<<"\n\n\n\n\n\n"<<endl;
37
    cin.clear();
38
    cin.ignore(cin.rdbuf()->in_avail());
39
    cin.get();
40
    return 0;
41
}
#4532939
Lesenswert?

C/++ ist nicht die einfachste Sprache um "anzufangen". An einem guten 
Buch wirst du kaum drum herum kommen.

Zu deinem Problem: "feld" ist eine lokale Variable, auf die nur im 
lokalen Kontext zugegriffen werden kann; also hier nur in main().

Damit die Funktion "erzeugen" darauf zugreifen kann, mußt du das Feld an 
die Funktion übergeben. Das geht grundsätzlich entweder "by-value" oder 
"by-reference". Arrays sind ein doppelter Sonderfall. Da geht es nur 
"by-reference" (was du hier aber sowieso brauchst). Und um die 
Feld-Größe zu übergeben, braucht es eine "spezielle" Syntax:
1
#include <iostream>
2
#include <string>
3

4
using namespace std;
5

6
void erzeugen(int (*feld)[4][4])
7
{
8
    for (int i=0;i<=3;i++)
9
    {
10
         for (int o=0;o<=3;o++)
11
         {
12
     cout<<(*feld)[i][o]<<" ";
13
         }
14
         cout<<"\n";
15
    }
16
}
17
int main()
18
{
19
    int feld[4][4];
20
    feld[0][0]=0;
21
    feld[0][1]=1;
22
    feld[0][2]=2;
23
    feld[0][3]=3;
24
    feld[1][0]=1;
25
    feld[1][1]=0;
26
    feld[1][2]=0;
27
    feld[1][3]=0;
28
    feld[2][0]=2;
29
    feld[2][1]=0;
30
    feld[2][2]=0;
31
    feld[2][3]=0;
32
    feld[3][0]=3;
33
    feld[3][1]=0;
34
    feld[3][2]=0;
35
    feld[3][3]=0;
36
    erzeugen(&feld);
37
   
38
    cout<<"\n\n\n\n\n\n"<<endl;
39
    cin.clear();
40
    cin.ignore(cin.rdbuf()->in_avail());
41
    cin.get();
42
    return 0;
43
}

Alternativ deklariest du "feld" global bevor es irgendwo benutzt wird. 
Globale Definitionen sollten allerdings mit Bedacht eingesetzt werden, 
da sie zu schwer wartbaren Code führen können.
1
#include <iostream>
2
#include <string>
3

4
using namespace std;
5

6
int feld[4][4];
7

8
void erzeugen()
9
{
10
    for (int i=0;i<=3;i++)
11
    {
12
         for (int o=0;o<=3;o++)
13
         {
14
     cout<<feld[i][o]<<" ";
15
         }
16
         cout<<"\n";
17
    }
18
}
19
int main()
20
{
21
    feld[0][0]=0;
22
    feld[0][1]=1;
23
    feld[0][2]=2;
24
    feld[0][3]=3;
25
    feld[1][0]=1;
26
    feld[1][1]=0;
27
    feld[1][2]=0;
28
    feld[1][3]=0;
29
    feld[2][0]=2;
30
    feld[2][1]=0;
31
    feld[2][2]=0;
32
    feld[2][3]=0;
33
    feld[3][0]=3;
34
    feld[3][1]=0;
35
    feld[3][2]=0;
36
    feld[3][3]=0;
37
    erzeugen();
38
   
39
    cout<<"\n\n\n\n\n\n"<<endl;
40
    cin.clear();
41
    cin.ignore(cin.rdbuf()->in_avail());
42
    cin.get();
43
    return 0;
44
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren