Forum: Compiler & IDEs unzuverlässige if-Abfrage


von Alexander S. (knut740)


Lesenswert?

Hallo

funktonieren logische Abfragen manchmal und manchmal nicht?

Mit meinem Code
1
   uint8_t  i;
2
   for (i= 0; i < 7; i++)
3
   {
4
    if ( (per[i] < 20000)  &&  (per[i+1] < 20000) )
5
     { .....
 soll ein Array nach zwei benachbarten Zahlen <20000 durchsucht werden.
Relativ häufig werden sie aber nicht gefunden.

Muß man die beiden Hälften der if-Abfrage verschachteln?

Gruß
knut740

von Yalu X. (yalu) (Moderator)


Lesenswert?

An dem geposteten Programmfragment ist ohne weiteren Kontext kein Fehler
zu erkennen. Kannst du etwas mehr posten?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wie ist per[] definiert?

von Alexander S. (knut740)


Lesenswert?

Stefan B. schrieb:
> Wie ist per[] definiert?
1
extern uint16_t per[17]; 
2
extern uint16_t percpy[17];
3
4
void per_auswahl(void)
5
{
6
   uint8_t  i;
7
   for (i= 0; i < 7; i++)
8
   {
9
    if ( (per[i] < 20000)  &&  (per[i+1] < 20000) )
10
     {
11
   percpy[0] = per[i]; 
12
     percpy[1] = per[i+1]; 
13
   percpy[2] = per[i+2]; 
14
     percpy[3] = per[i+3]; 
15
     percpy[4] = per[i+4];    
16
   }
17
  }; // Ende for
In dem Array per[] befinden sich Zahlen zwischen 15000 bis ca 48000. Es 
soll heausgefunden werden, wo zwei Zahlen von ca 15000 unmittelbar 
benachbart stehen. Leider wird das erste dieses Zusammentreffens nicht 
erkannt, sondern nur das zweite, was nachteilig ist.
Eigentlich hatte ich gedacht, mit meiner bei i=0 beginnenden Abfrage 
schon das erste Zusammentreffen zu erwischen, was leider nicht 
geschieht.

von Peter D. (peda)


Lesenswert?

Alexander Schmeil schrieb:
> Leider wird das erste dieses Zusammentreffens nicht
> erkannt, sondern nur das zweite, was nachteilig ist.

Das passiert, wenn man keinen Programablaufplan erstellt, sondern 
einfach so drauflos programmiert.

Die if-Anweisung überschreibt ständig, somit wird immer die letzte 
Erfüllung der Bedingung in der Schleife ausgegeben.

Nimm ein break.


Peter

von Peter (Gast)


Lesenswert?

wenn es mehre Treffer gibt, dann überschreibst du ja

  percpy[0..4]

immer, woran erkennst du das er das erste nicht findet?

von Alexander S. (knut740)


Lesenswert?

Peter schrieb:
> wenn es mehre Treffer gibt, dann überschreibst du ja
>
>   percpy[0..4]
>
> immer, woran erkennst du das er das erste nicht findet?

Stimmt, ich hatte nicht daran gedacht, daß meine Begrenzung auf i<7 
nicht ausreicht, die nächste erfüllte Bedingung zu unterdrücken.

Break hat geholfen!

Vielen Dank für Eure Hilfe

von Alexander S. (knut740)


Lesenswert?

> Break hat geholfen!
>
Kommando zurück:
Break hilft doch nicht, es werden immer noch ältere Ergebnisse von 
jüngeren überschrieben, also trotz BREAK wird die Abfrage doch noch 
einmal ausgeführt.

Ist das BREAK ungeeignet oder steht es an der falschen Stelle?
Beides kommt mir unwahrscheinlich vor. Aber woran liegt es dann?
1
extern uint16_t per[17]; 
2
extern uint16_t percpy[17];
3
4
5
void per_auswahl(void)
6
{
7
   uint8_t  i;
8
   for (i= 0; i < 7; i++)
9
   {
10
    if ( (per[i] < 20000)  &&  (per[i+1] < 20000) )
11
     {
12
   
13
     percpy[0] = per[i]; 
14
     percpy[1] = per[i+1]; 
15
     percpy[2] = per[i+2]; 
16
     percpy[3] = per[i+3]; 
17
     percpy[4] = per[i+4]; 
18
     percpy[5] = i;        // als Test
19
     break;
20
   }
21
  }; // Ende for


Gruß
A.

von Karl H. (kbuchegg)


Lesenswert?

Alexander Schmeil schrieb:
> Aber woran liegt es dann?

Das du einen Denkfehler hast.
Wo der genau sitzt, kann dir keiner sagen, weil
* die Aufgabenstellung nicht 100% klar ist
* wir nur einen wintzig kleinen Ausschnitt aus dem Programm sehen
* wir auch nicht wissen, wie deine Testdaten aussehen

Aber meistens (oft) ist es so, dass deine Daten gar nicht das enthalten, 
was du denkst das sie enthalten.
Wenn dein Programm also deine gesuchten Werte nicht findet und du keinen 
Programmfehler ausmachen kannst, dann würde ich mir als allererstes mal 
die Eingangsdaten ansehen. Sehr oft erlebt man da nämlich eine 
Überraschung.

Eines jedoch ist klar:
Dein Computer versemmelt nicht manchmal eine Abfrage und manchmal nicht.

von HansWerner (Gast)


Lesenswert?

Warum speicherts du deine Elemente um wenn du 2 benachbarte Elemente 
<20000 gefunden hast ?
Wie begründet sich die For-Schleife von i=0 bis i=6 ?
Normalerweise sieht das nach einer Repeat-Until Schleife aus.

von Alexander S. (knut740)


Lesenswert?

> Eines jedoch ist klar:
> Dein Computer versemmelt nicht manchmal eine Abfrage und manchmal nicht.

Glaube ich, ich will auch nicht bestreiten, daß irgendein Denkfehler 
vorliegt.

Das Programm bekommt als Eingangsdaten das Array
1
extern uint16_t per[17];

mit z.B. folgenden Werten:
15629  47647  48624  31267  15633  15630  47643  48627  31270 / 
15631 /

und es liefert vom Array percpy[] z.B.die folgenden Werte:
15626  15630  47650  48624  31266  4 

Leider sieht man auch, daß ich mich entschuldigen muß, denn das Programm 
funktioniert bestens, nur ich hatte übersehen, daß im Array per die 
gesuchte Paarung derzeit wirklich erst ab i=4 vorkommt.

Nichts für ungut
A.

von Alexander S. (knut740)


Lesenswert?

HansWerner schrieb:
> Warum speicherts du deine Elemente um wenn du 2 benachbarte Elemente
> <20000 gefunden hast ?
> Wie begründet sich die For-Schleife von i=0 bis i=6 ?
> Normalerweise sieht das nach einer Repeat-Until Schleife aus.

Im alten Array kommen die interessierenden Werte unter ständig 
wechselnden Indices vor, im neuen Array kann ich bei der 
Weiterverarbeitung immer auf unveränderte Indices zurückgreifen - 
erschien mir übersichtlicher (das Programm ist klein, man kann die 
Variablen noch leicht überblicken).
i=o bis i=6 reicht aus, da muß die gesuchte Paarung mindestens einmal 
vorkommen (die zugehörigen Werte ggf auch bei i>6).

Gruß
Alexander

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.