Rätselhafte Zufallszuweisung



  • Hallo Leute,

    wollte ein kleines Memory mit C++ /.net-WinForms proggen, doch ich komme schon bei einem Mischproblem nicht weiter (und der Rest vom Programm steht und funktioniert, nur diese Funktion bereitet mir unbekannte Probleme). Ich verstehe nicht warum die Zuweisung nicht richtig funktioniert und wie ein int Karten[16] = {0}; solche Zahlen enthalten kann. Vielleicht könnt ihr mir ja sagen ob ein Logikfehler meinerseits dahinter steckt? Vielleicht kann man das ganze auch noch vereinfachen, dazu fehlt mir aber derzeit noch die Erfahrung, Verbesserungen sind auch willkommen.

    Folgendermaßen:

    srand(time(NULL));
    
    			 for (int i = 0; i<16; i++)
    			 {
    				 while (Karten[i] == 0)
    				 {
    					Zufallszahl = rand() % (16) + 1;
    
    					if (Zufallszahl != Karten[0] && Zufallszahl != Karten[1] && Zufallszahl != Karten[2] && 
    						Zufallszahl != Karten[3] && Zufallszahl != Karten[4] && Zufallszahl != Karten[5] && 
    						Zufallszahl != Karten[6] && Zufallszahl != Karten[7] && Zufallszahl != Karten[8] && 
    						Zufallszahl != Karten[9] && Zufallszahl != Karten[10] && Zufallszahl != Karten[11] && 
    						Zufallszahl != Karten[12] && Zufallszahl != Karten[13] && Zufallszahl != Karten[14] &&
    						Zufallszahl != Karten[15])
    						Karten[i] = Zufallszahl;
    				 }
    			 }
    

    Und hier die Bilder (im Debug-Modus) dazu:
    http://img7.imageshack.us/gal.php?g=cpp1.png



  • die bedingung:
    Karten[i]== 0
    wird nicht erfüllt, er geht in die schleife nicht rein.

    prüfe deine initialisierung des arrays.



  • Initialisierung des Arrays :

    int Karten[16] = {0};
    


  • lass dir die werte von
    Karten[i] vorsichtshalber mal VOR der whileschleife ausgeben.



  • Wieder eine Schulaufgabe HAF oder ILS?



  • Hi,
    Bin mit meinen Kenntnissen leider noch nicht so weit. Aber könnte es sein das du das Array evtl

    for(i=0;i<16;i++)
        karten[i] = 0;
    

    initalisieren solltest oder wenn dann

    karten[16] = {0,0,0,0,0,0,0,0,0,0,....}
    

    Wenn ich Mist erzähle korrigiert mich bitte. Bin selber Neuling^^
    vlg



  • Was mir noch einfällt, überprüfe doch mal nach deiner Initalisierung das Feld, und dann kurz vor der schleife. Wenns nach der initalisierung korrekt war und kurz vorher nichtmehr, dann könnte es sein das du vielleicht ausversehen im restlichen Code die Daten änderst.

    Und Da bin ich mir jetzt nicht sicher habe aber eben mal nen kleinen Test gemacht.
    Wenn ich mein

    array[16] = {1};
    

    so initalisiere dann habe ich
    array[0] == 1

    und die felder größer 0 "array[>0]" Hatten den Wert zufällig "0"

    also würde ich sagen dass es an deiner Initalisierung liegt.
    Laut deinem Code geht Karten[0] noch sicher in die schleife und der rest ist vom Zufall abhängig.

    Aber laut deinen Bildern ist ja Karten[0] auch völlig daneben. ich vermute das du unwissentlich über ne funktion öder ähnliches die Kartendaten danach nochmal änderst

    Aber wie gesagt bin Selber neuling und bei HAF erst bei CPSB 5 :-p

    vlg



  • Also erstmal, nein ist keine Hausaufgabe oder anderweitiges. War eher eine kleines Programm das ich meinem Cousin schreiben wollte, hatte Code usw. auch schon im Kopf nur mit diesem Problem habe ich nicht gerechnet.

    Also mit dem (eigentlich unnötigen) 0 Initialisieren:

    http://img10.imageshack.us/img10/8929/cpp5.png
    (Der Pfeil zeigt an das die Schleife bereits komplett durchgelofen ist, waren auch 16 Durchläufe, doch das Ergebnis seht ihr)

    Sieht der Inhalt des Arrays immernoch vollkommen unlogisch aus. Kann es sein das ich irgendeine .net Richtlinie nicht beachtet habe ? Oder kann es sein das ich die Variablen an der falschen Stelle initialisiere und sie dadurch als Konstante behandelt werden? (Bisher werden sie nach #pragma once am Kopf meiner main.h initialisiert)

    Außerdem frägt man sich ja auch wie kann ein Integer solch hohe Werte enthalten ?

    PS.: Gibt es eigentlich in .net noch eine Sonderfunktion für formatierte Ausgaben wie z.B.:
    Punkte : [Variable Punkte]
    Ich meine hier also ohne den Umweg über sprintf und Zwischenvariable.

    Danke euch schonmal



  • Also ist schon recht seltsam.
    Habe gelernt das man Handles nicht global anlegen kann. Bin mir aber jetzt nicht sicher ob man ein Array mit einem handle vergleichen kann, aber glaube das zieht sich ja eh auf den verwalteten Heap. Wie hast du denn das array erstellt?

    Int32 Karten[16]
    

    oder

    array <Int32> Karten = gcnew array <Int32> (16);
    

    Ich glaube letzteres kann man nicht global anlegen. Bin mir der Sache aber nicht sicher.



  • Initialisierung des Arrays:

    int Karten[16] = {0};
    


  • und wo willst du so eine intitialisierung denn gemacht haben?
    im konstruktor?

    dann war sie lokal.

    dein array ist, wie schon gesagt wurde, nicht initialisiert, und besitzt dementsprechend "schrott" inhalte.



  • undwo schrieb:

    und wo willst du so eine intitialisierung denn gemacht haben?
    im konstruktor?

    dann war sie lokal.

    dein array ist, wie schon gesagt wurde, nicht initialisiert, und besitzt dementsprechend "schrott" inhalte.

    Also an welcher Stelle am besten initialisieren ?



  • Wenn ich in der Form initialisiere bekomme ich Fehlermeldungen, also da schonmal nicht.


Anmelden zum Antworten