Valgrind
-
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.
-
auch für double gilt das?
Edit:
Wenn ich also
double null;
habe, so steht in null irgendeine zufällige zahl.
und demnach ist
a[0]= !null
entweder 1 oder 0.
-
LinuxC_newbie schrieb:
auch für double gilt das?
Ja. Selbst für komische Sonderwerte wie inf und nan. Und negative 0 ist in dieser Hinsicht natürlich false.
LinuxC_newbie schrieb:
Edit:
Wenn ich also
double null;
habe, so steht in null irgendeine zufällige zahl.
und demnach ist
a[0]= !null
entweder 1 oder 0.
Ja. Und das ist ein Programmierfehler. Wäre es korrekt
double null = 0;, wäre alles wohldefiniert.Oder besser: Man lässt den ganzen Unfug mit dem null weg und schreibt:
a[0] = 1; a[1] = 1;(das ganze a könnte und sollte man sich natürlich auch sparen)