- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 24

Thema: explizite Typumwandlung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo Stefan,
    meine gefundene, oben gezeigt Lösung ist ja auch "saubere Sache" und auch "sehr gut lesbar" da stimmen wir völlig überein.
    So benutze ich es zur Zeit auch.
    Aber wenn ich mich schon in eine neue Programmiersprache reinarbeite, möchte ich auch möglichst viele Details kennen lernen.
    Deshalb kommen halt solche Fragen auf. Ich möchte immer aufs Bit genau wissen was passiert, das liegt in der jahrelangen
    Programmierung in Assembler, da stört mich jede zusätzliche Variable oder Zeile.
    Optimiert ein Compiler heutzutage auch lokale Variablen weg ?. Möglich wäre es ja. Aber das wäre sicher ein anderes Thema....

    Aber mal generell. Kann man denn überhaupt ein Variable "vorher" casten, die mit einem Postincrement/Postdecrement verarbeitet wird.
    Denn wenn ich mir die Kommenatre hier so ansehe, führt der Compiler "zuerst das "increment" durch und dann castet er.
    Wie kann ich ihm denn beibringen, dass er "erst casten" soll und dann das Postincrement. Geht das überhaupt ?
    Das ist rein zum Verständnis, ich möchte da sicher keine Wissenschaft draus machen.
    Mir ist anscheinend (ganz sicher sogar) noch nicht klar, wie der Compiler den Code interpretiert.
    Den Kommentaren nach von rechts nach links. Das kann aber so auch nicht sein,
    dann würde x=*p++; falsch laufen. Wenn er erst incrementieren würde und dann den Wert zuweist.
    Also muss er sich doch erst den Wert holen um ihn x zuzuweisen und dann darf er den pointer incrementieren.
    Wie soll man das also casten, daß sichergestellt ist, daß der pointer nur um eins incrementiert wird.

    Auch wenns nervt Ich Danke Dir
    Siro

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo Felix G,
    Oho, das funktioniert schon mal. Hab ich gleich mal ausgetestet.
    Und ja, Du hast recht, für "n" wird ein Register verwendet, zumindest bei meinem Compilat.
    Das man einen Pointer wie ein Array benutzen kann, war mir noch nicht klar.
    Hat sich also mein Beitrag gelohnt. Ich bedanke mich.

    Der Vollständigkeit halber nochmal 4 Lösungen:

    Code:
    void uart_send(void* data, unsigned int size)
    { char *p = data;
    
      while (size--)
      {  
        uart_putc(*p++);
      }  
    } 
    
    void uart_send(void* data, unsigned int size)
    { int i;
      
      for (i=0; i< size; i++)
      {  
        uart_putc(((char*)data)[i]);
      }  
    } 
    
    void uart_send(void* data, unsigned int size)
    { 
      while (size--)
      {  
        uart_putc(*(char*)data);
        data = (char*)data+1;
      }  
    } 
    
    void uart_send(void* data, unsigned int size)
    { 
      while (size--)
      {  
        uart_putc(*(char*)data);
        ++(*((char**)(&data)));
      }  
    }
    Siro
    Geändert von Siro (07.10.2011 um 08:49 Uhr)

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich hab das jetzt mit dem VC (microsoft visual studio 2005) durchprobiert. Das sollte eigentlich schon auf GCC übertragbar sein.

    Vorweg:
    Code:
    int*  p = (char*)1000;           // geht garnicht, verständlich, ist ja auch ein widerspruch
    Klammervarianten:
    Code:
    int*    p  = (int*)1000;
    Code:
    
             (char*)p++;              // kennen wir schon, liefert p+4
             (int)p++;                   // ebenfalls
           p = (int*)(int)p++;      // ebenfalls
    
          ((char*)p)++;          // Mag er garnicht ==>    error C2105: '++' needs l-value
                                      
    



    Was geht ? (definitiv getestet)
    Code:
    int    tmp = (int)p;
       p = (int*)++temp;              
    
    Code:
    union { int* p;  int iP; } un;
          un.p = (int*)1000;
          un.iP++ ;     // (durch die union wird auch   int*p  mit-incrementiert


    und die grausliche Variante
    Code:
         p = (int*)((int)p + 1);



    Wie gesagt: getestet




    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Sooo grauslich finde ich es gar nicht: Das hier (klick) hatte ich schon die ganze Zeit im Hinterkopf

    viele Grüße
    Andreas
    #define true ('/'/'/')
    #define false ('-'-'-')

Berechtigungen

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

Labornetzteil AliExpress