Hi erstmal :) Ich habe folgendes Problem.. ich will zu Testzwecken eine sehr große Konstante in den ROM schreiben.. dies mach ich mit char code daten[] = { .. 40k hexwerte }; der Controller hat 64k Ram, geht sich also Problemlos aus.. sind auch richtig im ROM. nun will ich aber auf einzelne Bytes zugreifen.. der erste Versuch war ein direkter Zugriff also über daten[ziffer].. ein korrekter Zugriff war so nicht möglich? genauer: ich verwendete if(daten[1533]==0xFF) .... das Programm springt trotz richtigem Inhalt nicht in die Schleife Somit versuchte ich es über einen Pointer char *test; test=test+1533; if(*test==0xFF) .... das selbe.. springt nicht in die schleife, obwohl eindeutig 0xFF dort steht.. (zur Kontrolle wurden alle Mittel des Keil debuggers verwendet). dann gings weiter.. char *test; char space; test=test+1533; space=*test; --> in space steht nun definitiv 0xFF laut debugger! if(space==0xFF) ... --> springt NICHT in diese schleife ?! Ich hoffe ihr habt ne idee, ich bin echt am verzweifeln.. falls es eine bessere möglichkeit gibt auf diese Datenmenge zuzugreifen bin ich gerne offen für Vorschläge.. bei den Daten handelt es sich übrigens um ein MP3-File welches später über zu Testzwecken über den internen MP3-Dekoder ausgegeben werden soll (AT89C51SND1C).. Danke für eure Hilfe Grüße Manuel
Beiliegend das Testprojekt.. ist ein Keil Projekt (main.c ist der source)
Hallo Michael Danke für deine Antwort.. war ein guter Denkanstoss :) ich weiß zwar ehrlichgesagt den unterschied zwischen signed und unsigned char nicht.. (vielleicht kann mir das wer erklären :), aber nachdem ich jetzt den pointer test als unsigned definiert habe, funktioniert das so.. :) Danke, Schöne Grüße Manuel
signed geht von -127 bis +128. unsigned von 0...255. daher konnte deine bedingung (==255) nie erfüllt werden. manche compiler meckern da übrigens...wie heisst der prozessor eigentlich ?
manuel: schäm dich. sowas muss man unbedingt wissen ! 10 mal vaterunser aufsagen und einmal auf knien ums haus !
:) @dicky: ist ein Atmel AT89C51SND1C Kompiliert wurde mit Keil (7.10 compiler).. ohne warnung :( übrigens ich höre tatsächlich zum ersten mal heute dass es unsigned char gibt.. find ich auch komisch.. naja wieder was gelernt :)
ja mensch das ist total wichtig ! siehe auch int und unsigned int, long und unsigned long. wenn man das nicht weiss kommt man schnell in teufels küche. egal ob globale variable, array usw... nur bei float, double und bool gibt es die unterscheidung nicht. ein typisches problem sind z.b. char (signed) in for/next schleifen wenn die variable über 128 kommen kann...wer von (ältere versionen) basic kommt, weiss das manchmal nicht. auch in asm sieht man zunächst alles wie unsigned char oder unsigned int, allerdings gibt es wohl keinen asm-anwender der das nicht zumindest theoretisch weiss. merken: wenn irgendwo char,int oder long steht, ist immer die "signed-version" gemeint. die unsigned version muss immer explizit angegeben werden. wenn irgendwo aber nur "unsigned" steht, ist stillschweigend "unsigned int" gemeint. ist leider anfangs etwas verwirrend.
bei integer wars mir immer klar.. da machts ja auch sinn (negative zahlen..) aber bei char find ichs etwas seltsam.. natürlich ist ein char auch nur ein byte, is ja auch ne zahl.. macht also genauso sinn gut zu wissen auf jedenfall :)
ja und auf 8-bittern will man ja auch mal mit negativen zahlen was machen...
was mir immer noch komisch vorkommt ist halt das ich ja trotzdem nur hexwerte vergleiche.. und die warn ja trotzdem gleich.. für was sie stehen sollte ja egal sein bei so etwas..
@Manuel: Das der Compiler in dem Fall den (signed) char Wert (der natürlich maximal 128 groß sein kann) nicht als 0xFF erkennt liegt daran, das der Wert, der in der char-Variablen gespeichert ist, als -1 angesehen wird, dagegen wird die 0xFF als vorzeichenbehaftete (also positive) int Zahl interpretiert und (char)-1 == 255 ist nunmal falsch! ;)
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.