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

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

07.01.2008, 19:41

<cmath> und der gcc (4.1.3)

Aus irgendeinem Grund scheint der gcc in Version 4.1.3 ein Problem mit den folgenden Funktionen zu haben: std::sqrtf, std::acosf, std::sqrtf

C-/C++-Quelltext

1
2
3
4
5
6
7
src/Vector2.cpp: In member function »float WoRD::Vector2::length()«:
src/Vector2.cpp:33: Fehler: »sqrtf« ist kein Element von »std«
src/Vector2.cpp: In member function »float WoRD::Vector2::angle(const WoRD::Vector2&:
src/Vector2.cpp:53: Fehler: »acosf« ist kein Element von »std«
src/Vector2.cpp:54: Fehler: »sqrtf« ist kein Element von »std«
Process terminated with status 1 (0 minutes, 1 seconds)
3 errors, 0 warnings
Ich hatte immer angenommen, auch die <cxxx> header wären Standard? Und inwiefern sind diese Header optimiert / "besser"? Habe nun nämlich fürs erste wieder die <math.h> reingenommen.

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

07.01.2008, 19:51

Der Unterschied zwischen den <cxxx.h>(C++-Version) und den <xxx.h>(C-Version) ist hauptsächlich, dass in der C++-Version alles im std-Namespace ist während es in der C-Version im globalen Namespace liegt.

Ausserdem gibt es noch ein paar andere kleine Unterschiede hier als Zitat:

Zitat von »"cplusplus.com"«

- wchar_t is a fundamental type in C++ and therefore does not appear as a defined type in the corresponding header files where it appears in C. The same applies to several macros introduced by ammendment 1 to ISO C in the header file <iso646.h>, which are keywords in C++.
- The following functions have changes in their declarations related to the constness of their parameters: strchr, strpbrk, strrchr, strstr, memchr.
- The functions atexit, exit and abort, defined in <cstdlib> have additions to their behavior in C++.
- Overloaded versions of some functions are provided with additional types as parameters and the same semantics, like float and long double versions of the functions in the cmath header file, or long versions for abs and div.


Der Grund weshalb Funktionen wie std::sqrtf nicht gefunden werden ist also vermutlich, dass diese Funktion in der C++-Version einfach std::sqrt heisst und für floats überladen ist...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

07.01.2008, 20:00

Hmm, klingt sehr überzeugend, aber:

C-/C++-Quelltext

1
2
3
4
5
6
7
src/Vector2.cpp: In member function »float WoRD::Vector2::length()«:
src/Vector2.cpp:33: Fehler: »sqrt« ist kein Element von »std«
src/Vector2.cpp: In member function »float WoRD::Vector2::angle(const WoRD::Vector2&:
src/Vector2.cpp:53: Fehler: »acos« ist kein Element von »std«
src/Vector2.cpp:54: Fehler: »sqrt« ist kein Element von »std«
Process terminated with status 1 (0 minutes, 0 seconds)
3 errors, 0 warnings
sqrt und acos werden also auch nicht gefunden.

4

07.01.2008, 20:04

http://www.cplusplus.com/reference/clibrary/cmath/sqrt.html

C-/C++-Quelltext

1
float Vector2::length() const { return std::sqrt(static_cast<float>(m_size)); }
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

5

07.01.2008, 20:18

Hmm, ich hab dummerweise echt nicht mehr als Konsolenausgaben vom gcc, daher kann ich schlecht prüfen. Aber sagt die Fehlermeldung nicht eindeutig, dass es auch keine std::sqrt und std::acos gibt? => gcc nicht konform?

Sry, vllt hätte ich die fehlenden 'f's hervorheben sollen.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

6

07.01.2008, 21:56

Und du bist sicher, dass du auch "#include <cmath>" drinstehen hast? Die Funktionen sind alle im Header enthalten und müssen auch funktionieren. Und ja, die <cxxx> Header sind Standard für C++.

Wenn gcc den Standard an so fundamentaler Stelle verletzen würde, hätte das sicher schon jemand gemerkt. 8)

Anbei mal ein kleiner Schnippsel, der funktioniert (jedenfalls bei mir mit gcc 4.1.2)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include <cmath>
#include <iostream>

int main (int, const char**)
{
  std::cout << "sqrt (2) = " << std::sqrt (2.0f)
            << ", sin (1) = " << std::sin (1.0f)
            << ", asin (1) = " << std::asin (1.0f) << std::endl;
  return 0;
}
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

7

07.01.2008, 23:19

Das nimmt der? So sieht der main-Funktionskopf aber normal nicht aus ^^ (laut standard hat das const da nix zu suchen!)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

8

08.01.2008, 06:40

Wie gesagt, das funktioniert. Das ist eben meine Gewohnheit, so deklariere ich main schon seit Jahren.

Sonst gibt es main Deklarationen wie Sand am Meer, die auch alle funktionieren. Warum argv aber nicht const sein soll, ist mir schleierhaft. Wer will den in die Programmargumente reinschreiben? :roll:

Ich muss wohl mal wieder in den Standard schauen, wie das definiert ist.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

9

08.01.2008, 15:13

Jap guck mal in den Standard. So nicht ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

08.01.2008, 23:26

Zitat von »"rklaffehn"«


Ich muss wohl mal wieder in den Standard schauen, wie das definiert ist.


Der C++ Standard erlaubt genau zwei Versionen, nämlich

C-/C++-Quelltext

1
int main();


und

C-/C++-Quelltext

1
int main( int argc, char* argv[] );


Weiterhin wird einem konformen Compiler offen gelassen ob weitere Versionen zur verfügung stehen dürfen, wichtig ist das jede dieser Versionen ein Rückgabewert vom Typ int hat.
@D13_Dreinig

Werbeanzeige