mikrocontroller.net

Forum: Compiler & IDEs 3310 Software will nicht char* nehmen


Autor: Halgn H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab das problem das der LCD nicht char* nimmt :S Es kommt kapputene 
sachen an kasten usw. nur nicht buchstaben :s Alles davor geht

Software von

http://www.google.de/imgres?imgurl=http://i32.tiny...

hoffe ihr könnt mir helfen
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>  


#include "pcd8544.h"
#include "main.h"

char *Text[32];

int main()
{
Text[0] = "D";

  LcdInit(); //LCD Start
  LcdContrast(0x7F); //Kontrast
  LcdImage(waitImage); //Bild
  LcdGotoXYFont(1,6); //Zeile
        LcdFStr(FONT_1X,(unsigned char*)PSTR("MPC Startet...")); //Startet
  LcdUpdate();// Auf Display
  _delay_ms(1000);
  LcdClear(); //Bildschirm räumen
  LcdUpdate();// Auf Display

  LcdGotoXYFont(1,1); //Zeile
        LcdFStr(FONT_1X,(unsigned char*)Text); //Startet
  LcdUpdate();// Auf Display
while(1) {}
return 0;
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander Ljubizki schrieb:
> char *Text[32];

damit legst du 32 Zeiger auf ein Char an - willst du das wirklich?

Selbst wenn du das willst, dann muss der Zeiger auch auf etwas Zeigen, 
man muss also extra speicher anforder, was du leider nicht machst. Als 
nächstest schreibst du dann auf einen Zeiger der nicht mal initalierst 
ist irgendetwas rein - ist ja klar das das schief gehen muss.

> Text[0] = "D";

Ich denke du möchtest nur ein "String" anlegen, das macht man 
überlicherweise ohne *

char Text[32];

jetzt muss du nur noch dafür sorgen das auch der String ein ende 
bekommt.

Text[0] = 'D';
Text[1] = 0;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander Ljubizki schrieb:
> Hallo,
>
> ich hab das problem das der LCD nicht char* nimmt :S Es kommt kapputene
> sachen an kasten usw. nur nicht buchstaben :s Alles davor geht

http://www.mikrocontroller.net/articles/FAQ#Wie_fu...

aber noch viel dringender als diese Kurzzusammenfassung über 
Stringverarbeitung in C wäre endlich ein gutes C-Buch.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LcdFStr(FONT_1X,(unsigned char*)PSTR("MPC Startet...")); //Startet
und kurz danach ...
LcdFStr(FONT_1X,(unsigned char*)Text);
wobei „Text“ eine (falsch deklarierte, aber jedenfalls) Variable im SRAM 
ist.  Also wird genau dieselbe Funktion einmal für einen Pointer ins 
Flash und einmal ins SRAM verwendet.  Da ist einer der beiden Aufrufe 
verkehrt.

Fragt sich noch, wozu der Cast nach unsigned char nötig ist.  Mich 
beschleicht das Gefühl, dass hiermit eine sinnvolle Compiler-Warnung 
totgedrückt wird.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:

> Fragt sich noch, wozu der Cast nach unsigned char nötig ist.  Mich
> beschleicht das Gefühl, dass hiermit eine sinnvolle Compiler-Warnung
> totgedrückt wird.

Mann muss kein Wahrsager sein um zu sagen: Die Wette würdest du sehr 
wahrscheinlich gewinnen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch ein Tip für den Threadstartet:

wenn eine Funktion einen Pointer übernimmt, so wie die hier
void foo( int * a )
{
  ...

dann heißt das nicht zwangsläufig, dass der Aufrufer eine 
Pointervariable bereitstellen muss
int main()
{
  int * b;

  foo( b );

ganz im Gegenteil! In den meisten Fällen will die Funktion eine Adresse 
haben, an der sie etwas findet oder auf die sie einen Wert schreiben 
kann
int main()
{
  int b;

  foo( &b );
}

wobei Arrays ein Sonderfall sind. Arrays werden beim Aufruf einer 
Funktion immer so übergeben, dass die Funktion die Startadresse des 
Arrays bekommt
int main()
{
  int b[20];

  foo( b );
}

All das, und noch viel mehr, all die kleinen und großen Feinheiten und 
Fallen, die es in der C Programmierung gibt, finden sich in jedem 
C-Lehrbuch.

Autor: Halgn H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ok ganz am nfang hatte ich char ohne * aber dann kommt diese meldung:

../main.c:37: warning: assignment makes integer from pointer without a 
cast

Text[0] = "D";
Text[1] = "\0";

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander Ljubizki schrieb:
> Ja ok ganz am nfang hatte ich char ohne * aber dann kommt diese meldung:
>
> ../main.c:37: warning: assignment makes integer from pointer without a
> cast
>
> Text[0] = "D";
> Text[1] = "\0";

Ich flehe dich an:
Kauf dir ein C Buch
oder lies zumindest den Link, den ich dir gegeben habe!

"D"   ist etwas anderes als  'D'

Ob das ein doppeltes oder ein einfaches Gänsefüsschen ist, macht einen 
Unterschied!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander Ljubizki schrieb:
> Ja ok ganz am nfang hatte ich char ohne * aber dann kommt diese meldung:
>
> ../main.c:37: warning: assignment makes integer from pointer without a
> cast

Diese Warnung hab ich schon immer für irreführend gehalten. Sie 
suggeriert, daß ein Cast das Problem lösen würde, aber in den 
allermeisten Fällen unterdrückt er nur die Warnung, und ein Problem hat 
man immer noch.

Autor: Halgn H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Alexander Ljubizki schrieb:
>> Ja ok ganz am nfang hatte ich char ohne * aber dann kommt diese meldung:
>>
>> ../main.c:37: warning: assignment makes integer from pointer without a
>> cast
>>
>> Text[0] = "D";
>> Text[1] = "\0";
>
> Ich flehe dich an:
> Kauf dir ein C Buch
> oder lies zumindest den Link, den ich dir gegeben habe!
>
> "D"   ist etwas anderes als  'D'
>
> Ob das ein doppeltes oder ein einfaches Gänsefüsschen ist, macht einen
> Unterschied!

Ich habs gesehen aber ich kann jetzt warten bis das buch da ist(ich such 
grad ein gutes buch :D)

Nun hab ich char verstanden, danke und jetzt sind fast alle fehler weg 
bis auf das:

../main.c:102: warning: pointer targets in passing argument 2 of 
'LcdFStr' differ in signedness
    LcdFStr(FONT_1X,Text); //Starte

Hier der Befehl:
byte LcdFStr ( LcdFontSize size, const byte *dataPtr )
{
    byte c;
    byte response;
    for ( c = pgm_read_byte( dataPtr ); c; ++dataPtr, c = pgm_read_byte( dataPtr ) )
    {
        /* Put char */
        response = LcdChr( size, c );
        if(response == OUT_OF_BORDER)
            return OUT_OF_BORDER;
    }
  /* Fixed by Jakub Lasinski. Version 0.2.6, March 14, 2009 */
    return OK;
}

Das verstehe ich jetzt nicht alles sollte jetzt richtig sein oder nicht?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander Ljubizki schrieb:

> ../main.c:102: warning: pointer targets in passing argument 2 of
> 'LcdFStr' differ in signedness

Es gibt 3 verschiedene Character Datentypen
  * signed char
  * unsigned char
  * char

signed   ... mit Vorzeichen
unsigned ... ohne Vorzeichen
char     ... der Compiler hat die Wahl ob er char als
             signed oder als unsigned auffassen will

Wann benutzt man was?

* signed char
  immer dann, wenn man einen 'kleinen Integer' mit Vorzeichen benötigt

* unsigned char
  immer dann, wenn man einen 'kleinen Integer' ohne Vorzeichen benötigt.
  Im speziellen ist das der Datentyp, den man für Bytebearbeitung
  benutzt

* char
  immer dann, wenn es um Textverarbeitung geht


> Hier der Befehl:

Du meinst Funktion.

> byte LcdFStr ( LcdFontSize size, const byte *dataPtr )

byte wird höchstwahrscheinlich ein typedef auf unsigned char sein.
Und dieser Datentyp (unsigned char) ist hier ein wenig zeifelhaft. Die 
Funktion suggeriert, dass man es hier mit Textverarbeitung (nämlich die 
Ausgabe eines Strings) zu tun hat. Von daher wäre ein stink normaler 
char Pointer angebracht.

> Das verstehe ich jetzt nicht alles sollte jetzt richtig sein oder nicht?

Es ist zumindest debattierbar ob der byte* hier eine glückliche Wahl 
darstellt.

Edit:  vergessen
Ein normales 'D' ist vom Datentyp char (weder signed char noch unsigned 
char, sondern einfach nur char)
Dementsprechend ist ein "Test" vom Datentyp "Array of const char" und 
ein Pointer auf das erste Zeichen hat den Datentyp "const char *"

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.