Hallöchen, ich nutze i.d.R Atmel-Avr Studio zusammen mit dem GC-Compiler. Nun habe ich ein kleines Problem. Ich habe eine Zeichenkette, z.B. 20 Character, in einer Funktion und möchte diese Zeichenkette in einer andere Funktion bearbeiten (das ist zwar nicht genau der Anwendungsfall, aber so ist es leicht verständlich). Ich denke, ich tippe mal hin, wie ich mir das vorstelle - auf die Art und Weise funktioniert es aber nicht :-( void cbrTest(unsigned char *myc); int main(void) { unsigned char mychar[20]; cbrTest(mychar); // hier brauche ich dann in mychar die Werte aus cbrTest... } void cbrTest(unsigned char *myc) { *myc = '1'; myc++; *myc = '2'; }
> Ich denke, ich tippe mal hin, wie ich mir das vorstelle - auf die > Art und Weise funktioniert es aber nicht :-( Was heißt das? Was funktioniert nicht? Was erwartest du und was passiert stattdessen? > void cbrTest(unsigned char *myc); Ich dachte, es geht um Zeichenketten? Warum dann nicht char*? > int main(void) > { > unsigned char mychar[20]; > cbrTest(mychar); > > // hier brauche ich dann in mychar die Werte aus cbrTest... Ja, da schickst du sie ja auch hin. > } void cbrTest(unsigned char *myc) { *myc = '1'; myc++; *myc = '2'; } Wenn's eine Zeichenkette sein soll, muß sie in der Regel noch mit einem '\0' terminiert werden.
Hi ich nutze in der regel ein Character-Feld für "Zeichenketten"...wüsste auch nicht, was ich anderes nehmen sollte um halbwegs "platz optimiert" zu arbeiten. Aber darum geht es ja eigentlich nicht ;-) Ich hätte eigentlich erwartet, dass nach dem Aufruf von cbrTest mychar wie folgt ausschaut: mychar[0]=1 mychar[1]=2 Die restlichen sind undefiniert... Das ist aber nicht so. mychar ist einfach so wie es initilisiert wurde bzw. völlig undefiniert. cbrTest schreibt meiner Ansicht nach irgendwo ins Nirvana...aber warum?
>Das ist aber nicht so. mychar ist einfach so wie es initilisiert wurde >bzw. völlig undefiniert. >cbrTest schreibt meiner Ansicht nach irgendwo ins Nirvana...aber warum? Das fällt ja fast schwer zu glauben. Vielleicht solltest Du doch Dein "original Problem Code" posten. Ich kann hier keinen Fehler entdecken.
Ok, da ist er: Prototyp von callbyref ist angelegt. { ... uint8_t temp = 0b11000000; unsigned char mychar[10]; strcpy(mychar,"###########"); while(1) { temp |= mylines[0].uiPos ; lcd_command(temp); // fwait(200); callbyref(mychar[0]); lcd_string_out(&mychar[0]); } ... } void callbyref(unsigned char *str) { *str = '1'; str++; *str = '2'; }
*myc = '1'; <----------------------- dort wo der Zeiger hinzeigt wird was eingetragen myc++; <------------Zeiger verstellen *myc = '2'; <----------- irgendwo hinschreiben
nönö: callbyref(mychar[0]); ist falsch. Eigentlich müsste der Compiler da ne Cast-Warnung ausgeben. Übersetz mal mit -Wall entweder du machst: callbyref(mychar); oder callbyref(&mychar[0]); was im Prinzip das Gleiche ist. Gruß Roland
wenn dein Feld nur 10 Chars gross ist kannst du nicht 12 Zeichen reinkopieren Walter
@Walter - danke für den Hinweis, aber ich glaube Du hast da was übersehen ;-) Nichts für ungut! @Roland. Also mit Callbyref(mychar) gehts! Aber, wieso? Ob ich nun die Adresse vom Beginn, bzw. die Adresse vom ersten - argh...Da geht mir doch glatt ein Lichtlein auf ;-) Gut, ich habs verstanden! callbyref(mychar) --> Adresse vom ersten Element wird übergeben callbyref(&mychar[0]) --> Adresse vom ersten Element wird übergeben callbyref(mychar[0]) --> Value vom ersten Elemnt wird übergeben, denn mychar ist ja nicht als Zeiger angelegt... Sehe ich das richtig?
> Sehe ich das richtig? JA !! > @Walter - danke für den Hinweis, aber ich glaube Du hast da was >übersehen ;-) Nichts für ungut! Und was soll er übersehen haben ? Ich hab's auch übersehen
@Thomas: Nicht so voreilig. Deine Zeilen: unsigned char mychar[10]; strcpy(mychar,"###########"); kopieren 12 Zeichen (11# + \0) in ein 10-Zeichen-Feld. Das ist Mumpitz. Grüße, Freakazoid
Ach, das meint ihr drei ;-) Da habe ich mich wohl um zwei verzählt! Ich bin fest davon ausgegangen, dass dort nur Neun Rauten stehen und mir gedacht, naja - der Walter meint wohl noch die '1' und die '2'...Da habe ich wohl was übersehen ;-)
> ich nutze in der regel ein Character-Feld für "Zeichenketten"... Hier aber nicht. Der Typ für Zeichen ist char. Du benutzt aber unsigned char, und ich wollte nur wissen, warum nicht char. > Aber darum geht es ja eigentlich nicht ;-) Ich dachte mir halt, ich merk's trotzdem mal an.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.