- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
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 Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Was genau stört dich eigentlich an der Variante mit der lokalen Variable?
    Das ist eine saubere und vor allem auch gut lesbare Lösung. Und weniger effizient wird sie auch nicht sein. Würde mich wundern, wenn die zusätzliche Variable auch im Binärcode als solche auftauchen würde.
    MfG
    Stefan

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    42
    Beiträge
    1.780
    Ähm...
    wieso tut ihr euch das überhaupt an!?

    Pointerarithmetik ist ja schön und gut, aber in 99% aller Fälle geht es auch sehr viel bequemer:

    Code:
    void uart_send(void* data, uint16_t size)
    {
       uint16_t n;
       uint8_t* data8 = (uint8_t*)data;
    
       for(n=0; n<size; n++)
          uart_putc(data8[n]);
    }
    
    oder alternativ:
    
    void uart_send(void* data, uint16_t size)
    {
       uint16_t n;
    
       for(n=0; n<size; n++)
          uart_putc(((uint8_t*)data)[n]);
    }
    Ja, es ist eine Zählvariable dazugekommen, aber dafür ist der Code leichter lesbar und weniger fehleranfällig.
    (Außerdem wird n niemals im Speicher existieren, der Compiler verwendet einfach ein Register dafür)
    So viele Treppen und so wenig Zeit!

  3. #3
    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

  4. #4
    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 09:49 Uhr)

  5. #5
    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.

  6. #6
    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
  •  

fchao-Sinus-Wechselrichter AliExpress