Forum: PC-Programmierung c++ 2D-Array einfacher Denkfehler


von anfänger (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

anfänger schrieb:
> int feld[3][3];
>     feld[0][3]=3;

Du verwendest ein Array mit drei Elementen, greifst aber auf das 
vierte Element zu. Das erste Element ist nicht [1], sondern [0].

von Tom (Gast)


Lesenswert?

anfänger schrieb:
> int feld[3][3];
>     feld[0][3]=3;

Wie groß ist feld? Welches ist daraus folgend der kleinste und der 
größte Index?

von anfänger (Gast)


Lesenswert?

ah ok. da war der fehler. danke.
hatte irgendwie im kopf feld[3][3] wäre jeweils von 0-3 aber heißt ja 
0-2^^.
danke

von Dennis S. (eltio)


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

von anfänger (Gast)


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
}

von Mikro 7. (mikro77)


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
}

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.