Probleme mit if-Bedingung

kirashet

Mitglied
Hallo,

hab folgende Funktion geschrieben:

Code:
bool checkField( int _field[MAX], int _number ) {
     bool returnValue = true;

     for ( int i=0;i<MAX;i++ ) {
         if ( ( _field[i] == _number ) || ( _field[i] == 0 ) ) {
            returnValue = false;
         }
     }
     return returnValue;
}

Wenn ich das Programm starte, welches die Funktion aufruft, bleibt die Konsolenausgabe schwarz und es erscheinen im Borland C++ Builder 5 blaue Punkte links neben den Zeilen, obwohl ich nicht im Debug-Modus bin...

Wenn ich
Code:
_field[i] == 0
weglasse funktioniert das Programm, wenn ich
Code:
 _field[i] == 0
hinzufüge, tritt der obige Fehler auf.

Woran könnte das liegen?

-- kirashet
 
Das ist seltsam. Bist du sicher, dass das Zufügen eines Spaces den Unterschied verursacht? Dann handelt es sich vermutlich um einen Bug in deiner Entwicklungsumgebung.

Übrigens: kannst du nicht direkt false zuürckgeben innerhalb des if() -Blockes? Wenn du einen Eintrag gefudnen hast, der den Rückgabewert festlegt, musst du doch nicht noch den Rest des Arraysuntersuchen, oder?
 
Danke für die schnelle Antwort...

Also,
Code:
if ( ( _field[i] == _number ) )

funktioniert, jedoch
Code:
if ( ( _field[i] == _number || ( _field[i] == 0 ) ){

funktioniert nicht... er kommt mit dem == 0 nicht klar...

Ich muss das Array überprüfen, ob der mitgegebene Wert im Array ist und 0 darf's auch nicht beinhalten...

-- kirashet
 
Dann hast du eventuell einen logischen Fehler drin.

Bei dem Schnipsel in deinem letzten Post fehlt auf jeden Fall eine runde Klammer.

Code:
if ( ( _field[i] == _number )  || ( _field[i] == 0 ) )
{
  cout << "erfüllt";
}
Obige Konstruktion gibt genau dann "erfüllt" aus, wenn _field[i] den Wert 0 oder den Wert von _number hat. Das ist doch, was du beabsichtigst, oder? Ist eventuell dein Array nicht korrekt initialisiert?
 
ja ok, im Post hab ich die Klammer vergessen....

Obige Konstruktion gibt genau dann "erfüllt" aus, wenn _field[ i ] den Wert 0 oder den Wert von _number hat. Das ist doch, was du beabsichtigst, oder? Ist eventuell dein Array nicht korrekt initialisiert

Genau, du hast das richtig verstanden... Das Array ist aber korrekt initialisiert und enthält auch Daten...

Ich krieg gleich die Krise...

-- kirashet
 
Vielleicht will's ja einer mal ausprobieren

Code:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

const int MAX = 6;
void fillUser  ( int[MAX]        );
void fillField ( int[MAX]        );
bool checkField( int[MAX], int   );
void tausch    ( int *   , int * );
void sort      ( int[MAX]        );

void main() {
     int lotto[MAX];
     int tipp [MAX];
     fillField( lotto );
     sort ( lotto );
     printf("ZAHLEN \n");
     for (int i=0;i<MAX;i++) {
         printf(" %i %i \n ", i, lotto[i]);
     }
     printf(" \n");
     fillUser( tipp );
     for (int j=0;j<MAX;j++) {
         printf(" %i %i \n", j, tipp[j]);
     }

     getch();
}
void fillUser ( int _field[MAX] ) {
     for ( int i=0;i<MAX;i++ ) {
         int number = 0;
         printf("Bitte %i. Zahl zwischen 1 und 49 eingeben: ", i+1);
         scanf ("%i", &number);
         if ( number >= 1 && number <= 49 ) {
            if ( checkField( _field, number ) ) {
                 _field[i] = number;
            }
         }
         else {
            printf("Ungültige Eingabe. \n");
            i-=1;
         }
     }
}
void fillField( int _field[MAX] ) {
     randomize();
     for ( int i=0;i<MAX;i++ ) {
         int number = random( 50 );
         if ( checkField( _field, number ) ) {
            _field[i] = number;
         }
         else {
            i-=1;
         }
     }
}
bool checkField( int _field[MAX], int _number ) {
     bool returnValue = true;

     for ( int i=0;i<MAX;i++ ) {
         if ( ( _field[i] == _number ) || ( _field[i] == 0 ) ) { // Problematische Stelle
            returnValue = false;
         }
     }
     return returnValue;
}
void sort( int _field[MAX] ) {
     for ( int i=MAX-1; i>0; i-- ) {
         for ( int j=0;j<i;j++ ) {
             if ( _field[j] > _field[j+1] ) {
                tausch( &_field[j], &_field[j+1] );
             }
         }
     }
}
void tausch( int *_x, int *_y ) {
     int dummy = *_x;
     *_x    = *_y;
     *_y    = dummy;
}

-- kirashet
 
Ich habe es mal kompiliert. randomize() und random() habe ich nicht bei meinem VC++. Ich habe random( 50 ) durch rand() % 50 ersetzt, was vermutlich auf das selbe rauskommt, und das randomize() weggelassen.

Das Array _field ist vor dem Aufruf von fillField() nicht korrekt initialisiert. Das ist wichtig, da fillField() trotz seines Namens nicht nur das Array füllt, sondern über die Funktion checkField() auch noch nicht initialisierte Bereiche des Arrays testet. Aus diesem Grund liefert checkField() vermutlich häufiger als gut ein false zurück, was in fillField() dazu führt, dass der Schleifenzähler heruntergezählt wird. An dieser Stelle landet dein Programm dann in einer Endlosschleife.

Ich kann nicht behaupten, dass ich die Logik verstehe, die dahintersteckt.

Für ähnliche Probleme würden sich übrigens std::shuffle und std::sort eignen. Man muss ja nicht alles neubauen.
 
Hi,

1000 Dank für deine Hilfe...

Hab eben selber herausgekriegt, dass es sich um eine Endlosschleife handelt *pein*....
Wegen dem sortieren usw: Das ist leider die Aufgabenstellung, daher...

Aber jetzt funktioniert's ja... Herrlich.

-- kirashet
 
Fein. Schau dir mal std::random_shuffle und std::sort in der <algorithm> an, oder besser in der Dokumentation. Die sind sehr praktisch. std:.shuffle gibt es übrigens nicht, da hatte ich mich im letzten Post vertippt.
 
Zurück