www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sprintf warnung pic c18


Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mal mit unsigned char probiert?

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

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <p18cxxx.h> 
#include <stdio.h>
#include <stdlib.h>

void main( void )
{
int x=0;
char buffer[17];
sprintf ((rom char*)buffer, "test %d",x);
}

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

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.