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


von Halgn H. (Gast)


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.tinypic.com/32zt7rs.jpg&imgrefurl=http://fandigunawan.wordpress.com/category/microcontroller/&usg=__6Qsv07QS3pp_PsMTZdhoyjjKee4=&h=817&w=1049&sz=69&hl=de&start=4&um=1&itbs=1&tbnid=rVTUbCXZd5AqcM:&tbnh=117&tbnw=150&prev=/images%3Fq%3Davr%2B3310%2Bnokia%26um%3D1%26hl%3Dde%26gbv%3D2%26tbs%3Disch:1

hoffe ihr könnt mir helfen
1
#include <avr/io.h>
2
#include <avr/wdt.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
#include <util/delay.h>
6
#include <stdio.h>
7
#include <string.h>  
8
9
10
#include "pcd8544.h"
11
#include "main.h"
12
13
char *Text[32];
14
15
int main()
16
{
17
Text[0] = "D";
18
19
  LcdInit(); //LCD Start
20
  LcdContrast(0x7F); //Kontrast
21
  LcdImage(waitImage); //Bild
22
  LcdGotoXYFont(1,6); //Zeile
23
        LcdFStr(FONT_1X,(unsigned char*)PSTR("MPC Startet...")); //Startet
24
  LcdUpdate();// Auf Display
25
  _delay_ms(1000);
26
  LcdClear(); //Bildschirm räumen
27
  LcdUpdate();// Auf Display
28
29
  LcdGotoXYFont(1,1); //Zeile
30
        LcdFStr(FONT_1X,(unsigned char*)Text); //Startet
31
  LcdUpdate();// Auf Display
32
while(1) {}
33
return 0;
34
}

von Peter (Gast)


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;

von Karl H. (kbuchegg)


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_funktioniert_String-Verarbeitung_in_C.3F

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

von Hc Z. (mizch)


Lesenswert?

1
LcdFStr(FONT_1X,(unsigned char*)PSTR("MPC Startet...")); //Startet
und kurz danach ...
1
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.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

Und noch ein Tip für den Threadstartet:

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

dann heißt das nicht zwangsläufig, dass der Aufrufer eine 
Pointervariable bereitstellen muss
1
int main()
2
{
3
  int * b;
4
5
  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
1
int main()
2
{
3
  int b;
4
5
  foo( &b );
6
}

wobei Arrays ein Sonderfall sind. Arrays werden beim Aufruf einer 
Funktion immer so übergeben, dass die Funktion die Startadresse des 
Arrays bekommt
1
int main()
2
{
3
  int b[20];
4
5
  foo( b );
6
}

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.

von Halgn H. (Gast)


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

von Karl H. (kbuchegg)


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!

von Rolf Magnus (Gast)


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.

von Halgn H. (Gast)


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
1
    LcdFStr(FONT_1X,Text); //Starte

Hier der Befehl:
1
byte LcdFStr ( LcdFontSize size, const byte *dataPtr )
2
{
3
    byte c;
4
    byte response;
5
    for ( c = pgm_read_byte( dataPtr ); c; ++dataPtr, c = pgm_read_byte( dataPtr ) )
6
    {
7
        /* Put char */
8
        response = LcdChr( size, c );
9
        if(response == OUT_OF_BORDER)
10
            return OUT_OF_BORDER;
11
    }
12
  /* Fixed by Jakub Lasinski. Version 0.2.6, March 14, 2009 */
13
    return OK;
14
}

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

von Karl H. (kbuchegg)


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

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.