C String-Problem

Gast #262994
Lesenswert?

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
Gast #262995
Lesenswert?

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.
Gast #262996
Lesenswert?

>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?
Gast #262997
Lesenswert?

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.
Gast #262999
Lesenswert?

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.
Gast #263001
Lesenswert?

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);
Gast #263002
Lesenswert?

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";
Gast #263003
Lesenswert?

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
#263007
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren