PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfaches Problem mit Stringausgabe [gelöst in 22 Minuten]



oberallgeier
14.07.2008, 09:53
Hallo Alle,

ein vermutlich einfaches Problem mit der Stringausgabe macht mir zu schaffen. Seit Tagen meldet mir der Compiler Warnungen, die ich durch meine Änderungen nicht korrigieren kann. Eine Auswirkung auf den Programmablauf haben sie - offensichtlich - nicht. Ich würde meinen C-Code gerne korrekt schreiben, finde aber keine Abhilfe.

Mein aktuelle Umgebung: WinXPpro Vers. 2002 SP2 und als Compiler:


AVR Studio 4.13.557 Service Pack 1
GUI Version 4, 13, 0, 557
AVR Simulator 1, 0, 2, 0
ATMEGA168 209

Operating System
Major 5
Minor 1
PlatformID 2
Build 2600
Service Pack 2

Plugins:

AvrPluginAvrAsmObject 1, 0, 0, 46
AvrPluginavrgccplugin 1, 0, 0, 9
Stk500Dll 1, 0, 1, 0

Mein aktuelles Problem sind die folgenden Fehlermeldungen


../m168D_inf_10x63.c: In function 'info02_irDME':
../m168D_inf_10x63.c:46: warning: implicit declaration of function 'sendUSART'
../m168D_inf_10x63.c: At top level:
../m168D_inf_10x63.c:184: warning: conflicting types for 'sendUSART'
../m168D_inf_10x63.c:46: warning: previous implicit declaration of 'sendUSART' was here

Kernighan/Ritchie haben ebensowenig geholfen wie (m)eine experimentelle Reparaturorgie. Kann mir bitte jemand erzählen, wo der Fehler liegen könnte?

Der beanstandete Aufruf erfolgt hier - im ersten sendUSART-Aufruf; mecho[0..2] ist in einem common-modul als volatile uint8_t mecho [3] deklariert:

// ================================================== ===============================
void info02_irDME(void)
// Ausgabe von irDME-Nettowerten und anderen Werten (Servo, GPD)
{
char wortadc[12];
sendUSART(" i1-4\t"); // Ausgabezeile eröffnen
utoa(mecho[0], wortadc, 10); //aktuellen Rampensteuerwert ...
sendUSART(wortadc); // ... ausgeben.
sendUSART("\t"); // Tabulator

utoa(mecho[1], wortadc, 10); //aktuellen Rampensteuerwert ...
sendUSART(wortadc); // ... ausgeben.
sendUSART("\t"); // Tabulator

utoa(mecho[2], wortadc, 10); //aktuellen Rampensteuerwert ...
sendUSART(wortadc); // ... ausgeben
sendUSART("\t"); // Tabulator senden

sendUSART("Isvs1\t"); // Bezeichner für Wert
utoa(Isvs1, wortadc, 10); //aktuellen Servosteuerwert ...
sendUSART(wortadc); // ... ausgeben
sendUSART("\t"); // Tabulator senden

sendUSART("most12\t"); // Bezeichner für Wert
utoa(most12, wortadc, 10); //aktuellen Servosteuerwert ...
sendUSART(wortadc); // ... ausgeben
sendUSART("\t"); // Tabulator senden
}
/* ================================================== ============================ */
Die Routine sendUSART (für die ... warning: conflicting types for 'sendUSART' ... gemeldet wird) lautet:

/* ================================================== ============================ */
void sendUSART(char *s) // *s funktiniert wie eine Art Array - auch bei
// einem String werden die Zeichen (char) einzeln ausgelesen - und auf die
// Sendeschnittstelle übertragen
{
while(*s)
{
sendchar(*s);
s++;
}
}
/* ================================================== ============================ */

... und zu meiner Erbauung wird diese Routine (und ähnliche) nicht beanstandet:

// ================================================== ===============================
void info01(void) // Startinfo #####>>>>> steht IMMER im main-Code-modul
{
sendUSART ("\r\r\tPm168D/20 MHz\tm168D_10x61-64/614 13jul08 1848\r\r\n");

}
/* ================================================== ============================ */

Danke schon mal jetzt für eure Hilfe

fhs
14.07.2008, 10:06
Hallo,

ohne Deine Header-Dateien bzw. die Deklaration von sendUSART() wird man den Fehler kaum finden können. Fest steht, dass der Compiler innerhalb von void info02_irDME(void) die Aufrufe von sendUSART() nicht kennt. Bindest Du irgendwo eine Header-Datei mit der Deklaration von sendUSART() ein? Alternativ könntest Du die gesamte Definition von sendUSART() vor allen anderen Code schreiben (wäre aber nicht so schön), damit ist die Funktion dann natürlich definiert und gleichzeitig deklariert.

Ansonsten könntest Du Deinen Code vielleicht so abkürzen, dass der Fehler erhalten bleibt und dann hier alles als kompilierbares Beispiel einfügen (mit den Header-Dateien).

Viele Grüße

Fred

oberallgeier
14.07.2008, 10:15
Danke Fred - alle Achtung, 13 Minuten zwischen Frage und Antwort und ich habe viele Zeit damit verbracht. Deine Antwort war ein hübscher Denkanstoß: ich habe in der Codesammlung "~inf~" mit dem beanstandeten Aufruf die Initialisierung des USART vor die beanstandete Routine gesetzt - und schon läufts. Der Preprozessor ist wohl so faul wie ich - wenn er einmal durchgegangen ist, dann macht er die Arbeit nicht noch mal.


... Bindest Du irgendwo eine Header-Datei mit der Deklaration von sendUSART() ein? ...
Tja, das sind genau die Feinheiten, die ich noch nicht kann. Aber jetzt hab ich eine gewisse Spur gefunden. Auch wenn die gegenwärtige Lösung (noch) "nicht so schön" ist.

DANKE - es läuft !

fhs
14.07.2008, 10:20
Ni,

noch eine Frage: hast Du bei den Compiler-Optionen global "unsigned" für char eingestellt (-funsigned-char) oder "signed"?

Gruß

Fred

PS: Wir haben unsere letzten beiden Beiträge wohl simultan geschrieben (Du 10:15, ich 10:20) ...

oberallgeier
14.07.2008, 10:25
Unter "Custom Compilation Options" (da hab ich noch nie was eingestellt) finde ich "-funsigned-char". Aber es gibt da einen Button [Edit] . . . . .

Daher jetzt noch ne Frage: muss ich das ändern?

Danke für die Hilfe

fhs
14.07.2008, 10:50
Hallo Joe,



Daher jetzt noch ne Frage: muss ich das ändern?

Wichtig ist nur, dass Du es konsistent machst; z. B. immer signed oder unsigned und Du die Konsequenzen bedenkst.
Sonst kann es Dir so ergehen:

volatile signed char ch=127; // char=127; 127>0
ch=(++ch)>=0; // char=0, denn (127+1=0x80; 0x80<0)

Dieser Fehler wird gern gemacht....

Viele Grüße

Fred

oberallgeier
14.07.2008, 12:29
ohhhhh - C ist wirklich - sehr zum Mitdenken gedacht.

Fred, ich danke Dir nochmal für die Unterstützung