Forum: PC-Programmierung if-bedingung wird nicht erfüllt, obwohl wahr ist


von Peter (Gast)


Lesenswert?

Hallo, ich habe einen Fehler im Programm, den ich nicht verstehe.

der TEil wo es schief geht
1

2
neu = 0
3
while(!neu){
4
  printf("while schleife\n");
5
  n = random(4);
6
  printf("%d   %d   %d \n", n, ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1]),     ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]));
7
   if(ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1])!=2 && ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]!=2)){
8
                  ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]) = 2;
9
                  ZAZYKL(Hilfsfeld[n][0],Hilfsfeld[n][1]) = 0; 
10
                  neu=1;
11
   }
12
}
13

14


also zunächst gehe ich in die While-Schleife hinein. dann nehme ich eine 
Zufahlszahl und gucke ob diese möglich ist. diese muss bei 
ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1]) und 
ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]) ungleich 2 sein, damit die 
if-Bedingung erfüllt ist. Dann setze ich etwas und setze neu=1, damit 
die while-schleife beendet wird.
Jetzt zum Problem,
mit
1
printf("%d   %d   %d \n", n, ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1]),   ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]));
lasse ich mir die werte ausgeben. dann kommt z.B.
0 0 0
1 1 1
2 1 1
3 0 1
aber nie eine zwei.
Trotzdem springt er nicht in die if-Bedingung hinein.
was habe ich da falsch gemacht?
gruß
Peter

: Gesperrt durch User
von (prx) A. K. (prx)


Lesenswert?

Peter schrieb:
> ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]!=2)

Klammerfehler.

: Bearbeitet durch User
von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

1. Dein Quellcode enthält einen syntaktischen Fehler und kann in dieser 
Form niemals kompiliert worden sein.

2. Die exemplarische Ausgabe des Programmabschnitts kann niemals von dem 
Programmabschnitt stammen.

Folglich ist Dein obiges Programm irgendwie halbherzig 
zusammengewurschtelt und die angebliche Programmausgabe entspringt 
Deiner Phantasie. Und wir sollen uns wirklich die Mühe machen, darin den 
Fehler zu suchen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter schrieb:
> ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1]) und
> ZA(Hilfsfeld[n][0],Hilfsfeld[n][1])

Das sind keine Funktionen, oder ist das C++, und der Rückgabewert der 
Funktionen eine Referenz?

In C ist so etwas

> ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]) = 2;

mit Funktionen nicht möglich.

von Peter (Gast)


Lesenswert?

wo denn?
1
Hilfsfeld[n][0],Hilfsfeld[n][1]
bezieht sich auf ein Koordinatensystem (x,y).
1
ZA(Hilfsfeld[n][0],Hilfsfeld[n][1])
ist demnach der WErt, der diese Position hat.
die bedingung ist ja
1
if(ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1])!=2 && ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]!=2)){
erste klammer auf, wegen if-Schleife,
zweite Klammer auf, wegen ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1])
erste klammer zu wegen zweite klammer auf
dritte klammer auf, wegen ZA(Hilfsfeld[n][0],Hilfsfeld[n][1])
zweite klammer zu, wegen dritte klammer auf
dritte klammer zu, wegen erste klammer auf.

wo habe ich die Klammer falsch gesetzt? irgendwie finde ich das nicht

von Peter (Gast)


Lesenswert?

Der Teil ist sowohl aus meinem Code.
meintest du evtl die Punkte? die habe ich nur dahingemacht, weil davor 
etwas gemacht wird und danach auch. Ist doch wie ein satz, der nicht 
beendet wird. da mache ihc auch immer ...

von (prx) A. K. (prx)


Lesenswert?

Peter schrieb:
> wo habe ich die Klammer falsch gesetzt? irgendwie finde ich das nicht

ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]!=2)
          =
ZA( Hilfsfeld[n][0], Hilfsfeld[n][1] != 2 )
          !=
ZA( Hilfsfeld[n][0], Hilfsfeld[n][1] ) != 2

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Peter schrieb:
> wo habe ich die Klammer falsch gesetzt? irgendwie finde ich das nicht

][1])!=
][1]!=2)){

sieht du jetzt den unterschied?

von Peter (Gast)


Lesenswert?

JA, den sehe ich, aber es muss
1
ZA( Hilfsfeld[n][0], Hilfsfeld[n][1] ) != 2
heissen.
Hilfsfeld[n][0] ist mein x-Wert
Hilfsfeld[n][1] ist mein y-wert

also steht da ja im prinzip
ZA(x,y)!=2

von (prx) A. K. (prx)


Lesenswert?

Peter schrieb:
> also steht da ja im prinzip
> ZA(x,y)!=2

Das wärs, was da stehen sollte.

: Bearbeitet durch User
von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Peter schrieb:
> meintest du evtl die Punkte?

Nein, die meine ich nicht. In dem nachfolgenden Quelltext ist ein 
syntaktischer Fehler enthalten, der dazu führt, dass dieser Abschnitt 
niemals von einem Compiler erfolgreich kompiliert werden kann. Folglich 
hast Du den Quelltext irgendwie hingerotzt und nicht etwa 1:1 aus Deinem 
Programm übernommen.

von (prx) A. K. (prx)


Lesenswert?

Andreas Schweigstill schrieb:
> Nein, die meine ich nicht. In dem nachfolgenden Quelltext ist ein
> syntaktischer Fehler enthalten, der dazu führt, dass dieser Abschnitt
> niemals von einem Compiler erfolgreich kompiliert werden kann.

Wenn man davon ausgeht, dass ZA/ZAH Makros sind, die eine lvalue 
produzieren, dann sehe ich auf Anhieb keinen Syntaxfehler.

von Peter (Gast)


Lesenswert?

Also mich jetzt bitte nicht für doof halten,
aber es steht doch da.
in
Hilfsfeld[n][0] ist mein x-Wert enthalten
Hilfsfeld[n][1] ist mein y-wert enthalten

also steht da ja im prinzip
also bedeutet
ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]) soviel wie
ZA(x,y)

die variablen x und y habe ich nicht direkt, dafür habe ich ja 
Hilfsfeld[n][0] und Hilfsfeld[n][1]

z.B. Hilfsfeld[n][0] = 2;
Hilfsfeld[n][1] = 4;

von Peter (Gast)


Lesenswert?

also hingerotzt hab eich schon mal gar nichts. alleine um das so 
hinzubekmmen, hat es schon ewig für mich gedauert

von Justus S. (jussa)


Lesenswert?

Peter schrieb:
> aber es steht doch da.

nein tut es nicht...

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Also mich jetzt bitte nicht für doof halten,
> aber es steht doch da.

schau doch mal was wirklich da steht

ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]!=2)


wo geht dann die Klammer zu? Und wo sollte sie zu gehen?

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Peter schrieb:
> also steht da ja im prinzip
> ZA(x,y)!=2

Warum liest Du nicht das, was Rufus geschrieben hat? Warum verheimlichst 
Du immer noch, um welche Programmiersprache es sich überhaupt handeln 
soll? Es handelt sich nämlich aus den von Rufus angeführten Gründen 
nämlich definitiv nicht um C. Und im Falle von C++ wäre natürlich die 
Deklaration von ZA und ZAZYKL extrem hilfreich.

Hast Du Dich - unabhängig von der Sprache - überhaupt schon einmal damit 
befasst, was L- und R-Ausdrücke sind? So etwas ist eine absolute 
Grundvoraussetzung, um auch nur eine Zeile zu programmieren.

von Peter (Gast)


Lesenswert?

Da steht doch
Hilfsfeld[n][0] = 2
Hilfsfeld[n][1] = 4

der Wert bei ZA(2,4) soll ungleich zwei sein.
also für mich ist somit
ZA(Hilfsfeld[n][0],Hilfsfeld[n][1])
gleich
ZA(2,4)

von Justus S. (jussa)


Lesenswert?

du willst uns wohl verarschen...

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Peter schrieb:
> ZA(2,4)

WAS ist ZA überhaupt:
a. ein Array,
b. eine Funktion,
c. ein Makro?

Und welchen Typ liefert ZA?

von Justus S. (jussa)


Lesenswert?

Peter schrieb:
> der Wert bei ZA(2,4) soll ungleich zwei sein.

da steht aber ZA(2,4 !=2 )

von Peter (Gast)


Lesenswert?

1
ZA.Size(N,M);
ruft die Funktion Size auf
1
int TZA::Size(int n, int m){
2
  if(zellen) {
3
    delete [] zellen;
4
    N = M = 0;
5
  }
6
  if(n*m){
7
    zellen = new int [n*m];
8
    N = n;
9
    M = m;
10
    Clear();
11
  }
12
  return n*m;
13
}

die sprache ist c++

von plon (Gast)


Lesenswert?

don't feed the troll !

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Peter schrieb:
> ruft die Funktion Size auf
>
1
int TZA::Size(int n, int m){
>
> die sprache ist c++

Size ist keine Funktion, sondern eine Methode. Außerdem befindet sich in 
Deinem Programm kein einziger Aufruf von Size.

Und meine Frage nach von von ZA gelieferten Typ hast Du auch nicht 
beantwortet.

Bevor wir hier also weitermachen, solltest Du Dich mit den Grundlagen 
von C++ befassen. Und dann solltest Du endlich einsehen, dass es dem 
Compiler scheißegal ist, was Dein Programmtext bedeuten soll, sondern er 
interessiert sich nur für das, was Du hinschreibst. Und da gibt es ganz 
beträchliche Unterschiede.

von Patrick (Gast)


Lesenswert?

Timm Reinisch schrieb im Beitrag #3480694:
> was habt ihr denn?

Wir "haben" das da:

Timm Reinisch schrieb im Beitrag #3480694:
> Die Z-Ding sind vermutlich Makros

- Die Betonung liegt auf "vermutlich". Es könnte sich jedoch 
genausogut um eine Funktion oder ein Array handeln - wir wissen es 
nicht.
Das hier ist aber kein Hellseherforum, der TO hat ein Problem und 
wünscht Hilfe, rückt mit den benötigten Informationen nur sehr zaghaft 
und bröckchenweise heraus, wobei die Brocken noch nicht mal ansatzweise 
konsistent sind. Z. B.:

Peter schrieb:
> ZA.Size(N,M);ruft die Funktion Size auf

taucht im ursprünglichen, angeblich "problematischen" Code

Peter schrieb:
> …
> neu = 0
> while(!neu){
>   printf("while schleife\n");
>   n = random(4);
>   printf("%d   %d   %d \n", n, ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1]),
> ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]));
>    if(ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1])!=2 &&
> ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]!=2)){
>                   ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]) = 2;
>                   ZAZYKL(Hilfsfeld[n][0],Hilfsfeld[n][1]) = 0;
>                   neu=1;
>    }
> }
> …
> …

nicht auf. Was soll das jetzt? Sollen wir raten, ob eventuell ein Makro 
die Methode Size kapselt?

von Lutz H. (luhe)


Lesenswert?

Peter schrieb:
> printf("%d   %d   %d \n", n, ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1]),
> ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]));
>    if(ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1])!=2 &&
> ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]!=2)){
>                   ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]) = 2;
>                   ZAZYKL(Hilfsfeld[n][0],Hilfsfeld[n][1]) = 0;

/////////////////////////////////////////
 printf("%d   %d   %d \n", n, ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1]), 
ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]));

>                   neu=1;
>    }


Was passiert, wenn die Werte an der Stelle ausgegeben werden?

von Peter (Gast)


Lesenswert?

Danke  Timm Reinisch (Sind doch nicht alle so gemein hier)
Ja, du hattest recht, die Antwort gab es schon vorher, allerdings habe 
ich es in meinem Programm nicht wirklich erkannt. Ich habe es mir jetzt 
nochmal ganz genau angeguckt und es ist tatsächlich verkehrt gewesen.
es sollte heissen
if(ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1])!=2 &&
ZA(Hilfsfeld[n][0],Hilfsfeld[n][1])!=2){

und siehe an, das Programm funktioniert
danke danke danke

Ps.: habe eigentlich nur gutes von diesem Forum gehört (immerhin wurde 
mein Problem ja auch gelöst), aber so wie Timm Reinisch es schon sagte, 
finde ich den umgang mit leuten, die es vielleicht nicht ganz so gut 
können unter aller kanone.


Das ZA wird in einer ganz anderen Funktion aufgerufen von daher hatte 
ich es nciht dahingeschrieben, sondern alles andere von diesem programm 
mit ... gemacht

von Mirki (Gast)


Lesenswert?

Das steht da bei Dir....if(ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1])!=2 && 
ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]!=2)){


Hier machst Du es richtig
ZAH(Hilfsfeld[n][0],Hilfsfeld[n][1])!=2


Hier ist es falsch
ZA(Hilfsfeld[n][0],Hilfsfeld[n][1]!=2)

Wenn überhaupt, dann
ZA(Hilfsfeld[n][0],Hilfsfeld[n][1])!=2


Das zu verstehen sollte ja kein Problem darstellen...auch wenn man den 
Wald voller Bäume nicht mehr sieht

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Danke  Timm Reinisch (Sind doch nicht alle so gemein hier)
> Ja, du hattest recht, die Antwort gab es schon vorher, allerdings habe
> ich es in meinem Programm nicht wirklich erkannt. Ich habe es mir jetzt
> nochmal ganz genau angeguckt und es ist tatsächlich verkehrt gewesen.

Und was lernen wir daraus?

Eine beschissene und zu dichte Schreibweise kann einem das Leben 
ungemein schwer machen.

So
1
  if( ZAH( Hilfsfeld[n][0], Hilfsfeld[n][1] ) != 2 &&
2
      ZA(  Hilfsfeld[n][0], Hilfsfeld[n][1]   != 2 ) ) {
hätte man etwas besser gesehen, dass da in der Klammerung etwas nicht 
stimmt, bzw. man hätte den Klammerfehler gar nicht erst gemacht. (*)
Auuserdem ist es da viel leichter zu verifizieren, dass tatsächlich ZAH 
und ZA jeweils mit denselben Indizes versorgt werden, die aus Hilfsfeld 
(was für ein bescheuerter Name für eine Variable) mit den jeweils 
identischen Indizes hergeleitet werden.

Nur weil C und C++ es erlauben, dass man alles ohne Leerzeichen 
aneinander klebt, bedeutet das noch lange nicht, dass das eine gute Idee 
ist.
Es hat schon seinen Grund, warum diejenigen Programmierer mit dem 
optisch am schlechtest lesbaren Code auch meistens die mit den dümmsten 
Fehlern sind.


(*) daraus kann man wieder ableiten, dass die oft gehörte Aussage "Jetzt 
bring ich es erst mal zum Laufen, schön mach ich es nachher" Unsinn ist. 
Mach es gleich schön und du sparst dir einen Haufen dummer Fehler!

: Bearbeitet durch User
von Rolf Magnus (Gast)


Lesenswert?

Andreas Schweigstill schrieb:
> Peter schrieb:
>> ruft die Funktion Size auf
>>int TZA::Size(int n, int m){>
>> die sprache ist c++
>
> Size ist keine Funktion, sondern eine Methode.

Natürlich ist das eine Funktion, allderdings eine Memberfunktion. Der 
Begriff "Methode" ist in C++ nicht definiert, auch wenn er 
umgangssprachlich gerne als Ersatz für Memberfunktion herhalten 
muss.Andreas Schweigstill schrieb:
> Peter schrieb:
>> ruft die Funktion Size auf
>>int TZA::Size(int n, int m){>
>> die sprache ist c++
>
> Size ist keine Funktion, sondern eine Methode.

Natürlich ist das eine Funktion, allderdings eine Memberfunktion. Der 
Begriff "Methode" ist in C++ nicht definiert, auch wenn er 
umgangssprachlich gerne als Ersatz für Memberfunktion herhalten muss. 
Man sollte ihn in C++ auch meiden, weil es unterschiedliche Ansichten 
darüber gibt, was eine Methode ist. Ich habe da schon mindestens drei 
verschiedene Definitionen gehört.

Karl Heinz schrieb:
> Hilfsfeld (was für ein bescheuerter Name für eine Variable)

ZA, ZAH und ZAZYKL sind auch nicht besser.

von Peter (Gast)


Lesenswert?

sacht mal, gehts noch?
denkt mal ein bisschen drüber nach, wie ihr über Leute sprecht, die ihr 
gar nicht kennt.

Wie ich meine Variablen nenne, ist doch wohl meine sache. Ausserdem, 
sind diese namen für mein Projekt sehr gut gewählt.

Also dieses Forum werde ich auf gar kein Fall weiterempfehlen.

von Justus S. (jussa)


Lesenswert?

rofl...was erwartest du denn, nachdem du so renitent darauf bestanden 
hast, dass dein Code doch richtig ist, obwohl man die zig mal gezeigt 
hat, wo der Fehler liegt...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter schrieb:
> Also dieses Forum werde ich auf gar kein Fall weiterempfehlen.

Famous last words.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:

> Ausserdem, sind diese namen für mein Projekt sehr gut gewählt.

ZA, ZH, ZAZYKL, Hilfsfeld
sind in KEINEM Projekt 'sehr gut gewählte Namen'!

> Also dieses Forum werde ich auf gar kein Fall weiterempfehlen.

Schön. Lernresistente Anfänger, die meinen die Weisheit mit Löffeln 
gefressen zu haben, brauchen wir sowieso nicht.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.