Valgrind
-
Was war daran jetzt denn nicht richtig?
Ich bin (wie fast immer) verwirrt.

Edit: Also mein Compiler versteht in diesem Fall unter !null
-
Mal schauen, ob ich das richtig verstanden habe:
Manche Compiler verstehen unter der Negation einer double-Variablen offenbar die Zahl 1.
Hier wäre also a[0] = 1.
Desweiteren kommt ja in der for-Schleife für i=1 dann a[-1] vor und die Frage ist, was das sein soll.
Bei MIR ist es zum Beispiel 2.07338e-317 und da man ja double hat.. würde das wohl auf 0 gerundet.
Somit hätte man hier zufällig die richtigen Zahlen erwischt, sodass sich die gewünschte Ausgabe ergibt.
----Korrekt muss man aber a[0]=0 setzen und die double Variable weglassen oder zum Beispiel double null = 0 setzen und dann a[0]=null.
Entsprechend muss man dann die Schleife anpassen, indem man sie ab 2 starten lässt. dann bekommt man allerdings nur die Fibonacci Zahlen 2, 3 und 5 ausgegeben. Dafür hat man aber ein sauber funktionierendes Programm.
-
Das ganze Programm ist doch absichtlich verwirrend und fehlerhaft geschrieben, das ist doch gerade der Sinn der Aufgabe! Wie würdest du denn naiv die Fibonaccifolge berechnen? Mit welchen Werten fängst du an? Wenn du das weißt, dann kannst du Zeilen 6-10 erklären.
!0 ist true (weil es nicht 0 ist
). true ist 1. Immer. Nicht auf manchen Compilern.Desweiteren kommt ja in der for-Schleife für i=1 dann a[-1] vor und die Frage ist, was das sein soll.
Ich schlage vor: Einer der zu findenden Fehler.
-
SeppJ schrieb:
Wie würdest du denn naiv die Fibonaccifolge berechnen? Mit welchen Werten fängst du an? Wenn du das weißt, dann kannst du Zeilen 6-10 erklären.
Anscheinend geht es ja hier darum, die ersten 5 Fibonacci-Zahlen auszugeben und zwar nach den ersten beiden Gliedern 0 und 1.
Ich würde das so machen:
#include <iostream> using namespace std; int main() { double *a = new double[7]; a[0]=0; a[1]=1; for(int i=2; i<7; i++) { a[i] = a[i-1] + a[i-2]; cout << a[i] << endl; } }
-
Jetzt lass mal die Null am Anfang weg und der Code dürfte dir bekannt vorkommen.
Ich hoffe übrigens mal, dass du das nicht wirklich so machen würdest, sondern dich von dem schlechten Vorbild zu Designfehlern verleiten hast lassen.
-
Es geht mir darum, zu verstehen, wieso der gegebene Code klappen KANN.
Ich sehe nämlich nicht, wieso!...
double null ist irgendeine double-Variable...
Und was ist dann !null?
Ich kapier es nicht.
-
äquivalent wäre
double null; bool b = null; a[0] = !b;
-
Achso!!
double null ist immer der Wert 0?
Ich habe gedacht, dass wäre nur eine Deklination irgendeiner double-Variablen und noch gar nicht initialisiert!
-
void foo(double d) { if (d) cout << "Foo!\n"; } void bar(double d) { if (!d) cout << "Bar!\n"; }Beschreibe mal die Ausgaben von foo und bar für verschiedene, ausgewählte Werte von d.
-
z.B.
foo(0) gibt nichts aus
foo(2) gibt Foo! aus
bar(0) gibt Bar! aus
bar(2) gibt nichts aus
-
Lernst du daraus etwas über
!null?
-
Also anscheinend ist es so, daß mein Compiler einer nicht initialisierten double-Variablen den Wert 0 zuweist, daß dies aber keinesfalls sein muss und stattdessen auch die Speicheradresse zugewiesen werden kann.
Wie auch immer: In beiden Fällen steht in a[0] ein Wert, der nicht erwünscht ist, denn dort soll weder 1 noch irgendeine Negation von einer Speicheradresse stehen (wobei letzteres ja irgendwie auch noch weniger Sinn macht, weil: was soll das Negierte einer Adresse sein?).
-
LinuxC_newbie schrieb:
Also anscheinend ist es so, daß mein Compiler einer nicht initialisierten double-Variablen den Wert 0 zuweist, daß dies aber keinesfalls sein muss und stattdessen auch die Speicheradresse zugewiesen werden kann.
Ehrlich: Ziemlicher Quark. Der Anfang geht noch, aber danach reihst du einfach ein paar Fachwörter aneinander, die du nicht verstehst, von denen du denkst, sie könnten relevant sein.
-
Dann ist es eben Quark!
Ich kann auch nicht mehr als sagen: dass ich es nicht verstehe.
Wenn ich als Antwort Gegenfragen bekomme, die die gleiche Problematik behandeln, dann drehe ich mich notwendigerweisee im Kreis.
-
Wo liegt denn hier das Problem? :p
Eine nicht-initialisierte Variable hat irgendeinen Wert, der eben gerade zufällig an dem Speicherbereich steht, welcher der Variable zugeordnet wurde. Das kann 0 sein, das kann 1 sein, das kann 987654321 sein. Kurz: Der Wert einer nicht-initialisierte Variable ist zufällig.
Dann...!0ergibttrue.!alles_andereergibtfalse.
-
Danke.
Dass !0 true ist, verstehe ich.
Aber wieso ist z.B. !43 0, also false?
nicht 43 kann doch ganz viel heißen... während nicht 0 bedeutet, dass man eben eine Zahl ungleich 0 hat (und damit true), kann doch nicht 43 bedeuten, dass man 0 hat oder 4 oder 6 oder was auch immer...
-
LinuxC_newbie schrieb:
Dann ist es eben Quark!
Ich kann auch nicht mehr als sagen: dass ich es nicht verstehe.
Wenn ich als Antwort Gegenfragen bekomme, die die gleiche Problematik behandeln, dann drehe ich mich notwendigerweisee im Kreis.
Ich weiß aber nicht, wie ich es noch erklären soll. Ich weiß nicht, wie du auf den Quark gekommen bist, ich kann ihn dir daher nicht umerziehen. Bin kein Pädagoge.
Letzter Versuch:
und stattdessen auch die Speicheradresse zugewiesen werden kann.
Wie kommst du hier auf Speicheradressen? Wie sollten die in dem double landen? Was soll das dann sein?
-
Okay, dann eben nicht die Adresse, sondern die Zahl, die dort steht.
-
out schrieb:
!alles_andereergibtfalse.liegt das daran, dass das ! die bits umdreht???
ist das ! ein bitweiser operator?
-
Nein, ! ist das NOT.
Es negiert den Wert ein boolschen Variable.
!true = false und !false = true.
Und Ganzzahlen werden wie folgt nach bool konvertiert:
0 ergibt false, alles andere ergibt true.
Deshalb ist !0 true und !alles_andere false.