If in for schleife fehlerhaft. Warum nur ?



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
    
      int i;
      int lenr = 258;
      int temp = 0;
      int temp2 = 0;
    
         for (i=0; i<lenr-2; i++){
           printf("%02X ",i);
           temp++;
    
           if (temp == 10)
           {
             printf("0x%02i\n",temp2);
             temp2=temp2+10;
             temp = 0;
           }
       }
      return 0;
    }
    

    Dieses Programm läuft mit der Schleifenkonstruktion

    //unsigned char response [256];
    
       int temp = 0;
       int temp2 = 0;
    
       for (i=0; i<lenr-2; i++){
           printf("%02X ",response[i]);
           temp++;
    
           if (temp == 10)
           {
             printf("0x%02i\n",temp2);
             temp2=temp2+10;
             temp = 0;
           }
       }
    

    Dieser Quelltext steht so im Programm. Das Programm lässt sich kompilieren. Jedoch erfolgt nicht nach jedem 10. Byte ein Carriage return \n wie es beim 1. Beispiel ist.
    Er landet nicht in die If schleife. wenn ich Temp ausgeben lasse erscheint als Wert als erstes eine 1. Danach liegen die werte bei 20000000. Ich kann mir das nicht erklären. Was könnte verkehrt sein ?



  • mach doch einfach so

    ...
       int i;
       const int lenr = 256;
    
       unsigned char response [lenr];
    
       for (i=1; i<=lenr; i++)
       {
           printf("%02X ",response[i-1]);
           if (i%10 == 0)
             printf("0x%02x\n", i-10);
       }   
    ...
    

    dann brauchste die ganzen temps nicht



  • First things first: Es gibt keine if-Schleifen, bei if wird nichts wiederholt, also keine Schleife.

    Ich tippe mal auf irgendeinen überschriebenen Speicher, etc. das Beispiel scheint mir auf den ersten Blick okay zu sein. Poste mal das Komplettpaket 🙂

    BTW: Ist nichts konsolenspezifisches, du wanderst nach ANSI-C 🙂

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ein sehr komisches phänomen wie ich finde,

    ...
       int i;
       const int lenr = 256;
    
       unsigned char response [lenr];
    
       for (i=1; i<=lenr; i++)
       {
           printf("%02X ",response[i-1]);
           if (i%10 == 0)
             printf("0x%02x\n", i-10);
       }  
    ...
    

    bin nach der Lösung von user "net" vorgegangen. Danke nochmals. Es funktionierte erst nicht. Nachdem ich die Variablenzuweisung ganz nach oben gesetzt habe. Lief alles ohne Probleme. Kann mir es eigentlich nicht erklären. Man kann doch in C / C++ Variablen auch während des Programmes initialisieren und muss sie doch nicht zwingend ganz oben deklarieren. Kompilieren ließ es sich jedesmal. Werde wohl nun ab sofort alle Variablen nur noch oben deklarieren. Benutze dev-c++ 4.9.9.2 weiss nicht ob es am Compiler Gcc liegt..... kann mir jemand einen anderen guten compiler empfehlen ?



  • hi,
    in c++ kann man neue variablen mitten im code anlegen. das dient aber mehr der bequemlichkeit. aber immer müssen (auto) variablen vor dem ersten lesezugriff initialisiert werden, sonst haben sie einen unbestimmten inhalt...



  • reicht das nicht in der for bedingung wenn i = 1 zugewiesen wird, da herrscht doch noch kein lesezugriff.

    for (i=1; i<=lenr; i++)
    


  • stochi schrieb:

    reicht das nicht in der for bedingung wenn i = 1 zugewiesen wird, da herrscht doch noch kein lesezugriff.

    for (i=1; i<=lenr; i++)
    

    ja, das ist richtig so. erst die zuweisung 'i=1' und danach alles andere mit i ...
    natürlich muss 'lenr' auch einen sinnvollen wert haben.



  • Mach einfach

    for (int i=1; i<=lenr; i++)
    {
    //bla
    }
    

    Dann wird die Variable auch nicht länger gespeichert als nötig, nur bis zum Blcokende.



  • stochi schrieb:

    Man kann doch in C / C++ Variablen auch während des Programmes initialisieren und muss sie doch nicht zwingend ganz oben deklarieren.

    in ansi-c müssen variablen am anfang eines blockes definiert (nicht deklariert übrigens) werden (außer globale). (Nach C99 ist aber IMHO auch sowas wie for( int i; ...) möglich)



  • nach c99 koennen vars ueberall in einem block definiert werden. aber find erstmal nen c99 compiler (z.b. gcc).


Anmelden zum Antworten