-         

Ergebnis 1 bis 10 von 10

Thema: Problem mit itoa()

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270

    Problem mit itoa()

    Anzeige

    Hallo,
    warum wird beim folgenden Code die 100 nicht richtig übertragen?
    Code:
    int main(void)
    {
     DDRB = (1<<DDB0);
     PORTB = (0<<PB0);
     init_servo();
     init_usart();
     sei();
     for(;;)
     {
      char *test;
      char *test2;
      test = "erfolg!!!";
      send_string(test);
      itoa(100,test2,10);  // <<<---
      send_string(test2);
      waitms(1000);
      }
    }
    "erfolg" wird eigentlich richtig übertragen, aber vllt mache ich das mit den pointern ja falsch, ich bin in c noch nicht so versiert.
    Gruß
    Martin

  2. #2
    test2 ist in deiner Definition erstmal nur ein Pointer auf ein Feld von Zeichen auch bekannt als String. Dem musst du noch Speicher reservieren oder du definierst das als char test2[10], dann ist das auch ein String aber der hat schon Speicher für 10 Zeichen bekommen ohne konkreten Inhalt.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991

    Re: Problem mit itoa()

    Hi,

    so sollte das schon eher funktionieren:

    Code:
    int main(void)
    {
     DDRB = (1<<DDB0);
     PORTB = (0<<PB0);
     init_servo();
     init_usart();
     sei();
     for(;;)
     {
      char test[] = "erfolg!!!";
      char test2[3];
      char *p_test = test;
      char *p_test2 = test2;
      send_string(p_test);
      itoa(100,p_test2,10);
      send_string(p_test2);
      waitms(1000);
      }
    }
    MfG Kjion

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    test2 hat keinen vernünftigen Wert, es zeigt irgendwo hin.

    char test2[***];
    oder
    static char test2[***];
    Disclaimer: none. Sue me.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270
    Hallo,
    also so wirklich hab ich das noch nciht verstanden:
    Code:
    for(;;)
     {
    
      char test[] = "erfolg!!!";
      char *p_test = test;   //p_test zeigt auf den inhalt von test
      *p_test = "bongo";         
      send_string(p_test);
      char test2[] = "hallo\n\r";
      char *p_test2 = test2;
      send_string(p_test2);
      waitms(1000); 
      }
    Eigentlich würde ich jetzt "bongohallo" erwarten, ich bekomme jedoch
    "jerfolg!!!hallo".

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Zitat Zitat von Spurius
    Hallo,
    also so wirklich hab ich das noch nciht verstanden:
    Code:
    for(;;)
     {
      // Hiwer wird test[] initialisiert, inefizient, aber ok...
      char test[] = "erfolg!!!";
      // ok
      char *p_test = test;   //p_test zeigt auf den inhalt von test
      // Öhm...hier wird test[0] mit der Adresse von "bongo", als char gecastet, überschrieben. Strings werden kopiert mit strcpy() oder strncpy()
      *p_test = "bongo";         
      send_string(p_test);
      char test2[] = "hallo\n\r";
      char *p_test2 = test2;
      send_string(p_test2);
      waitms(1000); 
      }
    Eigentlich würde ich jetzt "bongohallo" erwarten, ich bekomme jedoch
    "jerfolg!!!hallo".
    Nö , das ist ok
    Disclaimer: none. Sue me.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270
    ??, wie soll ich das verstehen? Ist die nichtgewollte Ausgabe auf den Code zurückzuführen oder ist der Code richtig und die Ausgabe unerklärlich?
    Was muss ich da denn verändern?

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Hab ich doch ober erklärt... im Code.

    *p_test ist das erste Zeichen des Strings.

    *p_test = 'X' ist also gleichbedeutend mit p_test[0] = 'X'

    String ist ja kein C-Typ, sondern nur char. Indem du dir die Adresse eines Strings besorgst und diese kopierst, hast du noch nicht den String kopiert. Hatte ich auch obern geschrieben...
    Disclaimer: none. Sue me.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2004
    Beiträge
    270
    Hi,
    sry, hatte oben gedacht du zitierst mich bloss und mir das nicht mehr näher angeschaut.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Jo, war wohl ungeschickt da zu annotieren.

    Wenn du so was machst wie
    Code:
    blah()
    {
       char str1[] = "...";
    }
    Dann ist das nicht sonderlich effizient. Die Variable wird erst bei der Benutzung initialisiert, also ist das langsam.

    Besser ist dann schon so was wie
    Code:
    blah()
    {
       static char str1[] = "...";
    }
    Hier wird beim Verwenden nur die Anfangsadresse des Strings zugewiesen, die eigentliche Initialisierung erfolt im Startup-Code aus der crt*.o

    Für unveränderliche Strings ist das auch nicht so toll, weil das sowohl Platz im RAM (da lebt der String) und im Flash (von da aus wird er initialisiert) belegt.

    Besser lässt man des String im Flash. Da AVRs aber eine Harvard-Architektur haben, kann man anhand der Adresse des Strings nicht mehr entsceiden, woher er kommt. Das allerdings muss man zur korrekten Behandlung wissen.

    Du bräuchtest dann neben uart_send_string(char*) eine uart_send_string_P (prog_char*)

    Code:
    #include <avr/pgmspace.h>
    
    void uart_send_char (const char);
    
    void uart_send_string_P (const prog_char* pstr)
    {
       while (1)
       {
          char c = (char) pgm_read_byte (pstr);
          if ('\0' == c)
             break;
          pstr++;
          uart_send_char (c);
       }
    }
    
    // Lokatiert den String ins Flash
    const prog_char str2[] = "...";
    //oder
    const char str3[] PROGMEM = "...";
    
    blah()
    {
       uart_send_string_P (str2);
       // Schneller geschrieben ist folgendes, aber schlechter,
       // wenn öfter der gleiche String ausgegeben werden soll
       uart_send_string_P (PSTR ("..."));
    }
    Disclaimer: none. Sue me.

Berechtigungen

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