Hallo iedereen,

Ik heb een vraag, een probleem in C# en ik kan niet op de oplossing komen hoewel die waarschijnlijk heel eenvoudig is; Ik heb nog nooit echt veel gedaan met C#, maar zou het nu graag gaan gebruiken.

Het zit zo: ik heb een binnenkomend signaal dat soms hoog en soms laag is. Ik heb hiervoor een bool gebruikt: soms true, soms false. (laten we deze bool A noemen).

Nu zou ik graag een tweede bool aanmaken, laten we deze bool B noemen. Bool B zou initieel false moeten zijn, en op iedere derde keer wanneer bool A true wordt, moet bool B ook true worden.

vb:
A false B false
A true B false
A false B false
A true B false
A false B false
A true B true
A false B false
A true B false
A false B false
A true B false
A false B false
A true B true
...

Weet iemand hoe je dit aanpakt? Waarschijnlijk is het eenvoudig maar ik "zie 't niet", ik kan er niet opkomen.

Vriendelijk bedankt!

counter op A ?
dus


if (A ==1)
{
	A_true = 1;
	counter = counter +1;
	
	if (B == 1) and (counter = 2)
	    {
                counter = 0;
		B_true = 1;
            }
}

@kwally: let op je maakt een toewijzing ipv vergelijking: (counter = 2)

Ik zou een "vorige A gebruiken" psuedo code:



BEGIN:

A = inlezen_van_dingetje();

if A==true and A_vorige==false {   // alleen bij verandering van A naar true tellen.

   if count++ == 3 {   // bij derde tel gaan we B zetten

      B=true;
      count=0;
   } 

} elseif A!=A_vorige {  // als A wel verandert maar niet naar 1 dan B = false.

      B=false ; 

}

A_vorige = A;  // we gaan A onthouden zodat we verandering kunnen zien na de loop

GOTO BEGIN:

int counter = 0;
bool ParseB(bool A)
{
  B = false; // normaal false
  if (A) // tenzij A true is..
  {
    counter++;
    if(counter == 3) // voor de derde keer..
    {
      B = true; // dan is B true..
      counter = 0; // en tellen we weer opnieuw.
    }
  }
  return B;
}

Zoiets?

Dag jroels,

Als ik dit niet verkeerd versta is dit eigenlijk een 3-deler?
Nog een alternatief.


bool bA;	//Signaal A
bool bB;	//Signaal B
long ilCount;	//Teller voor A pulsen

ilCount += Convert.ToUInt64(bA);
bB = ((ilCount % 3) == 0 );

"Volledig" zou dit er zo kunnen uitzien:


using System;

namespace TestClass
{
 class tBoolCount
  {
   private bool bA;		//Signaal A
   private bool bB;		//Signaal B
   private long ilCount;	//Teller voor A pulsen

   //Teller funktie
   public void Count(void)
    {
     ilCount += Convert.ToUInt64(bA);
     bB = ((ilCount % 3) == 0 );
    }
  }

 class TestClass
  {
   static void Main(string[] args)
    {
     tBoolCount SignCount = new tBoolCount(); 
     while(true)
      {
       SignCount.Count();
      }   
    }
  }
}

Op 17 april 2013 15:57:39 schreef K7Jz:
@kwally: let op je maakt een toewijzing ipv vergelijking: (counter = 2)

Deze (veel voorkomende) bug kan je voorkomen door stelselmatig de parameters in vergelijkingen om te draaien. Zoals hier beneden. Werkt natuurlijk ook voor C en C++;


if (2 == counter)

Dit ziet men trouwens graag in heel wat bedrijven.

Groetjes

Op 18 april 2013 03:18:02 schreef YokoTsuno:


if (2 == counter)

Dit ziet men trouwens graag in heel wat bedrijven.

Bij mij niet hoor! Koop gewoon een compiler die het verschil ziet/weet!
(GCC, aanschafprijs: EUR 0,- )

Ik zou net zeggen, GCC waarschuwt je hiervoor.

Je kunt het ook oplossen door de 1e A, 2e A en 3e A als 'verschillende' booleans te zien. Dan kijk je of A1 == 1 && A2 == 1 && A3 == 1. (Je truth-table wordt dus eigenlijk 8 entries groot ipv 2)

Dit is vrij 'ligt' te implementeren:

In C zoiets:


bool checkA(bool A)
{
 static char Ahist = 0;
 Ahist = Ahist << 1;
 Ahist = Ahist | A;
 return (Ahist & 0x07 == 0x07);
}

B = checkA(A)
if(B)
  ...

e: 'static' is vrij belangrijk: dit zorgt dat Ahist maar eenmaal gealloceerd wordt en niet 'reset' tussen de calls naar checkA door.

[Bericht gewijzigd door knifter op (14%)]

Op 19 april 2013 12:15:06 schreef knifter:
Je kunt het ook oplossen door de 1e A, 2e A en 3e A als 'verschillende' booleans te zien. Dan kijk je of A1 == 1 && A2 == 1 && A3 == 1.

Een serie/parallel omvormer. Uniek concept. Denk dat dit ook op andere plaatsen van pas kan komen.

: 'static' is vrij belangrijk

De TS maakt gebruik van C#.

Op 19 april 2013 11:13:33 schreef shizzle dizzle:
Ik zou net zeggen, GCC waarschuwt je hiervoor.

Klopt. De meeste compilers hebben overigens een dergelijke optie. Dit ligt echter niet meer zo eenvoudig voor grotere projecten met bestaande code en/of meerdere SW ontwikkelaars.

Groetjes.

Op 17 april 2013 15:57:39 schreef K7Jz:
@kwally: let op je maakt een toewijzing ipv vergelijking: (counter = 2)

Oeps idd, maar het was meer een id dan bruikbare code.

Op 18 april 2013 03:18:02 schreef YokoTsuno:
Deze (veel voorkomende) bug kan je voorkomen door stelselmatig de parameters in vergelijkingen om te draaien. Zoals hier beneden. Werkt natuurlijk ook voor C en C++;


if (2 == counter)

Dit ziet men trouwens graag in heel wat bedrijven.

Groetjes

MOOI! Zelf gebruik ik het enkel voor hobby bobby toestanden.

Op 19 april 2013 11:13:33 schreef shizzle dizzle:
Ik zou net zeggen, GCC waarschuwt je hiervoor.

Dit gebruik ik ook.