mikrocontroller.net

Forum: Compiler & IDEs unzuverlässige if-Abfrage


Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

funktonieren logische Abfragen manchmal und manchmal nicht?

Mit meinem Code
   uint8_t  i;
   for (i= 0; i < 7; i++)
   {
    if ( (per[i] < 20000)  &&  (per[i+1] < 20000) )
     { .....
 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

Autor: Yalu X. (yalu) (Moderator)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist per[] definiert?

Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:
> Wie ist per[] definiert?
extern uint16_t per[17]; 
extern uint16_t percpy[17];

void per_auswahl(void)
{
   uint8_t  i;
   for (i= 0; i < 7; i++)
   {
    if ( (per[i] < 20000)  &&  (per[i+1] < 20000) )
     {
   percpy[0] = per[i]; 
     percpy[1] = per[i+1]; 
   percpy[2] = per[i+2]; 
     percpy[3] = per[i+3]; 
     percpy[4] = per[i+4];    
   }
  }; // 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn es mehre Treffer gibt, dann überschreibst du ja

  percpy[0..4]

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

Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht 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?
extern uint16_t per[17]; 
extern uint16_t percpy[17];


void per_auswahl(void)
{
   uint8_t  i;
   for (i= 0; i < 7; i++)
   {
    if ( (per[i] < 20000)  &&  (per[i+1] < 20000) )
     {
   
     percpy[0] = per[i]; 
     percpy[1] = per[i+1]; 
     percpy[2] = per[i+2]; 
     percpy[3] = per[i+3]; 
     percpy[4] = per[i+4]; 
     percpy[5] = i;        // als Test
     break;
   }
  }; // Ende for 


Gruß
A.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HansWerner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.