Programm funktioniert für n = 20, aber für n = 50 nicht!



  • SeppJ schrieb:

    essio schrieb:

    SeppJ schrieb:

    essios Analyse würde ich mich übrigens nur halb anschließen. Offensichtlich ist bin irgendwo nicht richtig definiert, aber die richtige Lösung ist sicher nicht, es einfach global zu definieren.

    Damit war eig. die Deklaration gemeint und nicht die Definition. Die Definition muss man dann separat machen wie in der Funktion, sieht nämlich so aus als würde die main einen bin Wert bekommen der nur in der Funktion Deklariert ist.

    Und wo ist deiner Meinung nach der Unterschied zwischen einer global deklarierten Variablen und einer global definierten Variablen?

    War die Deklaration nicht das erstellen eines Speichers für die Variable und Definition die Wertzuweisung?

    Deklaration:

    int bin;

    Definition:

    bin = 1;

    Wenn ich mich irre bedanke ich mich für die Korrektur. Bin selber schließlich nur ein Anfänger 🙂

    Er hat long und float geschrieben, nicht double. Und deine Schlussfolgerung ist falsch. long ist nicht garantiert größer als int. float ist in aller Regel sogar weniger genau als int. Dass deine Schlussfolgerung falsch ist, kannst du ganz leicht ausprobieren, indem du long long benutzt. Dann funktioniert der Code nämlich. long long ist nämlich garantiert 64 Bit lang, long nur mindestens 32. Was aber auch eine typische Größe für int ist. Das heißt, auf vielen Systemen sind int und long gleich genau.

    Du hast recht, verzeihung mein Fehler.

    Ich habe das Ergäbis, nach der double einsetzung, falsch intepretiert.

    long long kannte ich bisher noch nicht. Danke



  • ok hab meinen Fehler auch entdeckt:

    Deklaration

    Mit der Deklaration bennenen wir eine Variable und machen diese dem Compiler bekannt. D.h. der Compiler weiß nun, ob wir uns im Laufe unseres Programms beim Eintippen des Variablennames vertippt haben. Da jeder Variablenname eines Datentyps eindeutig sein muss, kann der Compiler auch den Fehler abfangen, wenn versucht wird, zwei Variablen mit dem gleichen Typ und gleichen Namen zu deklarieren.
    Definition

    Unter der Definition versteht man, dass einer Variablen ein Speicherbereich zugeteilt wird. Der Speicherbereich hat eine eindeutige Adresse und dient dazu, Werte abspeichern zu können. Mit dem Variablennamen sprechen wir im Prinzip nur einen Speicherbereich an. Eine Deklaration ohne Definition werden wir im Kapitel Zeiger kennenlernen.

    http://www.c-howto.de/tutorial-variablen-deklaration.html



  • Nochmal Danke an euch,

    also ich denke die Zahlen sind einfach zu groß. Ich versuch da anscheinend zu viel rauszukitzeln. Ich lasse das Programm jetzt so wie es ist. Kann leider nicht mehr so viel Zeit in das Programm investieren. Ich lass einfach nur Werte für a bis 30 zu am besten...

    50 über 8 ist zum Beispiel eine 9 stellige Zahl
    50 über 25 ist 15 stellige Zahl.

    @essio

    Rauskommt
    bin ist 50
    bin ist 1225
    bin ist 19600
    bin ist 230300
    bin ist 2118760
    bin ist 15890700
    bin ist 99884400
    bin ist 7738
    c ist 7738
    Process returned 0 (0x0) execution time : 0.177 s
    Press any key to continue.

    Warum wird die Zahl plötzlich kleiner? Liegt es an der Größe von "int"?
    Eigentlich muss der Wert ja nach 15890700 noch größer werden



  • Das ist ein Integer-Überlauf, verwende uintmax_t statt int.



  • essio schrieb:

    War die Deklaration nicht das erstellen eines Speichers für die Variable und Definition die Wertzuweisung?

    Deklaration:

    int bin;

    Definition:

    bin = 1;

    Nein.
    Deine "Deklaration" ist auch eine Definition, angenommen, sie steht in einem Block oder Global.
    Das ist eine Deklaration:

    extern int bin;
    


  • Deine "Deklaration" ist auch eine Definition, angenommen, sie steht in einem Block oder Global.

    Hm. Interessant.



  • Quatsch.



  • wima_carsi38 schrieb:

    Nochmal Danke an euch,

    also ich denke die Zahlen sind einfach zu groß. Ich versuch da anscheinend zu viel rauszukitzeln. Ich lasse das Programm jetzt so wie es ist. Kann leider nicht mehr so viel Zeit in das Programm investieren. Ich lass einfach nur Werte für a bis 30 zu am besten...

    50 über 8 ist zum Beispiel eine 9 stellige Zahl
    50 über 25 ist 15 stellige Zahl.

    @essio

    Rauskommt
    bin ist 50
    bin ist 1225
    bin ist 19600
    bin ist 230300
    bin ist 2118760
    bin ist 15890700
    bin ist 99884400
    bin ist 7738
    c ist 7738
    Process returned 0 (0x0) execution time : 0.177 s
    Press any key to continue.

    Warum wird die Zahl plötzlich kleiner? Liegt es an der Größe von "int"?
    Eigentlich muss der Wert ja nach 15890700 noch größer werden

    Jo das liegt an int, int stellt glaube ich den kleinsten Speicherplatz für eine Zahl zur verfügung.

    Ändere mal einfach das int auf long long.
    Bei mir hats so geklappt 🙂


  • Mod

    essio schrieb:

    Jo das liegt an int, int stellt glaube ich den kleinsten Speicherplatz für eine Zahl zur verfügung.

    Nein, diese Ehre gebührt den verschiedenen char-Datentypen. Oder bool, wenn man das noch Zahl nennen will. Und dazwischen gibt es noch short.



  • Ok, vielleicht ungenau ausgedrückt. Ich bin kein Experte, vorallem nicht in den Begriffen. Was ich meinte:

    // global, vielleicht heisst das ja auch "block", keine Ahnung
    int foo = 42;
    
    int main()
    {
        // block
        int bar = 13;
    }
    

    Das sind jedenfalls zwei Variablendefinitionen.

    Ich habe das so komisch ausgedrückt, da ich mir nicht sicher war, wie sich das z.b. in Klassen (jaja, ich weiß, C-Forum) verhält:

    class foo
    {
        int bar; // ist das eine Definition? Es gibt ja noch kein Objekt der Klasse foo.
    };
    

    Ich freue mich über eine genau Aufklärung. Ein "Quatsch" ist nicht sehr hilfreich.

    Ist es nicht irgendwie bescheuert, dass erwartet wird, dass gute, recherchierte Fragen gestellt werden, man dann aber auch mal eine ein-Wort-Antwort gibt?



  • Hyde++ schrieb:

    Ist es nicht irgendwie bescheuert [...]?

    Nee, das ist Wutz



  • Hab mir jetzt nicht alle Antworten durchgelesen und bitte daher um Verzeihung, sollte Dich schon jemand darauf hingewiesen haben:
    Du Dividierst zwei float und speicherst das in ein Integer. Du subtrahierst ein float von einem integer. In der Regel macht der Compiler das auch mit, aber ich würde trotzdem darauf verzichten. Wenn es garnicht anders geht, caste es:

    float a=5., b=7.;
    int Result = (int)(a/b);
    

    Zum Thema Code Aufräumen. Du kannst auch in einer Zeile mehrere Variablen eines Type definieren:

    float a=5., b=7., *pa=&a;
    int ai = 5, bi = 7; /*Und so weiter*/
    

    Wenn Du natives C programmieren willst, darst Du erst nach der letzten Deklaration einen Wert übergeben.


Anmelden zum Antworten