www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C String-Problem


Autor: MÄX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MÄX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: SeppKnallhirsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MÄX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo MÄX,

poste doch mal die Zeile die der Compiler anmeckert.

Gruß

Olaf

Autor: MÄX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: MÄX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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";

Autor: MÄX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MÄX (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ja hat denn keiner eine Idee?

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

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.