mikrocontroller.net

Forum: Compiler & IDEs Struct in einer Funktion


Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht 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:
// Transform ecliptical coordinates (lon/lat) to equatorial coordinates (RA/dec)
struct coor
  {
    int lon;
    int lat;
  };

float Ecl2Equ(coor, float TDT)
{
  float T = (TDT-2451545.0)/36525.; // Epoch 2000 January 1.5
  float eps = (23.+(26+21.45/60.)/60. + T*(-46.815 +T*(-0.0006 + T*0.00181) )/3600. )*DEG;
  float coseps = cos(eps);
  float sineps = sin(eps);
  
  float sinlon = sin(coor.lon);
  float coor.ra  = Mod2Pi( atan2( (sinlon*coseps-tan(coor.lat)*sineps), cos(coor.lon) ) );
  float coor.dec = asin( sin(coor.lat)*coseps + cos(coor.lat)*sineps*sinlon );
  
  return coor;
}

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MeinerEiner (Gast)
Datum:

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

struct coor
  {
    int lon;
    int lat;
  };

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch das, ja

Autor: kokisan2000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> ach so:
>
>   float coor.ra  = Mod2Pi( atan2( (sinlon*coseps-tan(coor.lat)*sineps),
> cos(coor.lon) ) );
>   float coor.dec = asin( sin(coor.lat)*coseps +
> cos(coor.lat)*sineps*sinlon );
> 
> 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:
float Ecl2Equ(coor, float TDT)

Wieso ist denn oben das Quark? Klär mich dochmal auf!

Autor: Thomas K. (muetze1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann benenn doch mal den Typ und den Namen deines ersten Parameters!

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
// Transform ecliptical coordinates (lon/lat) to equatorial coordinates (RA/dec)
struct coor
  {
    float lon;
    float lat;
    
    float ra;    // das fehlte wohl
    float dec;   // das auch
  };

// fehlende Definitionen nachholen
#define DEG 360.0
#include <math.h>
float Mod2Pi (float);

// Der Rückgabetyp der Funktion ist offensichtlich
// coor und nicht float.
struct coor Ecl2Equ(struct coor location, float TDT)
{
  float T = (TDT-2451545.0)/36525.; // Epoch 2000 January 1.5
  float eps = (23.+(26+21.45/60.)/60. + T*(-46.815 +T*(-0.0006 + T*0.00181) )/3600. )*DEG;
  float coseps = cos(eps);
  float sineps = sin(eps);
  
  float sinlon = sin(location.lon);
  location.ra  = Mod2Pi( atan2( (sinlon*coseps-tan(location.lat)*sineps), cos(location.lon) ) );
  location.dec = asin( sin(location.lat)*coseps + cos(location.lat)*sineps*sinlon );
  
  return location;
}

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
entweder verienbart man eine float-Variable:
    float c = irgendwas*wasanderes;

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

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
>
float Ecl2Equ(coor, float TDT)
>
> Wieso ist denn oben das Quark? Klär mich dochmal auf!

Also das mit den Bienen geht folgendermaßen...

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> entweder verienbart man eine float-Variable:
>
>     float c = irgendwas*wasanderes;
> 
>
> Oder eine Variable vom Typ der struct:
>
>     struct coor   einCoor;
>     einCoor.lon = blabla;
>     einCoor.lat = blabla;
> 
>
> Aber:
>
>     float coor.ra  = ...;
>     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.)


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:
function Ecl2Equ(coor, TDT)
{
  T = (TDT-2451545.0)/36525.; // Epoch 2000 January 1.5
  eps = (23.+(26+21.45/60.)/60. + T*(-46.815 +T*(-0.0006 + T*0.00181) )/3600. )*DEG;
  var coseps = Math.cos(eps);
  var sineps = Math.sin(eps);
  
  var sinlon = Math.sin(coor.lon);
  coor.ra  = Mod2Pi( Math.atan2( (sinlon*coseps-Math.tan(coor.lat)*sineps), Math.cos(coor.lon) ) );
  coor.dec = Math.asin( Math.sin(coor.lat)*coseps + Math.cos(coor.lat)*sineps*sinlon );
  
  return coor;
}

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das soll Java sein?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
struct coordinate
{
  float lat;
  float lon;
  float ra;
  float dec;
};

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

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht eher nach Javascript aus, oder?

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht 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-Manua...

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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-Manua...
>
> 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst dir ja mal das Strukturkapitel "Komplexe Datentypen" zum Testen 
reinziehen :-)

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal Hallo!

Also ich habe jetzt mal im C Buch gelesen, ich verstehe da mit den 
struct's irgendetwas falsch.

Ich lege mit
struct coor
{
  float xv;
  float yv;
  float v;
  float r;
} 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
struct coor (float am, float Em, float em);
{
  moon.xv = am * ( cos(Em) - em);
  moon.yv = am * ( sqrt(1.0 - em*em) * sin(Em) );
  moon.v = atan2(moon.yv, moon.xv);
  moon.r = sqrt( moon.xv*moon.xv + moon.yv*moon.yv );
  return coor;
};

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

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast den Funktionsnamen vergessen?!
Es muss ja so aussehen:
struct moon moon_init(...)

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

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg G. schrieb:
> Du hast den Funktionsnamen vergessen?!
> Es muss ja so aussehen:
>
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:
119:struct coor
120:{
121:  float xv;
122:  float yv;
123:  float v;
124:  float r;
125:} moon;
126:
127: struct moon moon_init (float am, float Em, float em);
128: {
129:  moon.xv = am * ( cos(Em) - em);
130:  moon.yv = am * ( sqrt(1.0 - em*em) * sin(Em) );
131:  moon.v = atan2(moon.yv, moon.xv);
132:  moon.r = sqrt( moon.xv*moon.xv + moon.yv*moon.yv );
133:  return moon_init;
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!

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt wo ich das Semikolon vor { am Ende der Zeile 127 entfernt habe 
geht das auch schonmal. Jetzt bekomme ich für
struct coor
{
  float xv;
  float yv;
  float v;
  float r;
} moon;

struct coor coormoon (float am, float Em, float em)
{
  moon.xv = am * ( cos(Em) - em);
  moon.yv = am * ( sqrt(1.0 - em*em) * sin(Em) );
  moon.v = atan2(moon.yv, moon.xv);
  moon.r = sqrt( moon.xv*moon.xv + moon.yv*moon.yv );
133:  return coormoon;
};

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

Ich muss doch coormoon zurückgeben oder nicht?

Grüße

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal:
struct coor coormoon (float am, float Em, float em)
{
  struct coor local_coors; // lokale Variable definieren
  local_coors.xv = am * ( cos(Em) - em);
  local_coors.yv = am * ( sqrt(1.0 - em*em) * sin(Em) );
  local_coors.v = atan2(local_coors.yv, local_coors.xv);
  local_coors.r = sqrt( local_coors.xv * local_coors.xv 
    + local_coors.yv * local_coors.yv );
  return local_coors; // lokale Variable zurückgeben
}
 ..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>

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht 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
  xv = am * ( cos(Em) - em)
yv = am * ( sqrt(1.0 - em*em) * sin(Em) )
v = atan2(yv, xv)
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!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht 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:
133: void coormoon (float am, float Em, float em)
{
  moon.xv = am * ( cos(Em) - em);
  moon.yv = am * ( sqrt(1.0 - em*em) * sin(Em) );
  moon.v = atan2(moon.yv, moon.xv);
  moon.r = sqrt( moon.xv*moon.xv + moon.yv*moon.yv );
  return;
};

Compiler:
../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

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also schon eine Mehrheit mit dieser Meinung, dann muß es stimmen...

Autor: Pascal G. (pascalg)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int a (char k, short Beispiel) {
  machwas (k);
  int b (short y, char EinZeichen) {
    machwasandres (y);
  }
}

Hier ist die Funktion b innerhalb der Funktion a definiert. Das geht 
nicht!

Mit structs oder nicht hat die Fehlermeldung nichts zu tun!!!

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.