Mein compiler sagt mir nun: ../se.h:132: error: expected ')' before
'float'
Habe auch schonmal int coor usw. probiert, geht alles nicht. Wieso kann
ich so denn keine Struktur aufbauen, was muss ich denn ändern? Kann mir
zusätzlich mal wer eine gute Seite im Web empfehlen wo ich solche
"Spezialitäten" nachlesen und lernen kann?
Grüße Pascal
Mal davon abgesehen, ob soviel Gleitkommakram wirklich nötig ist
(was nichts mit der Frage zu tun hat), fällt mir auf Anhieb nur auf,
daß der erste Parameter von Ecl2Equ keinen Typ hat.
Welche Zeile ist denn 132?
> ist auch Quark.>> Willst du eine float-Variable namens coor haben? Was ist dann ra?> Oder soll coor eine struct sein? Was soll dann float?
Also TDT ist ein Zahlenwert der wo anders berechnet wird. Zeile 132 ist
diese:
1
float Ecl2Equ(coor, float TDT)
Wieso ist denn oben das Quark? Klär mich dochmal auf!
Das hat etliche Schnitzer. Du solltest dich noch mal mit C-Grundlagen
befassen.
So kompilierts schon mal (bis auf einige "conversion from double to
float"-Warnungen.
1
// Transform ecliptical coordinates (lon/lat) to equatorial coordinates (RA/dec)
2
structcoor
3
{
4
floatlon;
5
floatlat;
6
7
floatra;// das fehlte wohl
8
floatdec;// das auch
9
};
10
11
// fehlende Definitionen nachholen
12
#define DEG 360.0
13
#include<math.h>
14
floatMod2Pi(float);
15
16
// Der Rückgabetyp der Funktion ist offensichtlich
17
// coor und nicht float.
18
structcoorEcl2Equ(structcoorlocation,floatTDT)
19
{
20
floatT=(TDT-2451545.0)/36525.;// Epoch 2000 January 1.5
ist weder das eine noch das andere, sondern einfach kein C.
Was soll das machen?
(Abgesehen davon, daß struct ccoor wie bereits gesagt weder ein
Element ra noch ein dec hat.)
Pascal G. schrieb:
> Klaus Wachtler schrieb:>> ...>> Willst du eine float-Variable namens coor haben? Was ist dann ra?>> Oder soll coor eine struct sein? Was soll dann float?>> Also TDT ist ein Zahlenwert der wo anders berechnet wird. Zeile 132 ist
Wo? Wie?
Soll man hier Quelltextraten veranstalten?
Falls TDT mit #define definiert ist, kann man es nicht mehr als
Variablen- oder Parameternamen nehmen.
> diese:>>
1
float Ecl2Equ(coor, float TDT)
>> Wieso ist denn oben das Quark? Klär mich dochmal auf!
Also das mit den Bienen geht folgendermaßen...
Klaus Wachtler schrieb:
> entweder verienbart man eine float-Variable:>
1
>floatc=irgendwas*wasanderes;
2
>
>> Oder eine Variable vom Typ der struct:>
1
>structcooreinCoor;
2
>einCoor.lon=blabla;
3
>einCoor.lat=blabla;
4
>
>> Aber:>
1
>floatcoor.ra=...;
2
>floatcoor.dec=...;
3
>
> ist weder das eine noch das andere, sondern einfach kein C.> Was soll das machen?>> (Abgesehen davon, daß struct ccoor wie bereits gesagt weder ein> Element ra noch ein dec hat.)
Hmm, ich muss wohl mir mal irgendwie im Internet eine C-Lern-Seite
suchen, Buch kaufen kommt momentan nicht in Frage, Buch im Internet für
lau wäre super.
Ich will eigentlich in coor.lat, coor.lon, coor.ra und coor.dec Werte
für Breiten-, Längengrad sowie Winkel drin stehen haben. Habe hier einen
Java-Quelltext von jemanden geschickt bekommen, der funktioniert so,
wollte das eigentlich "nur" auf C umfunktionieren damit es mit einem
ATmega32 laufen kann. Im Java-Original sieht der Teil so aus:
1
function Ecl2Equ(coor, TDT)
2
{
3
T = (TDT-2451545.0)/36525.; // Epoch 2000 January 1.5
da ist allerdings nirgenswo coor definiert oder wie man es auch immer
nennen mag. Der macht sich coor einfach selbst oder so.
Da das coor für mich durch coor.lon usw. nach einem struct aussieht
wollt ich das das so wie eingangs machen. Jetzt muss ich mir wohl was
anderes einfallen lassen...
Grüße
Pascal G. schrieb:
> Hmm, ich muss wohl mir mal irgendwie im Internet eine C-Lern-Seite> suchen, Buch kaufen kommt momentan nicht in Frage,
So ein Buch kostet einen Pappenstiel.
> Ich will eigentlich in coor.lat, coor.lon, coor.ra und coor.dec Werte> für Breiten-, Längengrad sowie Winkel drin stehen haben.
Gut.
Also muss deine Struktur ja wohl auch aus diesen 4 Feldern bestehen
1
structcoordinate
2
{
3
floatlat;
4
floatlon;
5
floatra;
6
floatdec;
7
};
So. Damit hast du das erst einmal festegehalten:
Wann immer von einer Variablen die Rede ist, die vom Datentyp struct
coordinate ist, dann ist damit eine Variable gemeint, die aus diesen 4
Komponenten besteht.
Aber noch hast du keine Variable. Du hast nur den Bauplan, die
Blaupause, wie so eine Variable aussieht. So wie ein int ganze Zahlen
speichert, so wie ein float Gleikommazahlen speichert, so speichert eine
struct coordinate Variable eben lat (als Gleitkommawert), lon (als
Gleitkommawert), rec (als Gleitkommawert) und dec (ebenfalls als
Gleitkommawert). Der einzige Unterschied: von einem int, float, double
etc. weiß der Compiler von Haus aus, wie so etwas aussieht. Das wurde
ihm mitgegeben. Bei einer Struktur weiß er es nicht. Also muss man das
irgendwo einmal festlegen, wie das aussieht, wenn von einer 'Coordinate'
die Rede ist. Obiges erledigt dieses.
> function Ecl2Equ(coor, TDT)
hier ist überhaupt nicht von Datentypen die Rede. Hier ist nur die Rede
davon, dass es eine Variable mit dem Namen coor gibt. Aber nicht von
welchem Typ sie ist. Das geht in Jave (ist das nicht eigentlich
Javaskript?) aber in C nicht. C nimmts da mit den Datentypen schon ein
wenig genauer.
Du schreibst also eine Funktion
das sagt jetzt aus:
Ecl2Equ ist eine Funktion
diese Funktion returned etwas. Dieses etwas ist ein Wert vom Datentyp
'struct coordinate'.
Diese Funktion nimmt auch Argumente. Nämlich 2
Das erste Argument heisst funktionsintern coor und das zweite heißt in
der Funktion TDT (beide Argumente stehen innerhalb der Funktion als
Variablen mit genau diesen Namen zur Verfügung)
Aber: Wir wissen ja. Variablen haben in C immer einen Datentyp.
Der Datentyp von coor ist "struct coordinate"
und der Datentyp von TDT ist "int"
"struct coordinate" ist genauso ein Datentyp wie int, char, double oder
float. Er bezeichnet die Eigenschaften der Variable. In dem Fall sagt
der Datentyp struct coordinate aus, dass diese Variable besteht aus lan,
lon, rec und dec (eh schon wissen).
> wollt ich das das so wie eingangs machen. Jetzt muss ich mir wohl was> anderes einfallen lassen...
Nein.
Du sollst dir ein C-Buch kaufen und es durcharbeiten.
Soweit habe ich die Information bekommen, kenne Java nicht, kann daher
nicht beurteilen. Das Teil läuft aber soweit auf meinem PC. Ich will nun
jedoch die Bestimmung der Position von Mond und Sonne auf einen uC
verfrachten, da am Einsatzort kein PC vorhanden ist und auch aus Gründen
der Einfachheit darauf verzichtet werden soll. Der Standort und die Zeit
werden vom GPS genommen und per RS232 durch den uC ausgelesen, das
funktioniert auch schon nach einigen Experimenten nun sehr gut. Die
errechnete Position von z.B. dem Mond ist der Sollwert, wird mit dem
Istwert der im uC eingelesen wurde (funktioniert auch schon) verglichen
werden und dementsprechend dann Aktoren über Leistungselektronik
angesteuert werden, geht auch schon.
Jetzt muss ich nur irgendwie die Algorithmen zur Bestimmung der Mond und
Sonnenposition in den uC bekommen...
Karl heinz Buchegger schrieb:
> So ein Buch kostet einen Pappenstiel.> Du sollst dir ein C-Buch kaufen und es durcharbeiten.
Welches? Es gibt soviele, da weiß ich echt nicht was da für meinen Zweck
vernünftig ist. Hab schonmal in der Buchhandlung gesehen, die machen
dann alle wieder so Sachen mit printf und Kommandozeilenkrams. Das
brauch ich doch alles nicht...
Pascal G. schrieb:
> Karl heinz Buchegger schrieb:>>> So ein Buch kostet einen Pappenstiel.>> Du sollst dir ein C-Buch kaufen und es durcharbeiten.>> Sachen mit printf und Kommandozeilenkrams. Das> brauch ich doch alles nicht...
Der Klassiker
Kernighan&Ritchie
Programmieren in C
Führt doch von den absoluten Grundlagen bis hin zu den dunklen Stellen
in C.
Und ich wette, dass ich dich mit printf und Kommandozeilenkrams in
Null-Komma Nichts in Verlegenheit bringen kann.
Und wenn du denkst, dieser Struktur-Kram wäre schon Spezial-Zeugs: Mit
nichten. In einem Buch mit 30 Kapitel, würden Strukturen ungefähr in
Kapitel 11 auftauchen. Da warten noch 29 andere Kapitel auf dich.
Kapitel 29 wäre dann esoterisches Spezialzeugs.
Edit:
Peter Steegmann hat weiter oben ja schon einen Link zu Amazon gepostet.
Wenn ich mir die erste Rezension durchlese, dann würde ich dir die engl.
Ausgabe empfehlen. Das klingt (leider wieder einmal) nach einer üblen
Übersetzung. Ich kenne die dt. Version nicht. Meine zerfledderte, 20
Jahre alte Ausgabe ist im Original. Damals gab es noch keine
Übersetzung.
Nochmal Hallo!
Also ich habe jetzt mal im C Buch gelesen, ich verstehe da mit den
struct's irgendetwas falsch.
Ich lege mit
1
struct coor
2
{
3
float xv;
4
float yv;
5
float v;
6
float r;
7
} moon;
einen struct mit dem Namen coor (Koordinaten) an. Der hat Variablen für
den Mond (moon) mit den Teilen xv, yv, v und r? Soweit richtig?
Jetzt will ich die Koordinaten in einer Funktion berechnen und dann in
die Teile des struct ablegen mit
wobei die Funktion float-Werte für am, Em, em übergeben bekommt.
Compile ich das, bekomme ich für die Zeile
struct coor ( ...
den Fehler
../sem.h:128: error: expected identifier or '(' before '{' token
ausgegeben. Auch float coor, float moon, struct moon usw hab ich
probiert. Irgendwie weiß ich nicht und werd aus dem Buch nicht schlau
wie ich denn eine Funktion aufrufe mit der ich was in einen struct
schreibe, nämlich meine Koordinaten des Mondes für
moon.xv //x Komponente
moon.yv //y Komponente
moon.v //v --
moon.r // Radius
Was muss ich denn da noch ändern? Ich sehe es nicht aus dem Buch heraus?
Grüße Pascal
Jörg G. schrieb:
> Du hast den Funktionsnamen vergessen?!> Es muss ja so aussehen:>
1
structmoonmoon_init(...)
>> hth. Jörg> ps.: wenn's das nicht war, poste deinen Code
Yuhu,
hmm, also ich habe mal die entsprechenden Ausschnitte aus der Datei
hier:
1
119:structcoor
2
120:{
3
121:floatxv;
4
122:floatyv;
5
123:floatv;
6
124:floatr;
7
125:}moon;
8
126:
9
127:structmoonmoon_init(floatam,floatEm,floatem);
10
128:{
11
129:moon.xv=am*(cos(Em)-em);
12
130:moon.yv=am*(sqrt(1.0-em*em)*sin(Em));
13
131:moon.v=atan2(moon.yv,moon.xv);
14
132:moon.r=sqrt(moon.xv*moon.xv+moon.yv*moon.yv);
15
133:returnmoon_init;
16
134:};
Auch das geht nicht. Bekomme wieder die Meldung
../sem.h:128: error: expected identifier or '(' before '{' token
Zeilennummern sind oben *ergänzt.
Verstehe es nicht! Bitte helft mir!
Ich hatte da einen Fehler eingebaut (Selbstverständlich mit voller
Absicht), der Typ des Rückgabewerts der Funktion heißt "struct coor"
(nicht "int", "long int", "unsigned long long int" etc.) und du hast
eine Variable ("moon") von diesem Typ - ich hatte da den Fehler gemacht,
weil mein geistiges Auge da anscheinend ein typedef eingebaut hat.
sry, Jörg
nein!
coormoon ist doch deine Funktion. Die gibst du nicht zurück.
Vielleicht willst du moon zurückgeben?
Was ich zwar nicht ganz verstehe, weil die ja eh global ist,
aber man sieht ja nur ein Fragment und muß raten, was du so vorhast.
..allerdings sollte man sich erst ein C-Buch kaufen/besorgen und
dann mit C anfangen.
Und benutz' gescheite Namen Em vs em ist schon sehr 'unschön'.
hth, Jörg
ps.: das Openbook zu C von Galileo ist auch ganz passabel </werbung>
> ..allerdings sollte man sich erst ein C-Buch kaufen/besorgen und> dann mit C anfangen.>
Ich hab hier zwei C Bücher, nur werde ich was die Kombination aus struct
und Funktion angeht überhaupt nicht schlau.
> Und benutz' gescheite Namen Em vs em ist schon sehr 'unschön'.
Finde ich absolut nicht, wenn man sich mit den ganzen Berechnungen rund
um das Sonnensystem beschäftigt, dann kennt man e, E und v. em, Em und
vm stehen für die drei Werte beim Mond (moon --> m).
>coormoon ist doch deine Funktion. Die gibst du nicht zurück.>>Vielleicht willst du moon zurückgeben?>>Was ich zwar nicht ganz verstehe, weil die ja eh global ist,>aber man sieht ja nur ein Fragment und muß raten, was du so vorhast.
Ja, genau! Aus meinen Büchern geht nicht hervor wie ich denn nun nichts
zurückgebe. Aber im Kapitel Funktionen steht doch drinne, dass ich mir
return immer wieder was zurückgeben muss?
Was ich will ist nur, dass die Ergbnisse der vier Berechnungen
1
xv = am * ( cos(Em) - em)
2
yv = am * ( sqrt(1.0 - em*em) * sin(Em) )
3
v = atan2(yv, xv)
4
r = sqrt( xv*xv + yv*yv )
In einer Struktur (struct) auftauchen, so dass ich diese wieder in einer
anderen Funktion (z.B. in der main.c) einfach unter derem Namen (z.B.
moon.r) aufrufen und weiterverarbeiten (math. Berechnungen) oder aber
einfach auch nur auf einem LCD ausgeben kann.
Und genau sowas steht nicht in meinem Buch drin oder ich finde es nicht!
man gibt nichts zurück, indem man erstens als Rückgabetyp vor
dem Funktionsnamen void hinschreibt und zweitens nur return; schreibt
ohne einen Wert dahinter.
Steht zumindest in meinem C-Buch so...
Klaus Wachtler schrieb:
> man gibt nichts zurück, indem man erstens als Rückgabetyp vor> dem Funktionsnamen void hinschreibt und zweitens nur return; schreibt> ohne einen Wert dahinter.>> Steht zumindest in meinem C-Buch so...
Das steht in meinem auch, geht aber aus irgendeinem Grund nicht, das hab
ich schon vorgestern nach dem System probiert:
1
133:voidcoormoon(floatam,floatEm,floatem)
2
{
3
moon.xv=am*(cos(Em)-em);
4
moon.yv=am*(sqrt(1.0-em*em)*sin(Em));
5
moon.v=atan2(moon.yv,moon.xv);
6
moon.r=sqrt(moon.xv*moon.xv+moon.yv*moon.yv);
7
return;
8
};
Compiler:
1
../sem.h:133: error: 'coormoon' undeclared (first use in this function)
Deswegen verstehe ich nicht wieso das so mit int, char, float etc pp
geht aber nicht mit einem struct??
Grüße
Die Meldung deutet darauf hin das Du die Funktion cormoon innerhalb
einer anderen Funktion definierst. Das aber geht nicht.
Bitte lies das Buch noch gründlicher.
Also ich habe mit der Suche des AVR Studio nochmal alle meine .c und .h
Dateien nach "coormoon" durchsucht. Es steht definitiv nur an dieser
Stelle. Und kommentiere ich diese paar Zeilen von oben aus, dann kann
ich auch kompiliieren.
Ich werde jetzt mal sehen, dass ich einfach alles ohne structs
umschiffe, ist zwar voll umständlich und wird ein riesen Aufwand aber
was solls, hauptsache ich bekomme diese bekloppte Berechnung mal hin. Da
kann ich es ja schneller mit meinem Taschenrechner ausrechnen ;-)
Und zum Buch: Ich habe erst vor kurzem mit der Programmierung extra für
dieses Projekt angefangen und freue mich schonmal dass alles soweit
klappt... Habt Gedult mit mir :-)
>Habt Gedult mit mir
Wir versuchen es, aber, wozu sollte das denn gut sein?
>Also ich habe mit der Suche des AVR Studio nochmal alle meine .c und .h>Dateien nach "coormoon" durchsucht.
Das Problem ist nicht, das Du eine mehrfache Definition hast, sondern
das Du einer Funktion eine weitere definierst. Das ist was ganz anderes.
So wie hier:
1
inta(chark,shortBeispiel){
2
machwas(k);
3
intb(shorty,charEinZeichen){
4
machwasandres(y);
5
}
6
}
Hier ist die Funktion b innerhalb der Funktion a definiert. Das geht
nicht!
Mit structs oder nicht hat die Fehlermeldung nichts zu tun!!!
@ Klaus
>Wohl wahr.>Es gibt auch Taschenrechner, die man mit C programmieren kann :-)
Gibt es aktuell welche? Kann mich nur an diesen Sharp aus den 80ern
erinnern. PC-1500 oder so.
> Gibt es aktuell welche? Kann mich nur an diesen Sharp aus den 80ern> erinnern. PC-1500 oder so.
Den konnte man aber nicht in C programmieren, sondern nur mit dem
eingebauten BASIC-Interpreter.
@ Rufus
>> Gibt es aktuell welche? Kann mich nur an diesen Sharp aus den 80ern>> erinnern. PC-1500 oder so.>Den konnte man aber nicht in C programmieren, sondern nur mit dem>eingebauten BASIC-Interpreter.
Ja. Das habe ich verwechselt. Ist ja auch schon fast 30 Jahre her. War
der Casio PB-2000C.