Hallo. bisher habe ich immer folgende funktio benutzt: unsigned int Code_Length = sizeof (text); text ist eine konstante im flash ROM. Allerdings kann ich diese funktion nicht mehr nehmen, da ich die Länge zur laufzeit ermitteln muss. ich habe es mit unsigned int Code_Length = strlen(&text); und unsigned int Code_Length = strlen(text); schon versucht. Aber irgendwie geht es nicht. Das letzte zeichen Der Konstante ist \0 als ist die konstante nullterminiert und demit müsste doch die funktion strlen gehen. oder? Was gibt es für alternetivfunktionen ? Oder wende ich sie nur falsch an ? MfG
Auf einem AVR funktioniert strlen nicht mit im Flash abgelegten Stringkonstanten. Das liegt an der Harvard-Architektur. Verwende stattdessen strlen_P, das ist eine AVR-spezifische Funktion, die statt auf's RAM eben auf's ROM zugreift.
funktioniert leider auch nicht. egal ob strlen_P(text) oder strlen_P(*text) oder strlen_P(&text)
Die erste Schreibweise wäre wenigstens korrekt. Was genau heisst "funktioniert nicht"? Stürzt das Programm ab, wird 0 zurückgegeben oder inwiefern weicht der Rückgabewert vom erwarteten Wert ab?
ich weiss nicht genau, jedenfalls kommt ein wert heraus der viiiiel zu nieder ist. Ich hab mal den wert ins eeprom geschrieben und dann ausgelesen. es kam 28 raus aber ich hab ein integer wert in ein byte geschrieben. wie kann ich denn die gesamte zahl herausbekommen ? MfG
Poste doch bitte mal ein Minimal-Beispiel, das die fehlerhafte Ausgabe erzeugt. Hellsehen funktioniert (bei mir) nicht so gut. btw, (nicht böse gemeint): Lies dir bitte ein C-Buch oder Tutorial über Pointer durch. Dann wüsstest du, dass strlen(*text) und strlen(&text) Quatsch sind.
mein code: unsigned int Code_Length = strlen_P(text)-1; eeprom_wb(1, Code_Length); if (Code_Length % 2 != 0) UI_Error(); klar is des quatsch aber man kanns ja mal versuchen. ;)
Dein Code lässt sich nicht kompilieren. Wie ist text definiert? Ohne in der Doku nachgesehen zu haben: eeprom_wb klingt stark nach "write byte". Du übergibst aber zwei Bytes, nämlich einen unsigned int. Da wird beim Speichern wohl was abgeschnitten werden. > klar is des quatsch aber man kanns ja mal versuchen. ;) Natürlich, wenn etwas überhaupt nicht funktioniert, versucht man auch gerne mal "seltsame" Konstrukte. Dummerweise führen die extrem selten zum Erfolg. ;-) Ein Debugger (in dem Fall Simulator) hilft viel mehr. In dem Beispiel war es übrigens wirklich Quatsch und nichtmal einen ernsten Versuch wert. Das hat schon fast was von: http://thedailywtf.com/ShowPost.aspx?PostID=29051 (Wer Ironie findet darf sie verkaufen).
ja,das mit dem byte schreiben und 2 bytes schreiben wollen hab ich ja schon gesagt. ich wollt nur sehen, ob da sich überhaupt was tut. text ist so definiert: prog_char text[] = { 0x5A, 0xC1, 0x73, 0xC1, 0x72, 0xC1, 0x71, 0xC1, 0x70, 0xC1, 0x6F, 0xC1, 0x6E, 0xC1, 0x6D, 0xC1, 0x6C, 0xC1, 0xB1, 0xC4, 0x6A, 0xC1, 0x7A, 0xC5, 0x31, 0xC5, 0x67, 0xC1, 0xC4, 0xCE, 0xEB, 0xC9, 0x64, 0xC1, 0x63, 0xC1, 0x62....,\0 }; ich kann den code zwar compilieren aber es kommt ein völlig falscher wert heraus.
> ja,das mit dem byte schreiben und 2 bytes schreiben wollen hab ich ja > schon gesagt. ich wollt nur sehen, ob da sich überhaupt was tut. > [...] > ich kann den code zwar compilieren aber es kommt ein völlig falscher > wert heraus. Hmm... es tut sich nichts, aber es kommt ein falscher Wert raus? Wenn du einen integer in ein byte quetschst, ist es nicht sehr verwunderlich, wenn ein falscher Wert rauskommt. Sobald text länger als 256 Zeichen ist, passt das Ergebnis nicht mehr in ein Byte. Hat text mehr als 256 Zeichen?
Ja, das der wert nicht richtig sein kann bemerke ich am weiteren Programmverlauf. Denn normalerweise dauert die schleife ca. 8-9 sec. so dauert sie nur ne halbe sekunde. also ist der wert viel zu klein.
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.