DevC++ und 64-bit-Integer



  • Beim MSVC++ kann man hierfür __int64 aus windows.h verwenden. Wie macht man dies beim DevC++, oder muss man da eine externe Bibliothek einbinden?



  • DevC++ baut doch auf die GCC auf, dann geht das so wie in C, mit long long



  • Hatte mich irgendwie verfummelt. unsigned long long ist o.k.
    Jetzt ist alles bestens:

    // Berechnung der "3n+1"-Folge "Collatz-Folge" 
    #include <cstdio> 
    #include <windows.h>
    
    main() 
    { 
      /**************************** Eingabebereich ****************************/ 
      unsigned long long element_limit       =  static_cast<unsigned long long>( 1.0E6) ; // Maximum H(n) 
      unsigned long long element_print_limit =  static_cast<unsigned long long>(  1000) ; // Ausgabe nur, wenn H(n) > element_print_limit 
      unsigned long long start               =  static_cast<unsigned long long>(1.0E18) ; // Beginn der Berechnung bei start 
      unsigned long long end                 =  static_cast<unsigned long long>(2.0E18) ; // Ende der Berechnung bei end 
      /**************************** Eingabebereich ****************************/ 
    
      unsigned long long zahl = 1 ; 
      unsigned long long i    = 1 ; 
    
      for( unsigned long long j = start; j < end; j++ ) 
      { 
           zahl = j ; 
           i = 1 ; 
    
           while( ( zahl != 1 ) && ( i <= element_limit ) ) 
           { 
                if( zahl % 2 == 0 ) zahl = zahl / 2 ; 
                else zahl = 3 * zahl + 1 ; 
                i++ ; 
           } 
    
           if( zahl == 1 ) 
           { 
                if( i > element_print_limit ) 
                { 
                        printf("Startzahl: %I64d",   j) ; 
                        printf("\tAnzahl:  %I64d\n", i) ; 
                } 
           } 
           else 
           { 
               printf("Startzahl: %I64d", j) ; 
               printf("kein Resultat (Anzahl-Limit erhoehen)") ; 
           } 
    
           if( i > element_limit ) MessageBox( NULL, "Anzahl zu hoch", "Info", MB_OK ) ; 
      } 
    
      return 0 ; 
    }
    

    Kann man das so lassen oder würdet ihr das anders machen?



  • erstmal was der g++ dazu sagt

    > g++ -Wall -W -std=c++98 erhard_test.cc
    erhard_test.cc:5: warning: ISO C++ forbids declaration of `main' with no type
    erhard_test.cc: In function `int main()':
    erhard_test.cc:32: warning: int format, different type arg (arg 2)
    erhard_test.cc:33: warning: int format, different type arg (arg 2)
    erhard_test.cc:38: warning: int format, different type arg (arg 2)
    
    main()
    

    ist C (C < C99)! Kein C++!

    unsigned long long element_print_limit =  static_cast<unsigned long long>(  1000) ;
    

    den Cast kannst du vermeiden

    Dann solltest du kein C I/O benutzen, wenn du C++ unterrichtest!

    Du solltest Deklarationen so lokal wie möglich machen (siehe zahl und i) und auch const nicht vergessen zu benutzen (start, end, element_limit etc.). Du solltest auch keine MessageBox benutzen um Fehler auszugeben! Das ist zu übertrieben, wenn dann benutz std::cerr bzw. schreib auf stderr

    if( zahl % 2 == 0 ) zahl = zahl / 2 ;
    

    hier würde ich ein newline einbauen. Macht das IMHO übersichtlicher, gerade beim Debuggen wird sofort deutlich wo das Ding hängt und du solltest /= gegenüber x = x / y bevorzugen!

    und das return 0; am Ende ist überflüssig!



  • Außerdem plenkst Du! 😃



  • Jo, thx, das printf(...) hatte ich ursprünglich wegen __int64 (MSVC++) eingebaut, weil cout dort seinen Dienst verweigerte. Also die nächste Version:

    // Berechnung der "3n+1"-Folge (Collatz-Folge)
    #include <iostream>
    using namespace std;
    
    int main() 
    { 
      /*********************************************************** Eingabebereich ****************************/ 
      const unsigned long long element_limit       =             1000000 ; // Maximum H(n) 
      const unsigned long long element_print_limit =                1000 ; // Ausgabe nur, wenn H(n) > element_print_limit 
      const unsigned long long start               = 1000000000000000000 ; // Beginn der Berechnung bei start 
      const unsigned long long end                 = 2000000000000000000 ; // Ende der Berechnung bei end 
      /*********************************************************** Eingabebereich ****************************/ 
    
      for( unsigned long long j = start; j < end; j++ ) 
      { 
           unsigned long long zahl = j ; 
           unsigned long long    i = 1 ; 
           while( ( zahl != 1 ) && ( i <= element_limit ) ) 
           { 
                if( zahl % 2 == 0 ) 
                    zahl /= 2 ; 
                else 
                    zahl = 3 * zahl + 1 ; 
                i++ ; 
           } 
    
           if( zahl == 1 ) 
           { 
                if( i > element_print_limit ) 
                { 
                    cout << "Startzahl: " << j;
                    cout << "\tAnzahl: "  << i << endl;
                } 
           } 
           else 
           { 
               cout << "Startzahl: " << j;   
               cout << "kein Resultat (Anzahl-Limit erhoehen)" << endl;
           } 
    
           if( i > element_limit ) cerr << "Anzahl zu hoch" << endl;
      } 
    }
    

    Anmerkung: MSVC++ 6 akzeptiert standardmäßig kein "long long", dort __int64 mit printf(...)


Anmelden zum Antworten