ist ein fehler in diesem programm?
-
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_SUBWas 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 ... #endifAlso 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=3826609808ben1990
-
-
#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.
-
Ich wage zu behaupten dass das Metaprogramm nicht funktioniert, weil das Metaprogramm nicht vollständig instanziiert werden kann. Denn der sqrt-Aufruf kann zur Compilezeit einfach nicht konstant ausgewertet werden.
-
ja! erste geposteten funktion ist ein wenig modifiziert. Es wird nur der Rest aller Zahlen bis \|n (Wurzel n), für n gleich zu testender wert, getestet. Bei einer Vielzahl an Werten kann dadurch so mach eine Sekunde eingespart werden.
Bei der zweiten Variante weiß ich nicht ob es ihm weiterhilft. Aber vlt. hilft es jemand anderem weiter. Die Zeiteinsparung spricht jedenfalls (meiner Meinung nach) für sich! In dem zweiten Beispiel wird nämlich die komplette Berechnung ob es sich um eine Zufallszahl handelt zu Zeiten des Kompilierens ausgeführt
-
Bei mir funktioniert alles. Die einzige Fehlermeldung die ich bekomme ist folgende

main.cpp:42:1: Warnung: Kein Newline am Dateiende
Wie rufst du die Metafunktion auf? Natürlich lässt sich die Metafunktion nur mit einem konstanten ausdruck aufrufen, also nicht mit einer Laufvariablen einer Schleife.
-
lucky_tux schrieb:
Bei mir funktioniert alles. Die einzige Fehlermeldung die ich bekomme ist folgende

main.cpp:42:1: Warnung: Kein Newline am Dateiende
Wie rufst du die Metafunktion auf? Natürlich lässt sich die Metafunktion nur mit einem konstanten ausdruck aufrufen, also nicht mit einer Laufvariablen einer Schleife.
Wenn ich einfach nur deinen Beispiel-Code compilieren will, tritt das Problem auf. Ich hab gcc 3.4.4.
mfg.
-
#include <iostream> template <bool Val, typename True, typename False> struct if_ : public True { }; template <typename True, typename False> struct if_<false, True, False> : public False { }; template <bool Val> struct BoolType { static const bool value = Val; }; template <unsigned int N, int i, bool Val> struct isprime_helper : public if_<(i*i > N) , BoolType<true> , if_<(N % i) , isprime_helper<N, i + 1, Val> , BoolType<false> > > {}; template <unsigned int N> struct isprime { static const bool value = isprime_helper<N, 2, false>::value; }; template<> struct isprime<1> { static const bool value = false; }; int main() { std::cout << isprime<5>::value << std::endl; std::cout << isprime<100>::value << std::endl; }So funktionierts.
Spacelord schrieb:
Hast du toll gemacht......aber glaubst du dass das Ben1990 irgendwie weiter bringt?
Dann passt es doch sehr gut zum Rest des Threads
