Forum: Mikrocontroller und Digitale Elektronik C String-Problem


von MÄX (Gast)


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

von MÄX (Gast)


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.

von SeppKnallhirsch (Gast)


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?

von MÄX (Gast)


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.

von Olaf (Gast)


Lesenswert?

Hallo MÄX,

poste doch mal die Zeile die der Compiler anmeckert.

Gruß

Olaf

von MÄX (Gast)


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.

von Olaf (Gast)


Lesenswert?

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ß

von MÄX (Gast)


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);

von Olaf (Gast)


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";

von MÄX (Gast)


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

von Olaf (Gast)


Lesenswert?

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

von MÄX (Gast)


Angehängte Dateien:

Lesenswert?

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...

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

>Ja hat denn keiner eine Idee?

Falsches Forum, nächstes mal bitte das richtige auswählen, dann
bekommst Du auch wesentlich mehr hilfe!

von Karl heinz B. (heinzi)


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.

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
Noch kein Account? Hier anmelden.