Forum: Compiler & IDEs Struct in einer Funktion


von Pascal G. (pascalg)


Lesenswert?

Hallo,

ich schon wieder. Suche nun seit fast 1,5 Stunden im Internet und werde 
einfach nicht schlauer.
Habe in meinem Programm (WinAVR) sowas:
1
// Transform ecliptical coordinates (lon/lat) to equatorial coordinates (RA/dec)
2
struct coor
3
  {
4
    int lon;
5
    int lat;
6
  };
7
8
float Ecl2Equ(coor, float TDT)
9
{
10
  float T = (TDT-2451545.0)/36525.; // Epoch 2000 January 1.5
11
  float eps = (23.+(26+21.45/60.)/60. + T*(-46.815 +T*(-0.0006 + T*0.00181) )/3600. )*DEG;
12
  float coseps = cos(eps);
13
  float sineps = sin(eps);
14
  
15
  float sinlon = sin(coor.lon);
16
  float coor.ra  = Mod2Pi( atan2( (sinlon*coseps-tan(coor.lat)*sineps), cos(coor.lon) ) );
17
  float coor.dec = asin( sin(coor.lat)*coseps + cos(coor.lat)*sineps*sinlon );
18
  
19
  return coor;
20
}

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

von Klaus W. (mfgkw)


Lesenswert?

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?

von MeinerEiner (Gast)


Lesenswert?

So wie ich das seh, gibts in deiner Struct .ra und .dec nicht.

struct coor
  {
    int lon;
    int lat;
  };

von Klaus W. (mfgkw)


Lesenswert?

Wieso ist TDT groß geschrieben? Gibt es vielleicht irgendwo
ein Makro mit diesem Namen?

von Klaus W. (mfgkw)


Lesenswert?

auch das, ja

von kokisan2000 (Gast)


Lesenswert?

Im Internet gibt es Beispiele in Mengen, wie z.B.:

http://home.fhtw-berlin.de/~junghans/cref/EXAMPLES/struct3.c

"coor" ist der Name der Struktur. Wo reservierst Du Speicher für eine 
Strukturvariable?

Gruß
kokisan

von Stefan E. (sternst)


Lesenswert?

Das passt doch alles hinten und vorne nicht.

Ich denke das ist mal wieder einer der Fälle, wo der Hinweis auf C-Buch 
angebracht wäre.

von Pascal G. (pascalg)


Lesenswert?

Klaus Wachtler schrieb:
> ach so:
>
1
>   float coor.ra  = Mod2Pi( atan2( (sinlon*coseps-tan(coor.lat)*sineps),
2
> cos(coor.lon) ) );
3
>   float coor.dec = asin( sin(coor.lat)*coseps +
4
> cos(coor.lat)*sineps*sinlon );
5
>
> 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!

von Thomas K. (muetze1)


Lesenswert?

Dann benenn doch mal den Typ und den Namen deines ersten Parameters!

von tuppes (Gast)


Lesenswert?

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
struct coor
3
  {
4
    float lon;
5
    float lat;
6
    
7
    float ra;    // das fehlte wohl
8
    float dec;   // das auch
9
  };
10
11
// fehlende Definitionen nachholen
12
#define DEG 360.0
13
#include <math.h>
14
float Mod2Pi (float);
15
16
// Der Rückgabetyp der Funktion ist offensichtlich
17
// coor und nicht float.
18
struct coor Ecl2Equ(struct coor location, float TDT)
19
{
20
  float T = (TDT-2451545.0)/36525.; // Epoch 2000 January 1.5
21
  float eps = (23.+(26+21.45/60.)/60. + T*(-46.815 +T*(-0.0006 + T*0.00181) )/3600. )*DEG;
22
  float coseps = cos(eps);
23
  float sineps = sin(eps);
24
  
25
  float sinlon = sin(location.lon);
26
  location.ra  = Mod2Pi( atan2( (sinlon*coseps-tan(location.lat)*sineps), cos(location.lon) ) );
27
  location.dec = asin( sin(location.lat)*coseps + cos(location.lat)*sineps*sinlon );
28
  
29
  return location;
30
}

von Klaus W. (mfgkw)


Lesenswert?

entweder verienbart man eine float-Variable:
1
    float c = irgendwas*wasanderes;

Oder eine Variable vom Typ der struct:
1
    struct coor   einCoor;
2
    einCoor.lon = blabla;
3
    einCoor.lat = blabla;

Aber:
1
    float coor.ra  = ...;
2
    float coor.dec  = ...;
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.)

von Klaus W. (mfgkw)


Lesenswert?

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...

von P. S. (Gast)


Lesenswert?


von Pascal G. (pascalg)


Lesenswert?

Klaus Wachtler schrieb:
> entweder verienbart man eine float-Variable:
>
1
>     float c = irgendwas*wasanderes;
2
>
>
> Oder eine Variable vom Typ der struct:
>
1
>     struct coor   einCoor;
2
>     einCoor.lon = blabla;
3
>     einCoor.lat = blabla;
4
>
>
> Aber:
>
1
>     float coor.ra  = ...;
2
>     float coor.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
4
  eps = (23.+(26+21.45/60.)/60. + T*(-46.815 +T*(-0.0006 + T*0.00181) )/3600. )*DEG;
5
  var coseps = Math.cos(eps);
6
  var sineps = Math.sin(eps);
7
  
8
  var sinlon = Math.sin(coor.lon);
9
  coor.ra  = Mod2Pi( Math.atan2( (sinlon*coseps-Math.tan(coor.lat)*sineps), Math.cos(coor.lon) ) );
10
  coor.dec = Math.asin( Math.sin(coor.lat)*coseps + Math.cos(coor.lat)*sineps*sinlon );
11
  
12
  return coor;
13
}

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

von Klaus W. (mfgkw)


Lesenswert?

das soll Java sein?

von Karl H. (kbuchegg)


Lesenswert?

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
struct coordinate
2
{
3
  float lat;
4
  float lon;
5
  float ra;
6
  float dec;
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
1
struct coordinate Ecl2Equ( struct coordinate coor, int TDT )

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.

von ozo (Gast)


Lesenswert?

Sieht eher nach Javascript aus, oder?

von Pascal G. (pascalg)


Lesenswert?

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...

von Pascal G. (pascalg)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Pascal G. (pascalg)


Lesenswert?

Aua... Da weiß ich ja schon was ich im Urlaub zwischen den Jahren machen 
werde...

Ist es denn das Buch hier: 
http://www.amazon.de/Programmieren-Reference-Manual-deutscher-Sprache/dp/3446138781/ref=sr_1_2?ie=UTF8&s=books&qid=1258649824&sr=1-2

Finde da mehrere bei Amazon?

Edit:

Alles klar!

Was meint ihr zu dem hier was frei im Netz ist ?

http://de.wikibooks.org/wiki/C-Programmierung

von Klaus W. (mfgkw)


Lesenswert?

Pascal G. schrieb:
> Aua... Da weiß ich ja schon was ich im Urlaub zwischen den Jahren machen
> werde...
>
> Ist es denn das Buch hier:
> 
http://www.amazon.de/Programmieren-Reference-Manual-deutscher-Sprache/dp/3446138781/ref=sr_1_2?ie=UTF8&s=books&qid=1258649824&sr=1-2
>
> Finde da mehrere bei Amazon?

ja, das ist es.

>
> Edit:
>
> Alles klar!
>
> Was meint ihr zu dem hier was frei im Netz ist ?
>
> http://de.wikibooks.org/wiki/C-Programmierung

Probier es aus; wenn du damit klar kommst, ist es gut.

von Karl H. (kbuchegg)


Lesenswert?

Kannst dir ja mal das Strukturkapitel "Komplexe Datentypen" zum Testen 
reinziehen :-)

von Pascal G. (pascalg)


Lesenswert?

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
1
struct coor (float am, float Em, float em);
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 coor;
8
};

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

von Jörg G. (joergderxte)


Lesenswert?

Du hast den Funktionsnamen vergessen?!
Es muss ja so aussehen:
1
struct moon moon_init(...)

hth. Jörg
ps.: wenn's das nicht war, poste deinen Code

von Pascal G. (pascalg)


Lesenswert?

Jörg G. schrieb:
> Du hast den Funktionsnamen vergessen?!
> Es muss ja so aussehen:
>
1
struct moon moon_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:struct coor
2
120:{
3
121:  float xv;
4
122:  float yv;
5
123:  float v;
6
124:  float r;
7
125:} moon;
8
126:
9
127: struct moon moon_init (float am, float Em, float em);
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:  return moon_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!

von Jörg G. (joergderxte)


Lesenswert?

1
struct coor coor_init(...)
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

von Pascal G. (pascalg)


Lesenswert?

Jetzt wo ich das Semikolon vor { am Ende der Zeile 127 entfernt habe 
geht das auch schonmal. Jetzt bekomme ich für
1
struct coor
2
{
3
  float xv;
4
  float yv;
5
  float v;
6
  float r;
7
} moon;
8
9
struct coor coormoon (float am, float Em, float em)
10
{
11
  moon.xv = am * ( cos(Em) - em);
12
  moon.yv = am * ( sqrt(1.0 - em*em) * sin(Em) );
13
  moon.v = atan2(moon.yv, moon.xv);
14
  moon.r = sqrt( moon.xv*moon.xv + moon.yv*moon.yv );
15
133:  return coormoon;
16
};

jedoch die Meldung
1
../sem.h:133: error: incompatible types in return

Ich muss doch coormoon zurückgeben oder nicht?

Grüße

von Klaus W. (mfgkw)


Lesenswert?

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.

von Jörg G. (joergderxte)


Lesenswert?

Probier mal:
1
struct coor coormoon (float am, float Em, float em)
2
{
3
  struct coor local_coors; // lokale Variable definieren
4
  local_coors.xv = am * ( cos(Em) - em);
5
  local_coors.yv = am * ( sqrt(1.0 - em*em) * sin(Em) );
6
  local_coors.v = atan2(local_coors.yv, local_coors.xv);
7
  local_coors.r = sqrt( local_coors.xv * local_coors.xv 
8
    + local_coors.yv * local_coors.yv );
9
  return local_coors; // lokale Variable zurückgeben
10
}
 ..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>

von Pascal G. (pascalg)


Lesenswert?

>  ..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!

von Klaus W. (mfgkw)


Lesenswert?

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...

von Pascal G. (pascalg)


Lesenswert?

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: void coormoon (float am, float Em, float em)
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

von Naja (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

kann es sein, daß diese Funktion in einer anderen steht?
Bzw. bei der Funktion davor die schließende } fehlt?

von Klaus W. (mfgkw)


Lesenswert?

also schon eine Mehrheit mit dieser Meinung, dann muß es stimmen...

von Pascal G. (pascalg)


Lesenswert?

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 :-)

von Klaus W. (mfgkw)


Lesenswert?

Wohl wahr.
Es gibt auch Taschenrechner, die man mit C programmieren kann  :-)

von Naja (Gast)


Lesenswert?

>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
int a (char k, short Beispiel) {
2
  machwas (k);
3
  int b (short y, char EinZeichen) {
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!!!

von Naja (Gast)


Lesenswert?

@ 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.

von Naja (Gast)


Lesenswert?

Oh je. Der Mann hat aufgehört hier zu lesen und schreibt jetzt seinen 
Code so um, das er ohne structs geht. Naja, so lernt man's.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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.

von Naja (Gast)


Lesenswert?

@ 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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.