if-bedingung wird nicht erfüllt, obwohl wahr ist

Gast #3480613
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
(Firma: Schweigstill IT) Persönliche Seite #3480632
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?
Gast #3480635
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
Gast #3480642
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 ...
(Firma: Schweigstill IT) Persönliche Seite #3480655
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.
Gast #3480663
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;
(Firma: Schweigstill IT) Persönliche Seite #3480669
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.
Gast #3480681
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++
(Firma: Schweigstill IT) Persönliche Seite #3480704
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.
Gast #3480708
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?
#3480710
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?
Gast #3480711
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
Gast #3480724
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
#3480795
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!
Gast #3480891
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.
Gast #3480895
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.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.