c++ Zeiger- u. Multiplikationzeichen verwechselt

Rofi

Erfahrenes Mitglied
c++ Warum "verwechselt" der compiler Zeiger- u. Multiplikationszeichen ?

Bei folgendem Progrämmchen erzeugt der compiler nachstehende Fehlermeldungen:
-> in Zeile 23: x=20000*cosi(40)*sinu(20)/PI;

error C2100: Zeigeroperation ungültig
error C2143: Syntaxfehler: Es fehlt ';' vor '/'

Kann mir jemand sagen, woran's liegt?
Danke

[#include <iostream>
#include <cmath>
using namespace std;

const double PI(3.14159265358979323846);

// Seitenverhältnis aus dem Winkel alpha errechnen
#define sinu(alpha) sin(PI/180*alpha);
#define cosi(alpha) cos(PI/180*alpha);
#define tang(alpha) tan(PI/180*alpha);

// Winkel aus aus Seitenverhältnis ii errechnen
#define asinu(ii) asin(ii)*(180/PI);
#define acosi(ii) acos(ii)*(180/PI);
#define atang(ii) atan(ii)*(180/PI);

int main()
{
double x;

x=20000*cosi(40)*sinu(20)/PI;

cout << "x= " << x;

cin.get();
return 0;
}]
 
Zuletzt bearbeitet:
Bei mir funktioniert das nur so:

Code:
 #include "StdAfx.h"
 #include <iostream>
 #include <cmath>
 
 const double PI=3.14159265358979323846;
 
 // Seitenverhältnis aus dem Winkel alpha errechnen
 #define sinu(alpha) sin(PI/180.0*alpha);
 #define cosi(alpha) cos(PI/180.0*alpha);
 #define tang(alpha) tan(PI/180.0*alpha);
 
 // Winkel aus aus Seitenverhältnis ii errechnen
 #define asinu(ii) asin(ii)*(180.0/PI);
 #define acosi(ii) acos(ii)*(180.0/PI);
 #define atang(ii) atan(ii)*(180.0/PI);
 
 
 int main()
 {
 	double x;
 	double _sinu = sinu(20.0);
 	double _cosi = cosi(40.0);
 
 	x=20000.0 * _sinu * _cosi / PI;
 
 	std::cout << "x= " << x;
 
 	std::cin.get();
 	return 0;
 }

Scheint ein Problem mit den umfangreichen defines zu sein!?

Wenn Du allerdings, wie oben angegeben, mit C++ programmierst, solltest Du auf jeden Fall die defines weglassen und z.B. inline-Funktionen implementieren!

Ansonsten ist mir noch aufgefallen, dass du überall Integer-Werte angibst, obwohl du mit double-Werten rechnest. Das ist eigentlich nicht typ- und umrechnungs-sicher.
 
Danke, so klappt's auch bei mir. Muss jetzt noch kucken, warum das im Detail so ist.
Mit den Int-Werten war wohl ein typischer Anfängerfehler und dabei weiss ich's :(

Wie macht ihr das alle um den code so schön in einen abgesetzten Rahmen zu bekommen? Habe schon etwas rumexperementiert, klappt aber nicht!
 
Meine Lösung geht zwar trotzdem, versuche aber dennoch die Möglichkeit mit den inline-Funktionen !!

Off: mit diesen Code-Tags ohne Leerzeichen ( [ code ] [ / code ] ) geht das Anzeigen sehr gut! mit den PHP-Tags sogar auch in bunt.
 
Als alter c-Programmierer ist mir natuerlich direkt der Fehler aufgefallen. Auch Kruses Loesung ist nur ein Workaround, um den eigentlichen Fehler. Dein Problem ist das Semikolon im define. Wenn du mit define ein Makro setzt, solltest du es eigentlich nie mit einem Semikolon benden. Du hast da naemlich nach der Makroerweiterung nun zB stehen: x=20000*cosi(40)*sinu(20)/PI; ==> x=20000*cos(PI/180*20);*sin(PI/180*20);/PI;
In seiner Loesung hat Kruse jetzt den Fehler durch die semikolons nur unterdrueckt, weil sie beim ihm nun nur noch am Ende doppelt auftreten. Also hier der richtige Ansatz:
Code:
/* #define Beispiel */
#include <cmath>
#include <iostream>

#define cosi(x) cos(M_PI/180.*x) //Hier kein abschliessend Semikolon!

// Im uebrigen enthaelt cmath die Konstante M_PI, was dir die eigene
// Definition von pi ersparrt.

using namespace std;

int main(void) {
    double x;
    x = cosi(20.)*2000;
   // Hier ist dein Fehler aufgetreten!
   // Nach der Makroerweiterung haette dort ein Semikolon 
   //vor *2000    gestanden!
    cout << x << endl;

    return 0;
}
 
Zuletzt bearbeitet:
Das ist ja krass, hätte schwören können, dass die da niemals waren. :eek:

Da muss ich nächstes Mal *AUGENAUF* machen.

PS: trotzdem INLINE-Funktionen :-)
 
Wow,
habe die Semikolons entfernt und alles lief ohne die geringste Fehlermeldung!
Das Programm was ich zum tutorial schickte, war nur ein Teil um das Problem zu beschreiben. Im eigentlichen Programm habe ich etliche Gleichungen mit Winkelfunktionen und Potenzen. Diese Gleichungen musste ich alle zerlegen und Dummie-Variabeln zuordnen. Die Dummies konnte ich dann wieder verarbeiten.

Das war natürlich nicht die optimale Lösung und es hat mich sehr geärgert, nicht zum Kern des Problems vordringen zu können.

So sind mir viele verzweifelte Minuten erspart geblieben! Danke
 
Habe jetzt noch das mit M_PI probiert, einmal mit <cmath> und einmal mit <math.h>, ohne Erfolg.

error C2065: 'M_PI': nichtdeklarierter Bezeichner
error C3861: 'M_PI': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

Besteht die Möglichkeit in den Headerdateien "nachzuschauen", was darin enthalten ist?
 
Also unter SuSE Linux mit dem gcc liegen die Header Dateien beispielsweise hier:
/usr/include/math.h
/usr/include/c++/4.0.2/cmath
In der cmath ist kein M_PI definiert, nur in der math.h. Da man wenn möglich C++ Header nutzen sollte, wenn man mit C++ programmiert, setze das define einfach selbst ein:
# define M_PI 3.14159265358979323846 /* pi */
Ansonsten nochmal, wie schon Thomas Kuse so häufig sagte: Benutze für Berechnungen keine Makros sondern inline Funktionen. Makros sind nicht typsicher und betrachte folgendes Problem:
Code:
#define SECHS 1 + 5
#define NEUN 8 + 1
#define ANTWORT SECHS * NEUN
Dies führt nicht zum gewünschten Ergebnis, da ANTWORT zu 1 + 5 ? 8 + 1 ausgewertet wird. Solche Probleme können durch vollständige Klammerung -- besonders bei Parameter von Makros -- vermieden werden. Ebenso kann es Probleme geben, wenn Du ein Makro mit Inkrement/Dekrement-Operatoren in den Argumenten aufrust (MAKRO(i++)).
Konstanten sollte man in C++ dann auch besser mit const deklarieren.
 
Habe MS-VC++7 unter Win-XP standardmäßig installiert und die Header-Dateien gefunden in nachstehendem Verzeichnis:
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include

Anhand Deines sehr anschaulichen Bsp. (Punkt- vor Strich Regel der Grundrechenarten) ist mir sofort klar gewesen, was Du meinst. Habs dann auch sofort probiert:

Code:
#include <iostream>

#define SECHS 1+5
#define NEUN 8+1
#define RESULTAT SECHS * NEUN

int main()
{
    std::cout << RESULTAT; // ergibt 42 statt 54 !

    // um ein richtiges Resultat zu erhalten, muss (1+5)
    // und (8+1) wie in der Mathe in Klammern gesetzt werden!

    std::cin.get();	// Tastatureingabe abwarten
    return 0;
}
In punkto inline Funktion habe ich in meinem schlauen Buch was gefunden:

Der Compiler fügt den Code an die Stelle ihres Aufrufs ein. Es findet kein Unterprogrammsprung statt. Der Code wird dadurch entsprechend länger aber auch schneller. Enthält eine inline Funktion zu viele Anweisungen, kann der Compiler das Schlüsselwort inline ignorieren und eine Warnung ausgeben.

Bei Makros (#define) nimmt der Präprozessor nur einen Textersatz vor. (aha, deshalb auch keine Semikolons) Dagegen verhält sich eine inline Funktion wie eine „normale“ Funktion ausser dem Hin- u. Rücksprung. Im Gegensatz zur normalen Funktion ist es auch möglich sie in Header Dateien zu definieren.
 
Zuletzt bearbeitet:
Zurück