-         

Ergebnis 1 bis 7 von 7

Thema: Einfaches Problem mit Stringausgabe [gelöst in 22 Minuten]

  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554

    Einfaches Problem mit Stringausgabe [gelöst in 22 Minuten]

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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:

    Code:
    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

    Code:
    ../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:
    Code:
    // =================================================================================
      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:
    Code:
    /* ============================================================================== */
    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:
    Code:
    // =================================================================================
      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
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    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
    Only entropy comes easy. - Anton Checkhov

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    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.

    Zitat Zitat von fhs
    ... 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 !
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    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) ...
    Only entropy comes easy. - Anton Checkhov

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    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
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hallo Joe,

    Zitat Zitat von oberallgeier
    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:
    Code:
    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
    Only entropy comes easy. - Anton Checkhov

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    ohhhhh - C ist wirklich - sehr zum Mitdenken gedacht.

    Fred, ich danke Dir nochmal für die Unterstützung
    Ciao sagt der JoeamBerg

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •