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

Mordrak

1x Contest-Sieger

Beiträge: 121

Wohnort: München

Beruf: Junior IT Consultant

  • Private Nachricht senden

11

12.11.2008, 13:58

Re: char in Parameterliste (glub ich)

Ahoi,

hmm, also zum Punkt "Wie könnte man sonst die ganzen Infos an Spielen() weiterreichen?"

Wenn die Anzahl der Parameter immer länger wird, geht z.B. auch sowas:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct _Config {
   char Spielername[100];
   int Zufallszahl;
   //...usw...
} Config;

int
main(....)
{
  Config cfg;

  // ...cfg vorbereiten...

  if( Auswahl==1 ) {
     Spielen( &cfg );  
  }
  // ...
}

Das kommt ohne globale Variablen aus und es bleibt recht übersichtlich.


Zu Deinem Hauptproblem... Dann brauche ich wohl den stahlverstärkten Zaunpfahl:

In Deinem main() rufst Du auf:

Quellcode

1
Spielen (Spielername, Auswahl, Zufallszahl, Punkte, VorherigePunkte);

Umgesetzt auf die Variablentypen ist das

Quellcode

1
Spielen(char[], double, int, double, double);


In deinem Spielen.hpp steht (namen entfernt):

Quellcode

1
int Spielen (char *, double, double, double, double &);

Weitere Prototypen sind nicht vorhanden.

Der Compiler kennt also die Info aus Spielen.hpp und hat den vorhandenen Aufruf aus main(). von int nach double gibt es eine implizite Umwandlung, so dass aus main() letztendlich folgendes aufgerufen wird:

Quellcode

1
Spielen(char *, double, (double), double, double &);


Diese Funktion sucht also der Compiler und findet sie nicht. Die Fehlermeldung ist sehr aussagekräftig:

Zitat von »"Malträtierter Compiler"«

...nicht aufgelöstes externes Symbol ""int __cdecl Spielen(char *,double,double,double,double &)"


Die von Dir zur Verfügung gestellte Funktion in Spielen.cpp ist nämlich:

Quellcode

1
2
int Spielen (char *, double, int, double, double & 
{...}



Na? Jetzt klar?

Grüße,
Mordrak
What's yellow and equivalent to the axiom of choice? The Lemmon of Zorn!

12

12.11.2008, 15:19

Re: char in Parameterliste (glub ich)

Zitat von »"Mordrak"«

Wenn die Anzahl der Parameter immer länger wird, geht z.B. auch sowas:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct _Config {
   char Spielername[100];
   int Zufallszahl;
   //...usw...
} Config;

int
main(....)
{
  Config cfg;

  // ...cfg vorbereiten...

  if( Auswahl==1 ) {
     Spielen( &cfg );  
  }
  // ...
}

Das kommt ohne globale Variablen aus und es bleibt recht übersichtlich.
Ansichtssache. Vielleicht wäre es nicht schlecht, in C++ zu programmieren. Zudem sollten Bezeichner nicht mit Unterstrich und Grossbuchstaben beginnen und switch wäre vielleicht auch eine Lösung.

Spiri, ich glaube, du hast mit dem aktuellen Code bereits genug zu kämpfen. Also tu dir doch das mit char* nicht auch noch an... ;)

Mordrak

1x Contest-Sieger

Beiträge: 121

Wohnort: München

Beruf: Junior IT Consultant

  • Private Nachricht senden

13

12.11.2008, 17:02

Re: char in Parameterliste (glub ich)

Zitat von »"Nexus"«

Ansichtssache. Vielleicht wäre es nicht schlecht, in C++ zu programmieren. Zudem sollten Bezeichner nicht mit Unterstrich und Grossbuchstaben beginnen und switch wäre vielleicht auch eine Lösung.


Mit C++ möchte Du Spiri bereits kommen? Ich meine, Du hast seinen Code gesehen... Allerdings eine Struktur zu übergeben öffnet bereits den Geist für weitere, bessere Möglichkeiten. Kleine Schritte...

Das mit "_C..." ist natürlich richtig weil er keinen eigenen Namespace verwendet. Habe ich glatt übersehen.

Grüße,
Mordrak
What's yellow and equivalent to the axiom of choice? The Lemmon of Zorn!

14

12.11.2008, 17:26

Re: char in Parameterliste (glub ich)

Zitat von »"Mordrak"«

Mit C++ möchte Du Spiri bereits kommen? Ich meine, Du hast seinen Code gesehen... Allerdings eine Struktur zu übergeben öffnet bereits den Geist für weitere, bessere Möglichkeiten. Kleine Schritte...
Ehm, ich denke, Spiri befindet sich im Glauben, C++ zu programmieren? Dann sollte man ihm auch die richtigen Dinge zeigen. Mit der C-Struktur wird er bald wieder sein nächstes Problem haben, weil er nicht weiss, wie initialisieren. Zudem sollte er zuerst seinen bisherigen Code verstehen, bevor er neue Sprachmittel kennenlernt.

C ist übrigens überhaupt nicht einfacher als C++, eher im Gegenteil. Deshalb ist es Unsinn, zu sagen, man solle zuerst mit C-Dingen zurecht kommen, bevor man sich an die C++-Möglichkeiten wagt. Und typedef struct ist in C++ sehr unüblich.

Zitat von »"Mordrak"«

Das mit "_C..." ist natürlich richtig weil er keinen eigenen Namespace verwendet. Habe ich glatt übersehen.
Bezieht sich das nur auf globale Bezeichner? Im folgenden Auszug steht zwar als Titel "global names", aber im Text selber hat man das Gefühl, damit seien alle Bezeichner gemeint...

Zitat von »"C++ Standard - Working Draft 2008"«

17.6.4.3.3 Global names [lib.global.names]
Certain sets of names and function signatures are always reserved to the implementation:
— Each name that contains a double underscore _ _ or begins with an underscore followed by an uppercase letter
(2.11) is reserved to the implementation for any use.

Mordrak

1x Contest-Sieger

Beiträge: 121

Wohnort: München

Beruf: Junior IT Consultant

  • Private Nachricht senden

15

12.11.2008, 21:27

Re: char in Parameterliste (glub ich)

Zitat von »"Nexus"«

Ehm, ich denke, Spiri befindet sich im Glauben, C++ zu programmieren? Dann sollte man ihm auch die richtigen Dinge zeigen. Mit der C-Struktur wird er bald wieder sein nächstes Problem haben, weil er nicht weiss, wie initialisieren. Zudem sollte er zuerst seinen bisherigen Code verstehen, bevor er neue Sprachmittel kennenlernt.

C ist übrigens überhaupt nicht einfacher als C++, eher im Gegenteil. Deshalb ist es Unsinn, zu sagen, man solle zuerst mit C-Dingen zurecht kommen, bevor man sich an die C++-Möglichkeiten wagt. Und typedef struct ist in C++ sehr unüblich.


Die Aussage mit "C/C++ zuerst" würde ich nie treffen, sie führt nämlich nur zu Missverständnissen und so sollte es auch nie ankommen. Es geht darum, sich in kleinen Schritten dem Ziel zu nähern. Stück für Stück programmieren zu lernen, Fehlermeldungen zu verstehen, Fehler zu suchen, selbständiger zu werden. Oder anderst gesagt - es ist eine mühsame Gratwanderung auf der Rasierklinge wenn man versucht zu helfen. Gibt man zu wenig Infos/Kritik ist es schlecht, gibt man zu viele Infos/Kritik ist es auch schlecht. Ich hoffe, Spiri ist nicht schon völlig verwirrt :)


Zitat von »"Nexus"«

Bezieht sich das nur auf globale Bezeichner? Im folgenden Auszug steht zwar als Titel "global names", aber im Text selber hat man das Gefühl, damit seien alle Bezeichner gemeint...

Ich habe bedauerlicherweise die C++ Bücher nicht mehr aus denen ich damals gelernt habe, ich habe nur noch düstere Erinnerungen... Aber wenn ich Dir jetzt erzähle, seit wievielen Jahren ich bei kleinen Programmen geradezu mit Genuß und ohne Probleme auszulösen ein paar Unterstrich-Großbuchstaben-Bezeichner verwendet habe, kriegst Du nur graue Haare... ...und wir brauchen danach Jahre es wieder den Leuten abzugewöhnen :badgrin:

Grüße,
Mordrak
What's yellow and equivalent to the axiom of choice? The Lemmon of Zorn!

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

16

12.11.2008, 21:47

Spiri:
Der Prototyp in dem Header weicht von der funktion in der cpp ab. Der Compiler erstellt nun einen funktionsaufruf zu der funktion im header. Nun kommt der linker an die reihe. er muss diesen Funktionsaufruf "auflösen" also so umbiegen, dass die funktion in der cpp aufgerufen wird. Kann er aber nicht, denn dazu braucht er eine funktion die genau den selben name und genau die selben parametertypen hat wie die im header. da deine beiden spielen funktionen aber unterschiedlich sind passiert gar nichts. Es ist übrigens der Header "Spielen.hpp" und die cpp "Spielen.cpp" gemeint.

Socke

// Edit: Ich finde es reicht nicht, wenn er selber nach dem Fehler sucht und ihn nicht findet. dann wäre der lerneffekt zwar größer aber man muss auch die motivation im auge behalten. Dann ist es oft hilfreicher, das problem aufzuzeigen und zu erklären mit hintergrund. und noch hab ich die lösung ja nicht verraten, weil ich zu faul war auf den quote-button zu klicken :P

Socke

17

12.11.2008, 21:55

Re: char in Parameterliste (glub ich)

Zitat von »"Mordrak"«

Aber wenn ich Dir jetzt erzähle, seit wievielen Jahren ich bei kleinen Programmen geradezu mit Genuß und ohne Probleme auszulösen ein paar Unterstrich-Großbuchstaben-Bezeichner verwendet habe, kriegst Du nur graue Haare...
Das glaube ich dir gern. :)

Das Problem an solchen Dingen ist, dass sie praktisch nie einen Fehler verursachen, aber wenn doch, dann ist das der Tod persönlich. :badgrin:

Werbeanzeige