For loop issue

Pagina: 1
Acties:
  • 373 views

Acties:
  • 0 Henk 'm!

  • Cassius
  • Registratie: Januari 2002
  • Niet online
Ok, basic stuff en slecht programmeerwerk, maar dat is verder niet mijn vakgebied. Dat het niet mijn vakgebied is ... toont zich wel in het feit dat ik met mijn kennis niet zie waarom dit fout gaat.

Het probleem; als ik het activateknopje (waarde niet indrukken is 0, wel indrukken is 1023) indruk (maar de pic is zo snel dat hij het ziet als "ingedrukt houdt") ... dan zet hij alsnog alle objectId's op hoog bij de eerste loop (waar numberValue kleiner is dan 341). Ik kom erachter dat hij het niet doet als ik de knop 'delay'. Hij doet het uiteraard nog steeds (met die delay) als ik mijn vinger lang genoeg op de knop houd (oftewel 150ms). Echter dat snap ik niet ... aangezien decontrole variabele clicked nergens binnen die loop 0 wordt gemaakt, maar erbuiten als de activate waarde laag is (knop niet ingedrukt).

Hoe kan het nu dat hij toch met 1 click al die krengen aanzet :( ? Ik wil gewoon dat hij in die eerste <341 loop maar 1 ding aanzet, of ik die knop nu lang ingedrukt houdt of niet.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
if (activateValue > 512 && clicked == 0){
    clicked = 1;
    digitalWrite(color, LOW);
    digitalWrite(color1, LOW);
    digitalWrite(color2, LOW);
    digitalWrite(number, LOW);
    digitalWrite(number1, LOW);
    digitalWrite(number2, LOW);
    digitalWrite(timerLevel, LOW);
    digitalWrite(timerLevel1, LOW);

    if (numberValue < 341){ //als hij ingesteld is op 1 unit, zet er maar 1 aan (maar wel eentje die beschikbaar is)
    delay (50); //deze erin zorgt ervoor dat het praktisch werkt, maar het is niet echt een oplossing
      for (int z = 0; z < 3; z++){
        if (z < 1){
          if (arrayPresent[0] == 1){
            digitalWrite(objectId, HIGH);
            arrayPresent[0] = 0;
          }
          else if (arrayPresent[1] == 1){
            digitalWrite(objectId1, HIGH);
            arrayPresent[1] = 0;
          }
          else if (arrayPresent[2] == 1){
            digitalWrite(objectId2, HIGH);
            arrayPresent[2] = 0;
          }
        }
      }
    }

    if (numberValue > 340 && numberValue < 682({ //als hij ingesteld is op 2 units, zet er 2 aan (maar wel die beschikbaar zijn)    
delay (50); //deze erin zorgt ervoor dat het praktisch werkt, maar het is niet echt een oplossing
      for (int z = 0; z < 3; z++){
        if (z < 2){
          if (arrayPresent[0] == 1){
            digitalWrite(objectId, HIGH);
            arrayPresent[0] = 0;
          }
          else if (arrayPresent[1] == 1){
            digitalWrite(objectId1, HIGH);
            arrayPresent[1] = 0;
          }
          else if (arrayPresent[2] == 1){
            digitalWrite(objectId2, HIGH);
            arrayPresent[2] = 0;
          }
        }
      }
    }

    if (numberValue > 681){ //als hij ingesteld is op 3 units, zet er 3 aan (maar wel die beschikbaar zijn)
    delay (50); //deze erin zorgt ervoor dat het praktisch werkt, maar het is niet echt een oplossing
      for (int z = 0; z < 3; z++){
        if (z < 3){
          if (arrayPresent[0] == 1){
            digitalWrite(objectId, HIGH);
            arrayPresent[0] = 0;
          }
          else if (arrayPresent[1] == 1){
            digitalWrite(objectId1, HIGH);
            arrayPresent[1] = 0;
          }
          else if (arrayPresent[2] == 1){
            digitalWrite(objectId2, HIGH);
            arrayPresent[2] = 0;
          }
        }
      }
    }
  }

[ Voor 15% gewijzigd door Cassius op 27-09-2010 18:46 ]

De meeste mensen deugen!


Acties:
  • 0 Henk 'm!

  • kaesve
  • Registratie: Maart 2009
  • Laatst online: 16-05 03:04
hè? wat doe jij nu met je for-loop? ik geloof dat je het idee ervan compleet verkeerd hebt begrepen.. waarom heb je je for loop nu 3x gekopieerd?

wanneer numberValue nu kleiner is dan 341 wordt die eerste for-loop 3x uitgevoerd (met voor 'z' de waarden 0, 1 en 2) en wordt alleen de eerste keer ook daadwerkelijk iets gedaan. de twee keren daarna is z < 1 false en gebeurt er niets..

wat probeer je nu uberhaupt en waarom probeer je het zo? :?

Acties:
  • 0 Henk 'm!

  • yade
  • Registratie: Mei 2002
  • Laatst online: 02-06 11:10
Ik wilde je code vereenvoudigen en dat is goed te doen in een paar regels code, maar ik ga het je vertellen.

Je hebt maar één loop nodig.
Je objectId's moeten in een array.
Je gebruikt z als de indexer van de array's.
Die elseif's gaan eruit. ;) (Daar zit vermoedelijk ook je bug.)
De if's die nu je loops selecteren gebruik je om een eind waarde voor die ene loop te bedenken. (1,2 of 3).

Ik weet het niet zeker, maar ik heb het idee dat je, zolang je de knop ingedrukt houdt, meerdere keren langs deze code komt. De eerste keer dat je langskomt, zal de eerste objectId hoog worden gemaakt, maar daarna wordt de arrayPresent op 0 gezet. De volgende keer dat je daar langskomt zal dus de volgende objectId hoog worden gemaakt door de elseif.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-06 13:51

NMe

Quia Ego Sic Dico.

Sorry, maar dit mag je toch echt zelf debuggen. Maar eerst zou ik er even een boek bij pakken en de basis van control structures nog eens leren, want dit is dus niet hoe je een for-loop gebruikt. Hoe het wel moet legt yade hierboven al prima uit, dus dat ga ik niet herhalen. Die drie grote identieke blokken kun je vervangen door 4-5 regels die precies hetzelfde doen, zonder kans op onnodige bugs. Afgezien van de code compleet voor je herschrijven (wat ik niet doe omdat je daar niets van leert) kan ik verder niet veel meer zeggen dan de tips van yade.

Ik zou zeggen, ga zelf even wat leren en debuggen. Dit is echt onder het niveau van wat we verwachten dat je al hebt voordat je in de Devschuur gaat posten.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Dit topic is gesloten.