2016-06-29 16 views
2

Ich versuche einen Mikrochip in C zu programmieren. Gerade jetzt arbeite ich, um eine Zeile auf einem LCD-Bildschirm aber es zu aktualisieren funktioniert nicht richtig. Kann jemand etwas Licht dazu bringen?Compiler Fehler Aufruf von sprintf: "erwartet 'char *' aber Argument ist vom Typ 'char'"

float slope = 0.0626; 
char *mystring; 
int8_t LCDline1[20]; 

void myfunction(){ 
    sprintf(*mystring, "%ld", (long)(slope * 10000)); 
    memcpy(LCDline1, *mystring, strlen(*mystring)+1); 
} 

Wenn ich kompilieren Code bekomme ich die folgenden drei Fehler.

calibrate.c:60:5: warning: passing argument 1 of 'sprintf' makes pointer from integer without a cast. note: expected 'char *' but argument is of type 'char'

calibrate.c:61:5: warning: passing argument 1 of 'strlen' makes pointer from integer without a cast. note: expected 'const char *' but argument is of type 'char'

calibrate.c:61:5: warning: passing argument 2 of 'memcpy' makes pointer from integer without a cast. note: expected 'const void *' but argument is of type 'char'

Ich bin nicht sicher, was ich falsch mache, bin ich die folgenden Definitionen für mein Ausgangspunkt

void *memcpy(void *str1, const void *str2, size_t n)

size_t strlen(const char *str)

char *p = "String";

Antwort

10

mystring verwendet, ist bereits ein Zeiger. *mystring de-verweist es, um das erste Zeichen zu geben. Sie möchten einfach mystring übergeben.

Sie müssen auch Speicher für mystring reservieren, entweder statisch oder dynamisch unter Verwendung von malloc.

float slope = 0.0626; 
char* mystring; 
/* char mystring[50]; */ // or just do this, as Sahu and John suggested 
int8_t LCDline1[20]; 

void myfunction(){ 
    mystring = (char*)malloc(mystring_size); // set this to any size 
    sprintf(mystring, "%ld", (long)(slope * 10000)); 
    memcpy(LCDline1, mystring, strlen(mystring)+1); 
} 

NB, wenn Sie Speicher für die Zeichenfolge Zuweisung, stellen Sie sicher, eine weitere als die Zeichenfolge Länge zuzuweisen, die Null-Trennzeichen zu speichern (strlen und viele andere Funktionen dieses benötigen)

+0

Was ich brauche, ist eine Zeichenfolge, die beliebig groß sein kann, weil der Wert der Steigung überall von 3 bis 8 Ziffern Precesion haben. Ich verwendete http://stackoverflow.com/questions/8732325/how-to-declare-strings-in-c für meine Erklärung. Wie deklariere ich einen Zeiger, mit dem ich den Inhalt ändern kann? – Bob

+0

@Bob, können Sie es einfacher machen mit 'char mystring [50];' –

+0

Das ist der Punkt der dynamischen Zuordnung - Sie können 'malloc' verwenden, um die gewünschte Größe zuzuweisen (innerhalb der Maschinen/OS Grenzen); Vergessen Sie auch nicht, einen zusätzlichen Zeichenbereich zuzuweisen, um das Nulltrennzeichen –

1

Sie verwenden Zeiger falsch. Ein "String" ist als ein Array von Zeichen definiert. Wenn Sie also char *mystring schreiben, deklarieren Sie einen Zeiger auf ein Zeichen-Array (oder einen String).

Nun, wenn Sie mystring mit *mystring in Ihrem Code dereferenzieren, erhalten Sie das erste Element dieses Arrays, das nur ein Zeichen ist. Wie die Warnungen sagen, akzeptieren diese Funktionen char* Parameter, nicht char.

Also, geben Sie einfach in den Zeiger, ohne dereferencing:

void myfunction(){ 
    sprintf(mystring, "%ld", (long)(slope * 10000)); 
    memcpy(LCDline1, mystring, strlen(mystring)+1); 
} 
+0

aufrufen. Ich bin dabei, Zeiger besser zu verstehen, indem ich die Sprintf-Funktion, die du geschrieben hast, nicht den Wert von slope * 1000 in den Zeiger von mystring anstatt dessen Ziel schreiben würde. – Bob

+0

@Bob: Nein, 'sprintf' nimmt an, dass Zeiger die Startadresse eines Puffers ist, und schreibt die resultierende Zeichenfolge in diesen Puffer. –

Verwandte Themen