PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Syntax-Frage -> writeString(char *string)



Furzgas
30.12.2009, 01:44
Hallo Leute!
Ich bin neu hier, und auch neu in der Roboter-Szene :o)
Ich habe zu Weihnachten so einen RP6 bekommen.
Der erste hatte einen defekten Drehzalgeber auf der rechten Seite. Nachdem ich das Teil bei Conrad umgetauscht habe scheint dieses Problem behoben zu sein.

So nun zu meiner Frage:
was bedeutet die Syntax des Arguments in "writeString(char *string)", bzw. das Sternsymbol irritiert mich. Was bedeutet das?
und was bedeutet:
void writeNStringP(const char *pstring)
Hier stehen 3 Einträge als Argument.

Kann mir das bitte wer erklären!?
Danke im voraus!

suicide
30.12.2009, 07:55
Durch den Stern-Operator wird nicht der Wert von string übergeben sondern dessen Adresse im Speicher. Call-by-reference ist das Stichwort. Arbeite dich mal durch ein C Pointer Tutorial. Ich denke, das wird dir besser helfen als kurze, auf diesen Fall bezogene Antworten hier im Forum.
Und immer merken: "Wenn der Stern nicht funktioniert muss da ein Ampersand hin" (Zitat meines Profs) ;-)

Xandi11
30.12.2009, 08:24
Gibt es für diese Operatoren eigentlich eine wirklich sinnvolle Anwendung (beim RP6) ?

suicide
30.12.2009, 09:14
Ich möchte in verschiedenen Teilen meines M32 Programms die Werte der Lichtsensoren auslesen. Ich habe dazu eine Methode implementiert, der ich zwei Pointer auf Variablen für den linken und den rechten Lichtsensor mitgebe. Die Methode liest die Sensoren vom Baseboard aus und schreibt die Werte in den Speicher, der durch die Pointer vorgegeben wurde.
Alternativ könnte ich die Werte in einem Array von der Methode zurückgeben lassen. Dann bräuchte ich aber nochmal zwei Variablen in denen ich die Werte speichern und zurückgeben kann. Oder ich definiere zwei globale Variablen die halt immer da sind und immer einen mehr oder weniger aktuellen Wert der Lichtsensoren enthalten. Irgendwie fand ich die Pointerlösung sauberer.

Grüße,
Jan

Xandi11
30.12.2009, 09:25
Die "Alternativ"-Methode mit den Feldern bzw. mit den globalen Variablen kommt mir sehr bekannt vor :cheesy: .

Ich habe zwar gewusst, dass es mit die Zeigermethode gibt, aber auf die Idee damit die Sensoren der Base auszulesen bin ich nicht gekommen.

Das werde ich gleich mal ausprobieren. 8)

Danke für dein BSP

Furzgas
30.12.2009, 13:29
Ich bin selber Softwareentwickler, aber in Java.
C hab ich auch gelernt, 4 Semester lang, aber da ich es seitdem nie verwendet habe, habe ich leider alles wieder vergessen :o(

Ich habe da noch ne Frage:
Wie ist das zu verstehen, bzw. was ist hier bei folgendem Argument gemeint?
void writeNStringP(const char *pstring)

Muss hier das char-Argument eine definierte Konstante sein?

p_mork
30.12.2009, 15:58
Es wird ein Zeiger auch einen konstanten char erwartet. Man kann also davon ausgehen, dass pstring niemals schreibend dereferenziert wird.

MfG Mark

PS: const ist in C(++) ungefähr das, was in Java final ist.

Xandi11
30.12.2009, 16:06
Es wird ein Zeiger auch einen konstanten char erwartet. Man kann also davon ausgehen, dass pstring niemals schreibend dereferenziert wird.

MfG Mark

Ich glaube fast, das unterhalb von suicide ist verständlicher ...


Durch den Stern-Operator wird nicht der Wert von string übergeben sondern dessen Adresse im Speicher. Call-by-reference ist das Stichwort. Arbeite dich mal durch ein C Pointer Tutorial. Ich denke, das wird dir besser helfen als kurze, auf diesen Fall bezogene Antworten hier im Forum.
Und immer merken: "Wenn der Stern nicht funktioniert muss da ein Ampersand hin" (Zitat meines Profs)

Furzgas
30.12.2009, 19:06
@p_mork
Danke, aber widerspricht sich das nicht!?
Wieso die Referenz auf eine Konstante legen? Den Wert dieser Referenz darf man ja nicht ändern, was soll das für einen Sinn haben? Angemessen wäre es bei Konstanten immer den Wert (Call by Value) zu übergeben, oder?
Ich hab diese Funktionssyntax übrigens in einem der Übungsbeispiele des RP6 gefunden.

Gibts eigentlich eine Funktionsbibliothek um den Roboter in Java zu programmieren?

@Xandi11
Was meinst Du mit deinem vorigen Post bzgl. suicide...?
Und was meinst Du mit
"Wenn der Stern nicht funktioniert muss da ein Ampersand hin"?
Was bewirkt ein Ampersand?

Danke für eure Hilfe!

Xandi11
30.12.2009, 19:15
Ich wollte einfach auf eine Post (von suicide) etwas weiter oben hinweisen :cheesy:

p_mork
30.12.2009, 20:31
@Furzgas

const sagt in diesem Fall aus, dass der Zeiger nur lesend und nicht schreibend dereferenziert (an zu stelle zugegriffen, wo der Zeiger hinzeigt) werden darf. Die Funktion darf auch mit der Adresse eines nicht-konstanten chars aufgerufen werden, da man char* immer ohne Bedenken nach const char* casten kann. Nur andersrum, also wenn die Funktion einen char* erwarten würde und nicht const char*, dürfte man ihr nicht einen Zeiger auf einen konstanten char übergeben, da es nicht sichergestellt sein würde, dass die Funktion nur lesend darauf zugreift.

Ich habe keinen RP6 und kenn mich dementsprechend nicht mit der Lib aus, aber vermutlich erwartet die Funtion einen null-terminierten String als Argument. In C sind Strings immer Arrays aus chars, wobei das Stringende duch einen 0-character kenngezeichet ist. Und Arrays übergibt man üblicherweise indem man die Adresse auf das erste Element angibt.

Sorry, aber das sind alles Grundlagen von C, die man auch draufhaben sollte. http://tutorial.schornboeck.net/inhalt.htm ist ein gutes Tutorial dafür. Dort ist auch beschrieben was Zeiger sind und wie man mit ihnen umgeht.

Es gibt eine Java-VM für AVRs ( http://www.harbaum.org/till/nanovm/index.shtml ), man muss aber bedenken, dass der Java-Bytecode dort interpretiert wird und um den Faktor 50 langsamer ist als nativ ausgeführter Code.

Wenn Du objektorientiert programmieren möchtest, kanns Du auch C++ nehmen, dies wird vom avr-g++ größtenteils unterstützt.

MfG Mark

Furzgas
30.12.2009, 21:04
Danke p_mork!
Kenn mich aus :)
Das ist wieder total ungewohnt für mich, nach jahrelangem Java wieder C zu programmieren. Alleine diese Unannehmlichkeit mit diesen Zeigern, die Java einem abnimmt.

suicide
30.12.2009, 22:22
Hehe, hab auch jahrelang in Java entwickelt. Zwischendurch war mal ein Projekt in C auf nem Digi Wime Modul. Das ist zum Glück nie über nen Prototypen hinaus gegangen. Der Code sah unter aller Sau aus :D.
Auf dem RP6 sieht das Ganze vermutlich nicht viel besser aus aber ich wollt die Gelegenheit nutzen um mal wieder was mit C zu machen.
Code optimieren kann man später noch, genau wie Doku schreiben O:) ;-)

Grüße,
Jan

Xandi11
31.12.2009, 08:06
Code optimieren kann man später noch, genau wie Doku schreiben Angel Zwinkern

Das ist mal ne Aussage, die gefällt mir :mrgreen: