Forum: Mikrocontroller und Digitale Elektronik sprintf warnung pic c18


von Stefan D. (Gast)


Lesenswert?

Hallo,

ich programmiere den PIC18F4550 und verwende den C18 Compiler von 
Microchip (MPLAB). Allerdings erhalte ich immer folgende Warnung:

"Warning [2066] type qualifier mismatch in assignment"


void main()
{
char  buffer [17];
....
....
....
sprintf (buffer, "Test");
....
....
....
}


Kann mir jemand erklären wie ich die Warnung weg bekomme oder eine
Quelle nennen, die mir weiter hilft?


Schon mal vielen Dank
Stefan

von Klaus W. (mfgkw)


Lesenswert?

Ich kenne jetzt deinen PIC und deinen Compiler nicht.
Aber aus C-Sicht spricht nichts gegen diese Zeilen; es sei denn du
hast das #include <stdio.h> vergessen.

Wenn du dann z.B. vorher irgendwo ein sprintf() mit anderer
Parameterliste hast, dann nimmt der Compiler eine dafür passende
Deklaration von sprintf() an (ohne die ...-Deklaration aus
stdio.h zu kennen) und bei deinem obigen Aufruf knirscht es dann
etwas.

von Stefan D. (Gast)


Lesenswert?

Danke für die schnelle Antwort.

#include <stdio.h> ist eingebunden. Dort liegt das Problem nicht.

Ich verwende die Formatierung in sprintf um eine Zeichenkette im Display 
auszugeben, was auch einwandfrei funktioniert. Ich erhalte eben nur 
diese Warnung beim Compilieren.
Ich erhalte die Warnung auch, wenn ich nicht in das LCD Display 
schreibe. Dort ist also der Fehler nicht versteckt.

Meine Sorge ist, dass irgendwann der fall eintritt und die Warnung zum 
Problem wird.

von ... .. (docean) Benutzerseite


Lesenswert?

mal mit unsigned char probiert?

von Karl H. (kbuchegg)


Lesenswert?

Stefan D. schrieb:

> #include <stdio.h> ist eingebunden. Dort liegt das Problem nicht.
...
> auszugeben, was auch einwandfrei funktioniert. Ich erhalte eben nur
> diese Warnung beim Compilieren.

Zeig bitte den richtigen Code
Aus dem bischen ist nicht wirklich etwas zu entnehmen.

Ausser natürlich, dass der sprintf hier mit Kanonen auf Spatzen 
geschossen ist, ein
    strcpy( buffer, "Test" );
hätte es auch getan.
Aber das ist jetzt nicht das Thema.

von Stefan B. (stefan) Benutzerseite


Lesenswert?


von Stefan D. (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Zeig bitte den richtigen Code
> Aus dem bischen ist nicht wirklich etwas zu entnehmen.

Der ganze Code wuerde meiner Meinung nach vom Problem ablenken. Deshalb 
habe ich hier mal ein bisschen Code geschrieben in dem der Compiler die 
Warnung auswirft.
1
#include <p18cxxx.h> 
2
#include <stdio.h>
3
#include <stdlib.h>
4
5
void main( void )
6
{
7
int x=0;
8
char buffer[17];
9
sprintf ((rom char*)buffer, "test %d",x);
10
}

Karl heinz Buchegger schrieb:
> Ausser natürlich, dass der sprintf hier mit Kanonen auf Spatzen
> geschossen ist, ein

"sprintf" verwende ich, da ich auch den Inhalt von Variablen ausgeben 
möchte.



@Stefan B.
Ich glaube das ist der richtige Ansatz und beruhigt mich ein bisschen. 
Zumindest glaube ich jetzt die Ursache zu kennen. Auch wenn ich noch 
keine Lösung habe, bringt mich das doch weiter. Zudem gefällt mir der "C 
COMPILER USER’S GUIDE."
Sobald das Problem gelöst ist werde ich es hier posten. Dieses kann aber 
ein bisschen Dauern.
Natürlich freue ich mich auch weiterhin über hilfreiche Tips.

Vielen Dank

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> char buffer[17];
> sprintf((rom char*)buffer, "test %d",x);

Der Cast sitzt am falschen Platz. buffer ist nicht im rom (program 
memory) sondern der Formatstring ("test %d") ist dort. Wäre buffer ein 
Zeiger ins ROM, könnte sprintf schwerlich dorthin schreiben :)

Warnungslos sollte sein:
sprintf(buffer, (rom char*) "test %d", x);

Bzw. kann es erforderlich sein ein far hinzuzufügen, wenn du im Programm 
mit near Pointern als Default arbeitest.

von Stefan D. (Gast)


Lesenswert?

Stefan B. schrieb:
> Warnungslos sollte sein:
> sprintf(buffer, (rom char*) "test %d", x);

Das ist die Lösung.
Mit "sprintf(buffer, (far rom char*) "test %d", x); kann ich fehler- und 
warnungslos kompilieren.

Vielen Dank!!!

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.