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

Anonymous

unregistriert

1

19.03.2006, 13:29

Listing 5.11 Problem mit Funktionen

Hallo,

Ich bin neu hier und habe durch das Buch C++ für Spieleentwickler zu euch gefunden.

Ich habe es am Freitag bekommen und Top :)

So aber beim Programmieren dieses kleinen Spieles habe ich ein Problem. An sich habe ich mit der Syntax und den Befehlel ueberhaupt keine Probleme, da ich schon bis jetzt alles mit Turbo Pascal konnte, also war die umstellung auf C++ jetzt nicht so das Problem.

So nun aber genug gelabert.

Also folgendes Problem. Ich habe jetzt ersteinmal versucht alles selber zu schreiben ohne ins Buch zu schauen. Soweit war es kein Problem, aber leider will der Compiler einfach nicht die Funktionen aufrufen.
Ich habe auch schon im buch geschaut und da steht alles genauso.

So hier mal der Code





Quellcode

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>

using namespace std;

//Variablen deklarieren

char auswahl;

const int breite=8;
const int hoehe=8;

//Struct für die Felder deklarieren

struct s_werte
{
    char name[30];
    bool besetzt;
};

//Arrays mit den dazugehörigen Struct deklarieren

s_werte feld[8][8];




//Funktionen erstellen

void Arraydefault();
void SpielAnz();
void Feldbesetz();
void FeldAnz();
void Spielloesch();

int main()
{

    Arraydefault();
    //Menue mit switch und case
    {
    cout << "[1]Spielfeld anzeigen" << endl;
    cout << "[2]Feld besetzen" << endl;
    cout << "[3]Felddaten anzeigen" << endl;
    cout << "[4]Spielfeld loeschen" << endl;
    cout << "[5]Programm beenden" << endl;
    cin >> auswahl;
    }

    { 
        switch(auswahl)
        {
            case('1'):     // Rufe Funktion SpielAnz auf
                {
                    //SpielAnz();
                    main();
                } break;



            case('2'):     // Rufe Funktion Feldbesetz auf
                {
                Feldbesetz();
                main();



                } break;




            case('3'):     // Rufe Funktion FeldAnz auf
                {
                    cout<<"nix";
                } break;





            case('4'):    // Rufe Funktion Spielloesch auf;
                {
                    cout<<"nix";
                } break;




            case('5'):   // Beende Spiel
                {
                    return 0;
                } break;


        }
    }


return 0;

}

//Erstmal alle Arrays mit einen "true" und mit dem namen "def" beschreiben

void Arraydefault()
{
for (int x=0; x<breite; x++)
{
    for (int y=0; y<hoehe; y++)
    {
        feld[x][y].besetzt = false;
    }
}

} 
        
void feldbesetz()
{

    //Neue Variablen deklarieren
            int y_position;
            int x_position;
do
{

        

            cout << "Feld auf der X-Achse: ";
            cin >> x_position;

            cout << "Feld auf der Y-Achste: ";
            cin >> y_position;


            if (((x_position > 0) && (x_position < 9) && (y_position > 0) && (y_position < 9)))
            {
            cout << "Feldname: ";
            cin.ignore();
            cin.get (feld[x_position][y_position].name, 29);


            feld[x_position][y_position].besetzt = true;

            }
            else
                cout << " Falsche Eingabe! " << endl;


} while ((x_position > 0) && (x_position < 9) && (y_position > 0) && (y_position < 9)); 
}


Die fehlermeldung lautet

Quellcode

1
2
3
4
5
6
7
8
9
--------------------Konfiguration: schiffeversenken - Win32 Debug--------------------
Kompilierung läuft...
schiffeversenken.cpp
Linker-Vorgang läuft...
schiffeversenken.obj : error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl Feldbesetz(void)" (?Feldbesetz@@YAXXZ)
Debug/schiffeversenken.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

schiffeversenken.exe - 2 Fehler, 0 Warnung(en)


Aber bitte erschlagt mich nicht wenn der Fehler einfach zu dumm ist ;)

Danke schon einmal im Voraus

Sheddex

unregistriert

2

19.03.2006, 13:39

Der Fehler ist wirklich dumm^^ :

C-/C++-Quelltext

1
2
3
4
5
6
void Feldbesetzt ();

void feldbesetzt ()
{
     //...

}


Und? Findest du den Fehler? :huhu:

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

19.03.2006, 13:43

Also bitte verwende die C++-Code-Tags: [ cpp ] [ /cpp ] (ohne Leerzeichen versteht sich!)

Also zu deinem Problem! C++ ist CASE-SENSITIVE! Was bedeutet, dass es auf Groß und Kleinschreibung wert legt!
Demnach ist Feldbesetz() nicht das selbe wie feldbesetz()!
Bessers aus, dann wirds auch keinen Fehler geben!

Außerdem stört mich, dass du die main() Funktion (abgesehen davon, dass sie keine Parameter enthält) REKURSIV aufrufst! Also das sollte man vermeiden! Schreib eine eigene Funktion, welche Rekursiv ist, und rufe diese in der main auf!

Edit: War einer schneller ;)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

4

19.03.2006, 13:45

NEEEEEEEEEIN :roll:

Und dafür habe ich bestimmt 4 Stunden meines Lebens verbraucht
:crying:

Naja auf jedenfall danke, danke und nochmals danke

Args ich hasse Case Sensitiv :)

Sheddex

unregistriert

5

19.03.2006, 13:46

@Black-Panther: Jaaa, ich komme wie der Blitz und merze Fehler aus ;)

Sheddex

unregistriert

6

19.03.2006, 13:50

@Pak-X: Sowas passiert halt manchmal ;) Vor ein paar Tagen hatte ich auch so ein Ähnliches Problem: Der Code lief zwar, aber machte nicht was er sollte:

C-/C++-Quelltext

1
2
3
4
if (PlayerX == MonsterX && PlayerY == MonsterX)
{
     //...

}


Tja... das war auch verdammt dumm ;)

Anonymous

unregistriert

7

19.03.2006, 13:58

Ja ich habe ebend noch ein lustigen Fehler gefunden , weil ich habe mich immer gefragt warum der immer aus der Schliefe rausgeht. joa wenn man da
"und" schreibt, was ja niemals erfüllt sein kann, anstatt "oder" ist das auch toll...

Naja auf jedenfall danke ersteinmal für die schnelle Hilfe.

Pak-X

Frischling

Beiträge: 4

Wohnort: Lüneburg

Beruf: Schüler

  • Private Nachricht senden

8

19.03.2006, 14:05

Achso was mir noch einfällt.

Wie ist der Befehl um den gesamten Inhalt des Bildschirmes zu löschen?

Pascal = clrscr;

und

wie kann man das Programm einfach warten lassen, bis man die Entertaste gedrueckt hat?

Pascal = readln;

So sorry wenn ich frage, aber das nervt mich schon Programme ohne diese beiden Befehle zu schreiben, bzw auszuführen.

Achso und danke im Voraus ;)

Sheddex

unregistriert

9

19.03.2006, 14:10

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#include <iostream>
#include <windows.h>

int main ()
{
     std::cout << "Text" << std::endl;
     system ("cls");
     return 0;
}


PS: Wenn nix da das liest tötet er mich: Irgendwas soll an system schlecht sein... ich benutze es trotzdem ;)

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

10

19.03.2006, 16:55

Enter zum Beenden:

std::cin.get();

bzw. mit using namespace std; eben nur cin.get();

Werbeanzeige