2017-04-24 4 views
0

ich eine Anzeige am Programmieren und ich bin in der Lage Zeichen auf dem Display angezeigt werden, indem Sie diese Funktion:Versuch, meine eigene printf Funktion erhalten mit Variablen arbeiten

void printChar(char *tekst, uint16_t xPos, uint16_t yPos) 
{ 
    //calculate the position the first byte should be placed on 
    uint16_t startPos = yPos * width_disp_byte + (xPos/8); 
    int i; 

    //put all 16 bytes on the right place on the display based on the users' input 
    for(i=0;i<16;i++) 
    { 
     test_image[startPos]=convertChar(*tekst,i); 
     startPos += width_disp_byte; 
    } 
} 

Grundsätzlich erhalte ich einen Charakter und finde seinen Standort in einem Array, das ich erstelle. Dann nehme ich 16 Bytes Daten und lege diese in das Display.

Der nächste Schritt besteht darin, ganzzahlige Variablen auf dem Display anzuzeigen. Ich habe einen Code geschrieben, der wie folgt aussieht:

void printVariable(uint16_t integer, uint16_t xPos, uint16_t yPos) 
{ 
    uint16_t value; 
    uint16_t remainder; 
    char printValue; 

    //max value is 9999 that can be displayed, caused by the '4' in the for loop 
    for(int i = 0; i < 4;i++) 
    { 
     value = integer; 
     //int_power calculates the divisor. going from 3 to 0. cq 1000,100,10,1. 
     value /= int_power(10,(3-i)); 

     //remove highest number from integer value (for 312, remove the 3 by substracting 300) 
     integer -= (value) * (int_power(10,(3-i))); 

     // add '0' to value to get the correct ASCII value. 
     value += '0'; 

     // convert uint16_t value into char 
     printValue = value; 
     printChar(printValue,xPos,yPos); 

     xPos += 8; 
    } 
} 

ich eine Variable nehmen, kann sagen, 3164. Der erste Schritt ist, dies zu teilen, indem er 1000. Die Antwort 3 sein wird, da es eine ganze Zahl ist. Ich zeige dieses Zeichen mit der Funktion printChar an.

Der nächste Schritt entfernt 3000 von 3164 und teilt den Wert durch 100, was zu 1 führt. Auch dieser Wert wird mit der printf-Funktion gedruckt. Dann wird 100 von 164 entfernt und dann geteilt durch 10 usw. usw.

Dieser Code ist in seiner Verwendung ziemlich begrenzt, aber es passt perfekt in das, was ich erreichen möchte. Es ist nicht notwendig, Variablen innerhalb einer Zeichenkette zu drucken.

Das Problem hier ist, dass die printChar-Funktion nicht funktioniert, wie ich in den Code geschrieben habe. Normalerweise würde ich die printChar-Funktion wie folgt verwenden:

printChar("F",0,0); 

Dies würde das Zeichen F in der oberen linken Ecke drucken. Wenn ich die printChar Funktion wie diese verwenden möchten, funktioniert es nicht:

printChar(printValue,xPos,yPos); 

Die Warnmeldung sagt:

incompatible integer to pointer conversion passing 'char' to parameter of type 'char *'; take the address with & 

Wenn ich die Adresse mit & nehme ich nicht bekommen, die richtige Wert auf meinem Display angezeigt.

Wie kann ich das beheben?

+0

Es ist eine Zeit vor war ich das letzte Mal gespielt c, aber ich denke, tun Sie einige Zeug, das könnte besser gemacht werden. Ihre Funktion erwartet eine Adresse eines Strings, aber Sie benötigen nur ein einziges Zeichen. Ich weiß nicht, ob man eine Konstante oder die Adresse einer Konstanten (& - Operator) übergeben kann. Ich weiß nicht, für was testImage und convertChar verwendet wird. Und Powder macht es nicht besser. Sie können durch 10 teilen, bis das Ergebnis Null ist. So weit ich mich erinnere. Aber Ihr Problem sollte vorbei sein, wenn Sie "printChar (char tekst", nicht wahr? – am2

+0

Ich bin kein sehr erfahrener C-Programmierer, so gibt es definitiv Dinge, die besser gemacht werden können. "testImage" ist ein Array von 1536 Bytes enthält alle druckbaren Zeichen Jedes ASCII-Zeichen hat 16 Bytes in diesem Array und die Funktion convertChar ist eine Funktion, die die richtigen 16 Bytes für jedes ASCII-Zeichen auswählt Ich habe mein Programm bearbeitet, um den Zeiger im printChar zu entfernen funktionieren und es scheint jetzt richtig zu funktionieren! Danke! –

+0

@ am2 Entfernen des Zeigers in der printChar-Funktion behebt das Problem. Könnten Sie dies als Antwort posten, damit ich diese Frage als beantwortet ernennen kann? –

Antwort

0

Sie wollen nur EINEN Buchstaben drucken, Sie brauchen also keinen Zeiger als Parameter. Ihre Funktion wie diese funktionieren würde:

void printChar(char tekst, uint16_t xPos, uint16_t yPos){ 
... 
    //depending on the Parameters of your convertChar- function either 
    ... = convertChar(tekst,i); // if you can modify this function too 

    ... = convertChar(&tekst,i); // if the function is to use as it is 

} 

Der Unterschied in char ist tekst statt char * Text

Verwandte Themen