ist ein fehler in diesem programm?



  • joomoo schrieb:

    Und zum Thema Kompalität: Tu mal nen VC6 Code in nen standardkonformen Compiler!

    mfg.

    Nein,nein,nein.....es muss heißen:
    Tue mal nen (fortgeschrittenen) standardkonformen Code in den VC++ 6!



  • Durchschauer schrieb:

    joomoo schrieb:

    Nicht vergessen: Ich finde das Buch auch deshalb schlecht, weil da VC6 dabei ist. (Wenn der dabei ist, was ich glaube)

    Wie könnten wir das vergessen?

    Zugegeben,VC++6 ist (als Vorstandard-) Compiler nicht gerade der Kracher aber trotzdem....das ist krankes Geschwafel eines ideologisch zerfressenen Spinners.

    Wieso? Wenn ich schon C++ lernen will, dann lern ich nicht den "Vorstandard". Es gibt viele Bücher die sich schon lange an den Standard halten, deswegen sind die anderen Bücher, okay, das war vielleicht etwas hart, nicht schlecht, sondern veraltet.

    mfg.



  • Irgendwie hat das was von nem Trollpost...

    Ich bleib mal sachlich:

    Michael E. schrieb:

    Firebyte::Username schrieb:

    Ich kenn niemanden der ernsthaft:

    #include<iostream>
    

    schreibt. Du?

    Ja, schon gesehen.

    Quelle? (Betonung liegt auf ernsthaft)

    Wieder so ein Punkt, bei dem ich mich frage, wie du dadurch die Qualität des Buchs festlegen willst, weil längst nicht jeder das return weglässt. Ist auch nicht ganz sinnlos, weil ältere Compiler ein return erzwingen (Stichwort (sinnvolle) Kompatibilität).

    Die Zielgruppe eines solchen Buches benutzt keine älteren Compiler, und wenn man sie benutzt wird man schon auf solche tücken achten...

    Beispiel C#: Hier muss man "== true" anfügen. Ich will einen konsequenten Stil haben Ich schreibs immer.

    👍
    Da pass mal auf:

    #define SUB void
    #define MAIN main() {
    #define END_SUB }
    #define PRINT printf
    
    SUB MAIN
        PRINT("Hallo QBasic Welt");
    END_SUB
    

    Viele Sachen sind wirklich nicht so wichtig und damit kann man das Buch nicht beurteilen, aber wichtig ist:
    - Variablendefinition müssen, ja sollten, nicht an den Anfang!
    - Dieses Buch scheint von einer Langlebigkeit von for-Variablen auszugehen, was einfach FALSCH ist!
    - Aufrgund von der Sache mit den for-Variablen ist bei dem Buch wahrsch. der VC6 dabei und der ist einfach scheiße!

    Und zum Thema Kompalität: Tu mal nen VC6 Code in nen standardkonformen Compiler!

    VC6 ist wirklich schlecht. Wenn bei dem Buch so eine Version bei sein sollte, ist es nicht gerade ein Kaufargument. (Zudem gibt es VS2005 Express kostenlos)
    Viel sinvoller würde ich eine kleine Einführung in das Makefile system finden, da hat man dann eine wesentlich größere Auswahl an Compilern.
    Ich erinner mich noch an meinen Informatik Unterricht beim Abi.
    Der Lehrer hat den Schüler nur den Umgang mit C++ in Verbindung mit dem Borland Builder 2 gezeigt.
    Am Ende waren nur 2 oder 3 Schüler (mich eingeschlossen 😉 ) in der Lage Programme ausserhalb Borlands zu schreiben (und sogar mehrere CPP Dateien zu benutzen...)

    So long



  • joomoo schrieb:

    Michael E. schrieb:

    joomoo schrieb:

    Michael E. schrieb:

    Außerdem wäre es ein schönerer Stil, wenn es 'isPrime' hieße.

    IYHO (in your humble opinion).

    ähh... ja. Also ich find man sollte sich ne bessere schreibweise als allewörteeinfachnurhintereinanderschreiben angewöhnen. entweder alle_wörter_einfach_... oder alleWörteEinfach...

    Interessant, die Qualität eines Buches (unter anderem) durch ein solches Kriterium zu belegen.

    Das ist auch nicht mein einziges Kriterium

    Deshalb auch das "(unter anderem)", ändert auch nix daran, dass das Argument Kappes ist.

    es geht auch darum, dass dieses Buch wahrscheinlich den VC6 mit bringt, welcher ein total veralteter Compiler ist.

    Woher du das hast, ist mir noch nicht klar.

    Woher willst du das wissen??? Vielleicht ist es ja auch total schlecht, den Buffer mit einem riesigen Text vollaufen zu lassen, um ihn dann am Ende einmal zu flushen.

    Natürlich 🙄

    Super Argumentation.

    Du willst noch ne Argumentation? Beim Flushen werden ne Menge OS-spezifische Funktionen aufgerufen. Wie sieht denn ein System aus, bei dem das mehrmalige Flashen einer kleinen Zeichenkette schneller geht als das einmalige Flashen einer großen Zeichenkette?

    Sinnvolle Kompalität? Sinnvole ausselektierung von altem Müll!

    return hat immer noch seine Darseinsberechtigung in der main-Funktion (mehrere Exit Points, andere Rückgabewerte). Wieso also nicht immer schreiben? Wieso als alten Müll bezeichnen?

    - Dieses Buch scheint von einer Langlebigkeit von for-Variablen auszugehen, was einfach FALSCH ist!

    Wo?

    - Aufrgund von der Sache mit den for-Variablen ist bei dem Buch wahrsch. der VC6 dabei und der ist einfach scheiße!

    Weil ich nicht sehe, wo hier der for-Bug von VC 6 benutzt wird, entzieht sich mir auch die Grundlage für die Vermutung, dass jener beim Buch ist.

    Und zum Thema Kompalität: Tu mal nen VC6 Code in nen standardkonformen Compiler!

    Völlig anderes Thema!

    LordJaxom schrieb:

    Mit welcher Version von C# programmierst Du bitte?

    Nicht C#? Sorry, dann wars ne andere Sprache.

    joomoo: Du scheinst zu übersehen, dass Programmieren aus mehr als nur der puren Syntax besteht. Wenn in dem Buch die Grundlagen der Programmierung gut dargestellt werden, dafür aber nicht ganz standardkonformer Beispiel-Code beiliegt, ist mir das tausendmal lieber als andersrum.



  • Firebyte::Username schrieb:

    Ich bleib mal sachlich:

    Danke.

    Michael E. schrieb:

    Firebyte::Username schrieb:

    Ich kenn niemanden der ernsthaft:

    #include<iostream>
    

    schreibt. Du?

    Ja, schon gesehen.

    Quelle? (Betonung liegt auf ernsthaft)

    Weiß nicht mehr wo. Es war in nem Quelltext von irgendeinem Open-Source-Programm/Library.

    Wieder so ein Punkt, bei dem ich mich frage, wie du dadurch die Qualität des Buchs festlegen willst, weil längst nicht jeder das return weglässt. Ist auch nicht ganz sinnlos, weil ältere Compiler ein return erzwingen (Stichwort (sinnvolle) Kompatibilität).

    Die Zielgruppe eines solchen Buches benutzt keine älteren Compiler, und wenn man sie benutzt wird man schon auf solche tücken achten...

    Ich reu mich jedes Mal, wenn ich in nem Quelltext was ändern darf, was mein Compiler nicht schluckt. Wieso mit (einem kleinen Teil der heute verwendeten) Compilern inkompatibel werden, wenn es keinen Vorteil bringt?

    Beispiel C#: Hier muss man "== true" anfügen. Ich will einen konsequenten Stil haben Ich schreibs immer.

    👍
    Da pass mal auf:

    #define SUB void
    #define MAIN main() {
    #define END_SUB }
    #define PRINT printf
    
    SUB MAIN
        PRINT("Hallo QBasic Welt");
    END_SUB
    

    Was willst du mir damit sagen?



  • Michael E. schrieb:

    Firebyte::Username schrieb:

    Ich bleib mal sachlich:

    Danke.

    NP

    Michael E. schrieb:

    Michael E. schrieb:

    Firebyte::Username schrieb:

    Ich kenn niemanden der ernsthaft:

    #include<iostream>
    

    schreibt. Du?

    Ja, schon gesehen.

    Quelle? (Betonung liegt auf ernsthaft)

    Weiß nicht mehr wo. Es war in nem Quelltext von irgendeinem Open-Source-Programm/Library.

    Wahnsinns Quelle. Wenn ich eben bei sf.net ein projekt mit total verkorkstem Source reinstelle benutzt du das dann auch als Quelle?

    Michael E. schrieb:

    Wieder so ein Punkt, bei dem ich mich frage, wie du dadurch die Qualität des Buchs festlegen willst, weil längst nicht jeder das return weglässt. Ist auch nicht ganz sinnlos, weil ältere Compiler ein return erzwingen (Stichwort (sinnvolle) Kompatibilität).

    Die Zielgruppe eines solchen Buches benutzt keine älteren Compiler, und wenn man sie benutzt wird man schon auf solche tücken achten...

    Ich reu mich jedes Mal, wenn ich in nem Quelltext was ändern darf, was mein Compiler nicht schluckt. Wieso mit (einem kleinen Teil der heute verwendeten) Compilern inkompatibel werden, wenn es keinen Vorteil bringt?

    Grund: Ich programmiere C++. Ich programmiere nicht für Compiler, sondern nach dem Standard.

    Michael E. schrieb:

    Beispiel C#: Hier muss man "== true" anfügen. Ich will einen konsequenten Stil haben Ich schreibs immer.

    👍
    Da pass mal auf:

    #define SUB void
    #define MAIN main() {
    #define END_SUB }
    #define PRINT printf
    
    SUB MAIN
        PRINT("Hallo QBasic Welt");
    END_SUB
    

    Was willst du mir damit sagen?

    Du beziehst irgendwelche anderen Programmiersprachen ein um deinen C++ Syntax zu rechtfertigen. Mein Code war eine "Satire"...



  • @Michael E.

    Kannst du mal das Primzahlprogramm posten, wie es nach deiner Syntax aussähe?



  • @Michael E.

    Also. Folgender Code:

    for(int i = 0; i < 123; ++i) {
    }
    int asd = i;
    

    Ist FALSCH, denn i geht verloren nach der for-Schleife. Der VC6 lässt es aber durchgehen. Und nicht nur das, er lässt folgendes nicht durchgehen:

    for(int i = 0; i < 123; ++i) {
    }
    for(int i = 0; i < 123; ++i) {
    }
    

    Was allerdings total legal ist.

    Außerdem besitzt er eine Template-Unterstütztung die du in die Tonne treten kannst. Deswegen ist er veraltet. PUNKT!

    return hat immer noch seine Darseinsberechtigung in der main-Funktion (mehrere Exit Points, andere Rückgabewerte). Wieso also nicht immer schreiben? Wieso als alten Müll bezeichnen?

    mehre Exit Points gab es in diesem Beispiel nicht!
    Mit Müll mein ich den Compiler, der ein return 0 erwartet.

    Sollte der VC6 nicht im Buch sein, kann das Buch ja vielleicht doch nicht veraltet sein, aber ich vermute es stark. Hier bräuchten wir Infos vom Threadersteller.

    mfg.



  • Firebyte::Username schrieb:

    Wahnsinns Quelle. Wenn ich eben bei sf.net ein projekt mit total verkorkstem Source reinstelle benutzt du das dann auch als Quelle?

    Nein, da ich weiß, dass es kein völlig unbedeutendes Projekt war.

    Grund: Ich programmiere C++. Ich programmiere nicht für Compiler, sondern nach dem Standard.

    Das halte ich für den falschen Weg. Schon mal an nem Projekt gearbeitet, bei dem du nicht der einzige potentielle Benutzer des Quelltextes warst? Darf ich fragen, welchen Compiler du hast, dass du so nach dem Standard programmieren kannst? Ich bin sowohl mit dem gcc 3.4.4 als auch mit dem VC++ 2003 an die Grenzen der Standardkompatibilität gestoßen.

    Du beziehst irgendwelche anderen Programmiersprachen ein um deinen C++ Syntax zu rechtfertigen. Mein Code war eine "Satire"...

    Ich hab C# genommen, weil ich dort mit demselben Stil programmieren kann wie in C++. Aber ich kann auch gern bei C++ bleiben: Ich schreib immer einen zweiten boolschen Vergleichswert, weil es in den meisten Fällen notwendig ist.



  • joomoo: Danke, ich weiß, was VC bezüglich for-Schleifen durchgehen lässt und was nicht, ich hab schließlich lange mit ihm gearbeitet. Du solltest mir allerdings eher die Stelle im Programm zeigen, wo der Bug ausgenutzt wird.

    joomoo schrieb:

    Außerdem besitzt er eine Template-Unterstütztung die du in die Tonne treten kannst. Deswegen ist er veraltet. PUNKT!

    Meine Meinung, hab nie was anderes behauptet. Deshalb frage ich mich, warum du so auf der Veraltung rumhackst.

    return hat immer noch seine Darseinsberechtigung in der main-Funktion (mehrere Exit Points, andere Rückgabewerte). Wieso also nicht immer schreiben? Wieso als alten Müll bezeichnen?

    mehre Exit Points gab es in diesem Beispiel nicht!

    Hab ich auch nicht geschrieben. Ich frage lediglich, warum man nicht konsequent sein sollte.



  • Natürlich kann man nicht immer stur nach dem Standard programmieren. Man muss dann halt für die einzelnen Compiler workarounds bauen alá:

    #ifdef __MSVC7
    ...
    #endif
    


  • Firebyte::Username schrieb:

    @Michael E.

    Kannst du mal das Primzahlprogramm posten, wie es nach deiner Syntax aussähe?

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	for(int i = 2; i < 100; ++i)
    	{
    		bool isPrime = true;
    
    		for(int j = 2; j <= i/2; ++j)
    		{
    			if(i % j == 0)
                    isPrime = false;
    		}
    
    		if(isPrime == true)
                cout << i << " ist eine Primzahl.\n";
    	}
    
    	return 0;
    }
    

    Wieso willst du das wissen?



  • Firebyte::Username schrieb:

    Natürlich kann man nicht immer stur nach dem Standard programmieren. Man muss dann halt für die einzelnen Compiler workarounds bauen alá:

    #ifdef __MSVC7
    ...
    #endif
    

    Also programmierst du für Compiler...



  • Michael E. schrieb:

    Firebyte::Username schrieb:

    @Michael E.

    Kannst du mal das Primzahlprogramm posten, wie es nach deiner Syntax aussähe?

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	for(int i = 2; i < 100; ++i)
    	{
    		bool isPrime = true;
    		
    		for(int j = 2; j <= i/2; ++j)
    		{
    			if(i % j == 0)
                    isPrime = false;
    		}
    		
    		if(isPrime == true)
                cout << i << " ist eine Primzahl.\n";
    	}
    	
    	return 0;
    }
    

    Wieso willst du das wissen?

    Da hätte ich auch nichts gegen, aber in dem Buch sind die Variablen am Anfang, außerde sind dort keine Leerzeichen zwischen Operatoren, und du hast ja jetzt selber ne Klammer bei dem Zweiten for benutzt! So säh das im Buchstyle aus:

    #include <iostream>
    using namespace std;
    
    int main()
    {
            int i, j;
            bool isPrime;
    	for(i=2;i<100;++i)
    	{
    		bool isPrime = true;
    		for(j=2; j<=i/2;++j)
    		if(i % j == 0) isPrime = false;
    
    		if(isPrime == true)
                    cout<<i<<" ist eine Primzahl.\n";
    	}	
    	return 0;
    }
    


  • Und?



  • ich bedanke mich für die zahlreichen antworten.
    aber noch ne frage:
    was ist VC6.0?

    und übrigens ich habe schon öfters fehler in diesem buch gefunden!!
    obwohl es auf der seite nicht als fehlerhalt und zugleich als schlecht eingestuft wird
    hier der link:
    http://www.c-plusplus.net/cms/modules.php?op=modload&name=mbBooks&file=index&func=isbn&isbn=3826609808

    ben1990





  • #include <iostream>
    using namespace std;
    
    bool isprime(int n)
    {
      int sqrt_n=static_cast<int>(sqrt(double(n)));
      for (int i=2; i<=sqrt_n; ++i)
        if (!(n%i)) return false;
      return true;
    }
    
    int main()
    {
      static const int bis=10;
    
      for (int i=2; i<bis; ++i)
        if (isprime(i))
          cout << i << endl;
    }
    

    ... oder das ganze als Metaprogramm ...

    #include <iostream>
    
    template <int n, int a, int b, bool eq=a==b>
    struct isprime_helper;
    
    /**
     *  @brief Ermittelt ob Zahl eine Primzahl ist (Brute-Force-Methode)
     *  @param n Der zu testende Wert
    */
    template <int n>
    struct isprime
    {
      /**
       *  Zahle bis max=sqrt(n) testen. Für sqrt(n)<2 gilt max=2
       */
      static const int sqrt_n = static_cast<int>(sqrt(n));
      static const int max = sqrt_n<2 ? 2 : sqrt_n;
    
      static const bool value=isprime_helper<n, 2, 2>::value;
    };
    
    struct isprime<1>
    { static const bool value=false; };
    
    template <int n, int a, int b>
    struct isprime_helper<n, a, b, false>
    { static const bool value=(n%a==0) ? false : isprime_helper<n, a+1, b>::value;};
    
    template <int n, int a, int b>
    struct isprime_helper<n, a, b, true>
    { static const bool value=(n%a==0) ? false : true; };
    
    int main()
    {
      std::cout << isprime<5>::value << std::endl;
      std::cout << isprime<100>::value << std::endl;
    }
    


  • lucky_tux schrieb:

    #include <iostream>
    using namespace std;
    
    bool isprime(int n)
    {
      int sqrt_n=static_cast<int>(sqrt(double(n)));
      for (int i=2; i<=sqrt_n; ++i)
        if (!(n%i)) return false;
      return true;
    }
    
    int main()
    {
      static const int bis=10;
    
      for (int i=2; i<bis; ++i)
        if (isprime(i))
          cout << i << endl;
    }
    

    ... oder das ganze als Metaprogramm ...

    #include <iostream>
    
    template <int n, int a, int b, bool eq=a==b>
    struct isprime_helper;
    
    /**
     *  @brief Ermittelt ob Zahl eine Primzahl ist (Brute-Force-Methode)
     *  @param n Der zu testende Wert
    */
    template <int n>
    struct isprime
    {
      /**
       *  Zahle bis max=sqrt(n) testen. Für sqrt(n)<2 gilt max=2
       */
      static const int sqrt_n = static_cast<int>(sqrt(n));
      static const int max = sqrt_n<2 ? 2 : sqrt_n;
    
      static const bool value=isprime_helper<n, 2, 2>::value;
    };
    
    struct isprime<1>
    { static const bool value=false; };
    
    template <int n, int a, int b>
    struct isprime_helper<n, a, b, false>
    { static const bool value=(n%a==0) ? false : isprime_helper<n, a+1, b>::value;};
    
    template <int n, int a, int b>
    struct isprime_helper<n, a, b, true>
    { static const bool value=(n%a==0) ? false : true; };
    
    int main()
    {
      std::cout << isprime<5>::value << std::endl;
      std::cout << isprime<100>::value << std::endl;
    }
    

    Hast du toll gemacht......aber glaubst du dass das Ben1990 irgendwie weiter bringt?



  • @lucky_tux

    Ich bekomme beim Meta-Programm folgende Meldung:
    main9.cpp:17: error: a function call cannot appear in a constant-expression
    bei der Zeile mit sqrt(). Muss ich was an meinem Compiler einstellen oder woran leigt das?

    mfg.


Anmelden zum Antworten