Hallo Leute, habe ein kleines Problemchen beim ansteuern eines Grafik-Displays. Ich habe mir eine Routine geschrieben, um die Daten für den Grafikmodus zu übertragen. Das ganze soll zunächst mal ganz billig und simpel mit einem C-String funktionieren. Wird jetzt aber etwa ein 'newline character' in diesem Array übergeben, dann beschwert sich mein Compiler. Eine mögliche Abhilfe sehe ich in dem kompletten Umrechnen der Daten in Hex-Werte - aber ist das wirklich nötig? Hier zunächst meine Funktion: //---------------------------------------------------------------------- ------- // lcd_write_image // @param *fmap: c_string formated image //---------------------------------------------------------------------- ------- // Write a 320x240 (9600 bytes) sized image into graphic RAM. // void lcd_write_image(char *fmap) { int i; u8 para[2]; // set cursor to graphic address para[0] = 0xb0; para[1] = 0x04; lcd_write_command(CSRW, 2, para); // write to memory lcd_write_cmd(MWRITE); for(i=0; i<9600; i++) { lcd_write_data(fmap[i]); } } Die Hardware mit der ich hier arbeite, ist ein Silabs c8051F020 uC und ein GLCD mit 320x240 Pixel, mit integriertem Epson/Seiko S1D13305. Habe ich was vergessen? Gruß MÄX
Ja hat denn keiner eine Idee? Hier sind doch sonst immer die vielen guten Programmierer. Ich will mich hier übrigens auch nicht unbedingt festlegen auf c... es darf von mir aus auch ein Vorschlag in c++ oder assembler sein; Basic oder pascal ist glaube ich zu "weit ab vom Schuss". Mein Compiler versteht zwar auch viele Sprachen, aber die Richtung sollte schon einigermaßen beibehalten werden - sonst muss ich ja ganz von vorne anfangen.
>Wird jetzt aber etwa ein 'newline character' in diesem Array >übergeben, dann beschwert sich mein Compiler. Eine mögliche Abhilfe Bitte spezifizieren: Wie beschwert sich der Compiler? Fehlermeldung? An welcher Stelle?
Ah, gut das du fragst: Compilermeldung: E019: newline character in constant Das bezieht sich dann (logischer weise) auf die Zeile mit dem Funktionsaufruf. Also zum beispiel so: lcd_write_image("cstring"); Wobei der cstring dann die "ungültigen" Zeichen enthält.
Hallo Olaf, Wenn du die newline-Zeichen als ASCII meinst... die kann ich hier nicht einfügen, der IE nimmt die auch nit. Die Zeichen stehen halt so in meiner Daten-datei. Das dürfte der ASCII-Code (13) oder sowas sein (im Fall von newline). Bis auf das "cstring" ist die Zeile identisch.
Hallo MÄX, dann schreib do "an dieser Stelle steht NL". Aber die ganze Zeile ist wichtig, um zu sehen wo das Problem liegt. Oder Mail mir odreyer at harmanbecker dot com . Gruß
Das Problem liegt "nur" am Compiler, weil er diese Steuerzeichen nicht mehr als Cstring akzeptiert. Deswegen habe ich auch angefangen mir ein kleines Tool in C zu schreiben, das mir die Datei komplett in ein Hex-Array umwandelt. Damit werden die Werte dann später so übergeben: parameter[n] = {0x13, 0x13, 0x65, 0x00,..., 0x13}; lcd_write_image(parameter);
Ich weiß nicht warum Du die Zeile nicht posten willst. Du hast Hexwerte geschrieben: 0x13 ist das Zeichen "DC3". Du meinst sicher 0d13 was "CR" (CarriageReturn) bedeutet. Dieses Zeichen schreibt man in einem String so: char string[]="\r"; Damit bekommst Du aber in den meisten Fällen kein Zeilenvorschub hin (CR bedeutet nämlich Wagenrücklauf). Zeilenvorschub ist 0x0A (Zeichen NL, NewLine) und dient unter (fast) allen Betriebsystemen als dazu in die nächste Zeile zu springen. CR\NL-Kombinationen gibts nur auf Betriebsystemen die direkt von einer Schreibmaschine abstammen (Schreibmaschine -> MS-DOS -> MS-Windows (3.1, NT, 2k, XP, ...). Schau mal auf http://www.unicode.org/charts/PDF/U0000.pdf nach. Ich hoffe ich konnte Dir helfen. Gruß Olaf PS: Ein korrekter String wäre: char parameter[] = "Zeile1\nZeile2";
Ja, entschuldige Olaf. 13 Dezimal ist natürlich 0x0d Hexadezimal. Von mir aus ist der newline-Befehl auch 0x0a, das weisst du sicher besser als ich. Kern der Sache ist aber, dass meine Daten diese Zeichen zwangsläufig enthalten (unabhängig vom Betriebssystem), da ich mit einem character nur so 256 verschiedene Zustände darstellen kann. Das hängt mit mathematischen Operatoren zusammen, die hier allerdings kein Problem darstellen. Ich WILL die Zeile schon posten - habe ich ja auch - nur ganz original geht es aus den zuvor genannten Gründen leider nicht. Ich danke dir für deine Hilfe und die ausführliche ASCII-Tabelle! Gruß MÄX
Ok, ok, ich wollte Dir nicht zu nahe treten. Ich WILL Dir schon helfen. ;-) Also häng die Zeile (besser die Datei) als Anhang an Dein nächstes Posting oder mail sie mir. Gruß Olaf
Na, nicht doch... ist schon in Ordnung. Aber nachdem ich mir nen Konverter zusammengehackt habe funst das jetzt! Hier ist mal der Code von meinem kleinen Konverter...
>Ja hat denn keiner eine Idee?
Falsches Forum, nächstes mal bitte das richtige auswählen, dann
bekommst Du auch wesentlich mehr hilfe!
Damit hast Du aber immer noch keine Erklaerung fuer Dein urspruengliches Problem. Willst Du den gar nicht wissen, wo denn das Problem liegt? Poste doch mal den Originalen Code, den den Dir der Compiler angemeckert hat! Dann erklaeren wir Dir warum das so nicht geht und was Du anders machen musst. Aber ich vermute mal. Du wolltest sowas wie lcd_write_image( "String1 String2" ); machen und hast erwartet, dass der Compiler das als * erst "String1" ausgeben * dann Zeilenvorschub * dann "String2" ausgeben zulaesst. Tut er aber nicht. Um einen Zeilenvorschub in einen String einzufuegen, benutzt man die sog. Escape-Schreibweise. Ein Zeilenvorschub sieht dort so aus: '\n' Also muss das Ganze heissen: lcd_write_image( "String1\nString2" ); Und dann klappts auch mit dem Compiler. \n Zeilenvorschub \r Wagenruecklauf \t Tabulator \a Lass die Glocke klingeln ... Da gibts noch ein paar mehr davon. Kann mir nicht alle merken. Die obigen sind aber die gebraeuchlichsten. So. Das vermute ich mal sollte Dein urspruengliches Problem loesen. Wenn nicht: Grundregel #1. Bei Problemen mit Code -> poste den Code.
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.