Toon posts:

[C++]While lus

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
code:
1
2
3
4
while ((status & 192) != 192)
{
    status = ... //lees een bepaalde waarde
}

Als status > 192 (het gaat om de 2 MSBs (= 11xxxxxxxx)) dan moet de while loop toch onderbroken worden :?

Of ben ik nu gek aan het worden?

  • Orphix
  • Registratie: Februari 2000
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
int main(int argc, char *argv[])
{
    int status = 125;
    while ((status & 11000000) != 11000000)
    {
        std::cout << "1 keer";
        status = 11000000;
    }

    return 0;
}

geeft bij mij gewoon '1 keer'. Het stopt dus wel met de loop. Misschien is status geen int :?

Verwijderd

Topicstarter
Gulukkig, ik ben dus nog niet gek aan het worden :+ Hier werkt het om de een of andere vage reden niet. Status is overigens een int ja :)

Bedankt voor het uitproberen

  • Disciplus-Simplex
  • Registratie: September 2001
  • Laatst online: 28-05 00:58

Disciplus-Simplex

altijd wakker....

Je gebruikt een AND operator --> 11xxxxxx & 11000000 (binaire waardes) geeft 1 -->
1 != 11000000 dus loop wordt altijd meteen onderbroken.

Zo zie ik het dan :)

Ik dien de wetenschap en put daar vreugde uit.......


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op dinsdag 22 januari 2002 01:21 schreef Zotty het volgende:
Gulukkig, ik ben dus nog niet gek aan het worden :+ Hier werkt het om de een of andere vage reden niet. Status is overigens een int ja :)

Bedankt voor het uitproberen
Neuh niet veel gekker dan ik je al vond ;)

maar ik snap het ook niet eigenlijk. Welke compiler gebruik je? En kan je misschien wat meer source geven?

Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 01:23 schreef Orphix het volgende:
Neuh niet veel gekker dan ik je al vond ;)
En bedankt :7

Net ff geprobeerd status een vaste waarde geven en het werkt idd wel (stom dat ik daar niet eerder opgekomen ben).
Normaal staat er dit:
code:
1
2
3
4
5
6
7
8
while ((status & 192) != 192)
    {
      cout << "loop: " << status << endl;
      DlPortWritePortUshort(CtrlPort,0x04);
      DlPortWritePortUshort(CtrlPort,0x07);
      status = DlPortReadPortUchar(DataPort);
      DlPortWritePortUshort(CtrlPort,0x04);
    }

Dat aan de rechter kant van het = teken is van DLportIO en leest een waarde in via de paralelle poort. Als dit 192 (=11000000)opleverd moet de while lus onderbroken worden, maar dat gaat dus niet zoals het moet. Status komt op een bepaalde waarde te vast te zitten oid en dat hoort helemaal niet te kunnen.

  • Quorton
  • Registratie: Januari 2001
  • Laatst online: 31-05 14:12
Op dinsdag 22 januari 2002 01:21 schreef Disciplus-Simplex het volgende:
Je gebruikt een AND operator --> 11xxxxxx & 11000000 (binaire waardes) geeft 1 -->
1 != 11000000 dus loop wordt altijd meteen onderbroken.

Zo zie ik het dan :)
De AND operator geeft geen TRUE of FALSE terug maar gewoon het resultaat van de operation.

Wat betreft het probleem, die 11000000 moet dat een binaire waarde voorstellen (daar lijkt het wel op, tenzij je het alleen zo als voorbeeld hebt opgeschreven), dan kun je deze misschien beter als hexadecimaal (0xC0) opschrijven, adners denkt de compiler dat je decimalen wilt gebruiken, en het zou kunnen dat dat niet overeenkomt met hetgeen de status variabele mee gevuld wordt.

just a thought......

Quadcore 6600 @ 3,3Ghz, 4 GB, 2 TB raid 5, GF 8400GS
P4 2.8G, 2 GB, 500GB diskspace, GF FX5200


Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 01:33 schreef Quorton het volgende:

[..]

De AND operator geeft geen TRUE of FALSE terug maar gewoon het resultaat van de operation.

Wat betreft het probleem, die 11000000 moet dat een binaire waarde voorstellen (daar lijkt het wel op, tenzij je het alleen zo als voorbeeld hebt opgeschreven), dan kun je deze misschien beter als hexadecimaal (0xC0) opschrijven, adners denkt de compiler dat je decimalen wilt gebruiken, en het zou kunnen dat dat niet overeenkomt met hetgeen de status variabele mee gevuld wordt.

just a thought......
De compiler pakt het als decimale waarde, maar dat maakt in dit geval niks uit als het goed is ;)

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op dinsdag 22 januari 2002 01:31 schreef Zotty het volgende:

[..]

En bedankt :7

Net ff geprobeerd status een vaste waarde geven en het werkt idd wel (stom dat ik daar niet eerder opgekomen ben).
Normaal staat er dit:
code:
1
2
3
4
5
6
7
8
while ((status & 192) != 192)
    {
      cout << "loop: " << status << endl;
      DlPortWritePortUshort(CtrlPort,0x04);
      DlPortWritePortUshort(CtrlPort,0x07);
      status = DlPortReadPortUchar(DataPort);
      DlPortWritePortUshort(CtrlPort,0x04);
    }

Dat aan de rechter kant van het = teken is van DLportIO en leest een waarde in via de paralelle poort. Als dit 192 (=11000000)opleverd moet de while lus onderbroken worden, maar dat gaat dus niet zoals het moet. Status komt op een bepaalde waarde te vast te zitten oid en dat hoort helemaal niet te kunnen.
Maar als je status = 192 doet gaat het dus wel goed?
en bij de cout << "loop: " << status << endl; geeft die wel het getal 192 aan?

  • Quorton
  • Registratie: Januari 2001
  • Laatst online: 31-05 14:12
Wel als het resultaat uit DlPortReadPortUchar nooit overeenkomt met die 192 (ge-AND dan), dan blijft ie dus eeuwig in die loop (ik veronderstel dat dat het probleem was)

Quadcore 6600 @ 3,3Ghz, 4 GB, 2 TB raid 5, GF 8400GS
P4 2.8G, 2 GB, 500GB diskspace, GF FX5200


Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 01:38 schreef Orphix het volgende:

[..]

Maar als je status = 192 doet gaat het dus wel goed?
en bij de cout << "loop: " << status << endl; geeft die wel het getal 192 aan?
Staat er botweg "status = 192", dan werkt het. Maar als er dus 192 via DLportIO uitkomt, welke op het scherm verschijnt via de "cout", dan werkt het niet. Dan blijft de lus lopen en komt er dus continu "loop: 192" voorbij in de console.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Probeer eens iets als dit
code:
1
status = reinterpret_cast<int>(DlPortReadPortUchar(DataPort));

* Orphix gaat nu maar lukraak wat verzinnen hoor :)

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 07-07 21:48
Op dinsdag 22 januari 2002 01:36 schreef Zotty het volgende:

[..]

De compiler pakt het als decimale waarde, maar dat maakt in dit geval niks uit als het goed is ;)
Doe je nu niet een bitwise AND van 192 met 11 miljoen ? En dan controleren of het resultaat weer 11 miljoen is? Lijkt me een endless loop toch :?

Whatever


Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 01:46 schreef Orphix het volgende:
Probeer eens iets als dit
code:
1
status = reinterpret_cast<int>(DlPortReadPortUchar(DataPort));

* Orphix gaat nu maar lukraak wat verzinnen hoor :)
Krijg de melding dattie niet kan casten van een unsigned char naar int.

Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 01:47 schreef sjis het volgende:

[..]

Doe je nu niet een bitwise AND van 192 met 11 miljoen ? En dan controleren of het resultaat weer 11 miljoen is? Lijkt me een endless loop toch :?
die 11 miljoen was puur ter indicatie om aan te geven wat ik met die bits wou doen. Er staat in het echt gewoon 192 ;)

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 07-07 21:48
Op dinsdag 22 januari 2002 01:52 schreef Zotty het volgende:

[..]

die 11 miljoen was puur ter indicatie om aan te geven wat ik met die bits wou doen. Er staat in het echt gewoon 192 ;)
Ok, nog een gedachte : status is een INT zeg je. Het lezen van die parallelle port heeft UCHAR in de functienaam. Leest dat ding dan niet in het verkeerde deel van de INT (de high bits dus?) Probeer van status ook eens een UCHAR te maken...

En als ik nu onzin lul komt dat door de slaap...Ik ga naar mijn nest! :Z :Z :Z

Whatever


  • Quorton
  • Registratie: Januari 2001
  • Laatst online: 31-05 14:12
Probeer anders eens de variabele naar type BYTE te veranderen (ofwel unsigned char, die cast is dan ook niet nodig)

Quadcore 6600 @ 3,3Ghz, 4 GB, 2 TB raid 5, GF 8400GS
P4 2.8G, 2 GB, 500GB diskspace, GF FX5200


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op dinsdag 22 januari 2002 01:55 schreef sjis het volgende:
Ok, nog een gedachte : status is een INT zeg je. Het lezen van die parallelle port heeft UCHAR in de functienaam. Leest dat ding dan niet in het verkeerde deel van de INT (de high bits dus?) Probeer van status ook eens een UCHAR te maken...
Ja het returnt een unsigned char en dat is het probleem. Casten werkt wel maar ik had de verkeerde cast gebruikt |:(

Probeer eens
status = static_cast<int>(DlPortReadPortUchar(DataPort));

je kan status dus ook unsigned char maken, dat is een mooiere oplossing! (maar misschien kan je dit niet veranderen)

Verwijderd

Topicstarter
Met die cout komt er 192 uit. En status is een int, dus dan zou er toch een foutmelding moeten zijn?

Die nieuwe cast werkt zo te zien wel aangezien het compiled, maar het resultaat blijft hetzelfde.

Btw, status veranderd dus ook niet van waarde en dat hoort ook niet te kunnen gezien de controller die aan de paralelle poort hangt.

edit:
van status een unsigned char maken levert leuke karakters op

  • Orphix
  • Registratie: Februari 2000
  • Niet online
hmmm apart.
Ik heb het even gechecked en onderstaand doet het bij mij
VC++ 6.0
code:
1
2
3
4
5
6
7
    unsigned char b = 192;
    int status = 0;
    while((status & 192) != 192)
    {
        cout << "1 loop" << endl;
        status = b;
    }

maar 1 loop dan hier .... voor zover ik het kan zien is dit jouw situatie.
Werkt deze code bij jou?

Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 02:09 schreef Orphix het volgende:
hmmm apart.
Ik heb het even gechecked en onderstaand doet het bij mij
VC++ 6.0
code:
1
2
3
4
5
6
7
    unsigned char b = 192;
    int status = 0;
    while((status & 192) != 192)
    {
        cout << "1 loop" << endl;
        status = b;
    }

maar 1 loop dan hier .... voor zover ik het kan zien is dit jouw situatie.
Werkt deze code bij jou?
Yep, werkt perfect. "int b" werkt ook.

Heb de 1ste post ook ff aangepast.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Nog een poging en anders is het even wachten tot morgen en er knappere koppen bij komen ;)
code:
1
2
3
4
5
6
7
8
9
unsigned char status = 0;
while ((status & 0xC0) != 0xC0)
    {
      cout << "loop: " << static_cast<int>(status) << endl;
      DlPortWritePortUshort(CtrlPort,0x04);
      DlPortWritePortUshort(CtrlPort,0x07);
      status = DlPortReadPortUchar(DataPort);
      DlPortWritePortUshort(CtrlPort,0x04);
    }

Dus via hexadecimale getallen en een unsigned char status.

Verwijderd

Topicstarter
Ook geen verschil. Maar volgens mij ligt het niet aan het feit of het nou binair, hex, decimaal enz is. Zodra de lus erin zit komt er geen nieuwe waarde meer 'binnen'. Comment je de while statement, met bijbehorende accolades, dan komen er wel nieuwe waarden binnen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 22 januari 2002 02:21 schreef Orphix het volgende:
Nog een poging en anders is het even wachten tot morgen en er knappere koppen bij komen ;)
de knappe koppen zijn er nog :P

hoewel ik het verhaal niet helemaal snap... een (waarde & 192) == 192 zou in principe altijd true zijn voor 192 <= waarde <= 255

maw, die waarde ligt gewoon niet binnen het bereik... maar je cout output wel 192 :?

en je hoeft een uchar niet te casten naar int, dat gaat automatisch goed met impliciete casts :)

BTW, wat is nou precies je code? Zoals Orphix het 2 posts geleden heeft gegeven?
oh wacht, dit dus:
code:
1
2
3
4
5
6
7
8
while ((status & 192) != 192)
{
    cout << "loop: " << status << endl;
    DlPortWritePortUshort(CtrlPort,0x04);
    DlPortWritePortUshort(CtrlPort,0x07);
    status = DlPortReadPortUchar(DataPort);
    DlPortWritePortUshort(CtrlPort,0x04);
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op dinsdag 22 januari 2002 02:40 schreef OiSyN het volgende:
de knappe koppen zijn er nog :P
ohja? waar blijft je oplossing dan? >:)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

die heb ik al gegeven, hij staat in geheimschrift in mijn vorige post... ik dacht dat een beetje competente programmeurs als jullie dat wel door zouden hebben :+

mogelijke fouten: status is geen int, of je compiler produceert buggy code :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 02-06 09:44

curry684

left part of the evil twins

Als ik dit zo doorlees kan er maar 1 reden zijn:

--> status is een non-volatile member variabele <--

En klaar is Klara :P

(ps. ja dit is onzin tenzij ie een erg bugged compiler heeft maar ik zie het anders ook niet ;) )

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

dat lijkt me echt onzin, aangezien de waarde wordt gewijzigd in de loop zelf, dus de compiler moet weten dat ie veranderd is. Het is wat anders als status wordt gewijzigd in een andere thread, maar dat is hier niet het geval

en niet stiekum je post editen als ik al een reactie heb gegeven :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ff voor de duidelijkheid :z

Dit is met while lus gecomment
code:
1
2
3
4
5
6
7
8
9
10
11
During while: 192
Before loop: 0
During while: 0
Before loop: 36
During while: 36
Before loop: 46
During while: 46
Before loop: 36
During while: 36
Before loop: 192
During while: 192

while lus in werking
code:
1
2
3
4
5
6
7
During while: 0
During while: 0
During while: 0
During while: 0
During while: 0
During while: 0
enz...

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 02-06 09:44

curry684

left part of the evil twins

Op dinsdag 22 januari 2002 02:52 schreef OiSyN het volgende:
en niet stiekum je post editen als ik al een reactie heb gegeven :P
Teeheehee dat was nog voordat je had gereageerd maar ik bedacht me na de post dat die smile bij Klaar is Klara wellicht niet duidelijk genoeg was om deze tijd :Y)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 22 januari 2002 02:54 schreef Zotty programma output
das wel leuk, maar een beetje nutteloos als we niet weten wanneer die regels geoutput worden :)

curry684: Nee hoor, ik zag je reactie al zonder dat die ene regel erbij stond (hoe kon ik anders weten dat je aan het editten was) :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op dinsdag 22 januari 2002 02:54 schreef Zotty het volgende:
while lus in werking
code:
1
2
3
4
5
6
7
During while: 0
During while: 0
During while: 0
During while: 0
During while: 0
During while: 0
enz...
uhmm....begrijp ik het nou verkeerd of ... ik dacht dat de waarde 192 was in je loop?!

Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 02:56 schreef OiSyN het volgende:

[..]

das wel leuk, maar een beetje nutteloos als we niet weten wanneer die regels geoutput worden :)
Beantwoord dit je vraag :P
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// check status register
void T6963C::Status()
{
    DlPortWritePortUshort(CtrlPort,0x04);
    DlPortWritePortUshort(CtrlPort,0x07);
    int status = DlPortReadPortUchar(DataPort);
    DlPortWritePortUshort(CtrlPort,0x04);

    cout << "Before loop: " << status << endl;

    while ((status & 0xc0) != 0xc0)
    {
      cout << "During while: " << status << endl;
      DlPortWritePortUshort(CtrlPort,0x04);
      DlPortWritePortUshort(CtrlPort,0x07);
      status = DlPortReadPortUchar(DataPort);
      //cout << "New status: " << status << endl;
      DlPortWritePortUshort(CtrlPort,0x04);
    }
}

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 02-06 09:44

curry684

left part of the evil twins

Op dinsdag 22 januari 2002 02:56 schreef OiSyN het volgende:
curry684: Nee hoor, ik zag je reactie al zonder dat die ene regel erbij stond (hoe kon ik anders weten dat je aan het editten was) :)
Er zijn geen edittijden zichtbaar, oftewel ik heb om 2:51 gepost EN gecorrigeerd, en jij hebt om 2:52 gepost EN gecorrigeerd :D

Professionele website nodig?


Verwijderd

Topicstarter
Geen ruzie gaan maken he ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 22 januari 2002 02:59 schreef Zotty het volgende:

[..]

Beantwoord dit je vraag :P
ja, want wat is nou de fout? Als status 0 is dan hoort die loop gewoon door te lopen :)
Overigens, over 3 posts sta je op 1024, das veel interessanter programmeur-technisch gezien :P (en ik ben vandaag gisteren de 2048 gepasseerd :+)

curry684: Als het zo werkt dat als je m in dezelfde minuut nog edit dat het dan niet te zien is, kan het best wel kloppen, aangezien de tijd als seconden in de database staat (waarschijnlijk), en dus kun jij om 2:51:59 gepost hebben terwijl ik om 2:52:10 ofzo postte. En dan heb jij nog 49 seconden om te editten :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Wat is er fout aan? Nou, op het moment dat die while lus erin zit, werkt het niet meer naar behoren, want status wordt niet geupdate met een nieuwe waarde. En dat klopt dus niet.

Maargoed, morgen een nieuwe dag. Nu is het tijd om naar bed te gaan :P

edit:
op naar de 4096 :+

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja maar dan is je probleem heel anders dan waarom je de topic opende :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
nou lijkt me meer een fout van van je LCD controller of de library. Probeer morgen maar eens een pauze in de while loop ertussen te gooien.

weltrusten :z

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op dinsdag 22 januari 2002 03:12 schreef OiSyN het volgende:
ja maar dan is je probleem heel anders dan waarom je de topic opende :)
ja :D en ik al twijfelen of ik niet aan Java zou beginnen ;) :P

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

offtopic:
orphix wat stellen die tekeningetjes eigenlijk voor in je icoon?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op dinsdag 22 januari 2002 03:15 schreef OiSyN het volgende:
offtopic:
orphix wat stellen die tekeningetjes eigenlijk voor in je icoon?
allemaal radiohead related :)
maar ik heb al een nieuw idee voor een nieuw icon, nog niet eerder vertoond op GoT :7. Ik moet alleen nog even een image library vinden :)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 02-06 09:44

curry684

left part of the evil twins

Op dinsdag 22 januari 2002 03:05 schreef OiSyN het volgende:
Als het zo werkt dat als je m in dezelfde minuut nog edit dat het dan niet te zien is, kan het best wel kloppen, aangezien de tijd als seconden in de database staat (waarschijnlijk), en dus kun jij om 2:51:59 gepost hebben terwijl ik om 2:52:10 ofzo postte. En dan heb jij nog 49 seconden om te editten :)
Lijkt me waarschijnlijker dat ik tussen 2:51:00 en 2:51:59 gepost EN ge-edit heb, en jij tussen 2:52:00 en 2:52:59. Volgens mij rond het ding gewoon af door de secondes te knippen.

(heerlijk, klassiek offtopic ruzieen en modder smijten... waar ging het uberhaupt over? :Y) )

Professionele website nodig?


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 30-06 13:01
(status & 192) != 192

is natuurlijk in slechts 2 condities waar. Als status helemaal 0 is of als de bitwaarden gelijk zijn aan die van 192...

Ik denk dat er een conversie probleem optreed bij het impliciet casten van een byte naar een signed int.

192 is impliciet een signed int. En de waarde die je uit je functie krijgt. Geen idee. Probeer is ervoor te zorgen dat die 192 gegarandeerd een unsigned type is. ik geloof een kwestie van ergens een u op de goeie plek zetten, net als een L post-fix om een long aan te duiden.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op dinsdag 22 januari 2002 03:18 schreef curry684 het volgende:

[..]

Lijkt me waarschijnlijker dat ik tussen 2:51:00 en 2:51:59 gepost EN ge-edit heb, en jij tussen 2:52:00 en 2:52:59. Volgens mij rond het ding gewoon af door de secondes te knippen.

(heerlijk, klassiek offtopic ruzieen en modder smijten... waar ging het uberhaupt over? :Y) )
Ik dacht altijd dat je geen 'edited by' zag als je uit het topic ging ... daarna er weer in komt en dan gaat editen :D

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op dinsdag 22 januari 2002 03:19 schreef The - DDD het volgende:
(status & 192) != 192

is natuurlijk in slechts 2 condities waar. Als status helemaal 0 is of als de bitwaarden gelijk zijn aan die van 192...
In het geval van 192 geeft is dit onwaar. 0 <= getal < 192 geeft waar en 192 <= getal < 256 geeft dit onwaar.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 22 januari 2002 03:18 schreef curry684 het volgende:

[..]

Lijkt me waarschijnlijker dat ik tussen 2:51:00 en 2:51:59 gepost EN ge-edit heb, en jij tussen 2:52:00 en 2:52:59. Volgens mij rond het ding gewoon af door de secondes te knippen.

(heerlijk, klassiek offtopic ruzieen en modder smijten... waar ging het uberhaupt over? :Y) )
lijkt me stug, het is gewoon een UNIX timestamp (in seconden dus), en hij doet iets als
code:
1
2
if ((time () - posted) > 60)
   pleurErEenEditMessageIn ();

dat lijkt me het meest waarschijnlijk :)
Op dinsdag 22 januari 2002 03:20 schreef Orphix het volgende:

[..]

Ik dacht altijd dat je geen 'edited by' zag als je uit het topic ging ... daarna er weer in komt en dan gaat editen :D
nou het iig zo dat je het niet ziet als er nog niemand anders je post heeft gezien

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 02-06 09:44

curry684

left part of the evil twins

Op dinsdag 22 januari 2002 03:20 schreef Orphix het volgende:
Ik dacht altijd dat je geen 'edited by' zag als je uit het topic ging ... daarna er weer in komt en dan gaat editen :D
Neuh ik ramde op 'Verstuur', las het resultaat en besloot meteen te editen. Ik gok dat je gewoon in dezelfde minuut moet zijn.

* curry684 gaat nu hard :Z

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 22 januari 2002 03:24 schreef curry684 het volgende:

* curry684 gaat nu hard :Z
miet! :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 02-06 09:44

curry684

left part of the evil twins

Op dinsdag 22 januari 2002 03:19 schreef The - DDD het volgende:
192 is impliciet een signed int. En de waarde die je uit je functie krijgt. Geen idee. Probeer is ervoor te zorgen dat die 192 gegarandeerd een unsigned type is. ik geloof een kwestie van ergens een u op de goeie plek zetten, net als een L post-fix om een long aan te duiden.
Die functie heet niet voor niets DlPortReadPortUchar denk ik. Volgens mij is het gewoon een optimalisatieprobleem van de compiler... maak die hele functie eens gewoon volatile voor de gein? Dan mag er namelijk niet meer in geoptimaliseerd worden met prereads en assumptions. Ik vertrouw die hardware-access wat dat betreft ook single-threaded niet met de symptomen die je opgeeft.

Dusseh:
code:
1
void T6963C::Status() volatile

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 02-06 09:44

curry684

left part of the evil twins

Op dinsdag 22 januari 2002 03:29 schreef OiSyN het volgende:
miet! :+
Ff nog een postje getikt tijdens het uitkleden :Y)

(krijg ik hiervoor nu ook een ban, in me blote snikkel achter de comp posten? :D )

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

lees de FAQ:
Gij zult niet bij uw naasten gedachtes opwekken dat gij naakt achter de computer zit
:P

.edit: overigens, 3 C(++) topics bovenaan, dat mag in de krant :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Cereal
  • Registratie: Maart 2001
  • Laatst online: 08-07 17:50
Op dinsdag 22 januari 2002 03:32 schreef curry684 het volgende:

[..]

Ff nog een postje getikt tijdens het uitkleden :Y)

(krijg ik hiervoor nu ook een ban, in me blote snikkel achter de comp posten? :D )
Is toch lekker relaxed, doe ik ook regelmatig.. :+

(gaaf zeg, op kamers :) )

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 30-06 13:01
Op dinsdag 22 januari 2002 03:23 schreef Orphix het volgende:

[..]

In het geval van 192 geeft is dit onwaar. 0 <= getal < 192 geeft waar en 192 <= getal < 256 geeft dit onwaar.
Uh, oh ja.. Bitwise AND is geen OR. :P

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Op dinsdag 22 januari 2002 03:32 schreef curry684 het volgende:

[..]

Ff nog een postje getikt tijdens het uitkleden :Y)

(krijg ik hiervoor nu ook een ban, in me blote snikkel achter de comp posten? :D )
Hier heb ik gewoon geen woorden voor. :r

Maar goed.

Motor-forum.nl


Verwijderd

Lekker mosterd na de maaltijd post :D
Op dinsdag 22 januari 2002 01:14 schreef Zotty het volgende:
code:
1
2
3
4
while ((status & 192) != 192)
{
    status = ... //lees een bepaalde waarde
}

Als status > 192 (het gaat om de 2 MSBs (= 11xxxxxxxx)) dan moet de while loop toch onderbroken worden :?
Of ben ik nu gek aan het worden?
(status & 192) levert of 0 of 64 of 192 op voor alle waarden van status. Bv 1 0000 0000 levert 0 op en dus waar.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 12-06 11:45
Op dinsdag 22 januari 2002 03:31 schreef curry684 het volgende:

[..]
Die functie heet niet voor niets DlPortReadPortUchar denk ik. Volgens mij is het gewoon een optimalisatieprobleem van de compiler... maak die hele functie eens gewoon volatile voor de gein? Dan mag er namelijk niet meer in geoptimaliseerd worden met prereads en assumptions.
code:
1
void T6963C::Status() volatile
Werkt niet, denk ik.
volatile op functies betekent alleen dat de functie
ook aangeroepen mag worden op volatile T6963C
objecten. Dus net zoals const. Maar de read functie
die wordt aangeroepen staat daar los van, en mag
dus best geoptimaliseerd worden.

Ik heb meer het vermoeden dat de externe H/W niet werkt
zoals verwacht, en dat er gewoon geen >192 terugkomt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 07-07 21:48
Op dinsdag 22 januari 2002 02:59 schreef Zotty het volgende:

[..]

Beantwoord dit je vraag :P
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// check status register
void T6963C::Status()
{
    DlPortWritePortUshort(CtrlPort,0x04);
    DlPortWritePortUshort(CtrlPort,0x07);
    int status = DlPortReadPortUchar(DataPort);
    DlPortWritePortUshort(CtrlPort,0x04);

    cout << "Before loop: " << status << endl;

    while ((status & 0xc0) != 0xc0)
    {
      cout << "During while: " << status << endl;
      DlPortWritePortUshort(CtrlPort,0x04);
      DlPortWritePortUshort(CtrlPort,0x07);
      status = DlPortReadPortUchar(DataPort);
      //cout << "New status: " << status << endl;
      DlPortWritePortUshort(CtrlPort,0x04);
    }
}
Wat geeft het geval als je de regel met New Status uncomment ?

Werkt het ding WEL als je bij de WHILE zegt : "while (status >=192)",wat in feite dezelfde conditie is?

Whatever


Verwijderd

Op dinsdag 22 januari 2002 10:41 schreef sjis het volgende:

[..]

Wat geeft het geval als je de regel met New Status uncomment ?

Werkt het ding WEL als je bij de WHILE zegt : "while (status >=192)",wat in feite dezelfde conditie is?
Nee, is niet dezelfde conditie.

1 0000 0000 is > 192 maar resulteert door de '&' in 0 wat < is dan 192, dus zal slagen. Daarom is de while expressie van de OP ook niet correct. Hij doet er goed aan eerst eens uit te leggen WAT hij precies wil, zodat we dan de while expressie kunnen aanpassen op wat hij wil.

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Op dinsdag 22 januari 2002 10:41 schreef sjis het volgende:

[..]
Werkt het ding WEL als je bij de WHILE zegt : "while (status >=192)",wat in feite dezelfde conditie is?
while (status < 192) bedoel je zeker.

Motor-forum.nl


  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 07-07 21:48
Op dinsdag 22 januari 2002 10:49 schreef Bananeman2002 het volgende:

[..]

while (status < 192) bedoel je zeker.
Je hebt uiteraard gelijk. |:(

En Otis, klopt wat je zegt met 1 0000 0000, maar de waarde die terugkomt van de uitleesfunctie is een UCHAR, ik ga er even van uit dat het om 8 bits gaat. En dan kun je, door met 192 te vergelijken en te kijken of dat goed gaat, duidelijk krijgen in welk statement e.e.a. de mist in gaat.

Whatever


  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Dit is één van de weinige gevallen waarin ik zou willen zeggen: post eens de door compiler gegenereerde code, om in ieder geval iets duidelijker te kunnen zien waar het probleem kan zitten. Misschien heeft de compiler wel besloten de conditie niet te evalueren. Kzie niet in waarom ie dat zou doen, maar goed, ik heb wel vaker gemerkt dat compilers gevoel voor humor hebben.. ;)

Motor-forum.nl


Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 03:12 schreef OiSyN het volgende:
ja maar dan is je probleem heel anders dan waarom je de topic opende :)
Dat klopt, want toen ik het topic opende was het alleen de bedoeling om een 2nd opinion te krijgen over die while lus. Dat het zo'n topic zou wodern, had ik ook niet verwacht :D
Op dinsdag 22 januari 2002 10:22 schreef MSalters het volgende:
Ik heb meer het vermoeden dat de externe H/W niet werkt
zoals verwacht, en dat er gewoon geen >192 terugkomt.
Dat is idd het probleem. Maar dat treed alleen op als die while actief is.
Op dinsdag 22 januari 2002 10:41 schreef sjis het volgende:
Wat geeft het geval als je de regel met New Status uncomment ?
Dan komt er hetzelfde te staan als bij "During while: ", oftewel status veranderd niet.
Op dinsdag 22 januari 2002 10:48 schreef Otis het volgende:
Hij doet er goed aan eerst eens uit te leggen WAT hij precies wil, zodat we dan de while expressie kunnen aanpassen op wat hij wil.
Goed, ik zal het zo duidelijk mogelijk proberen uit te leggen: Aan de paralelle poort hangt een controller dat een display aanstuurd. In de controller zit een status register, waaruit de status van de controller af te lezen is. Die status komt binnen in de vorm van een byte, waarbij 11xxxxxxxx de enige waarde(n) is/zijn waarbij de controller klaar is voor gebruik. Dus als er iets anders uitkomt dan 11xxxxxxxx, dan moet de software even pauze nemen totdat de betrffende 2 bits weer geset zijn.

Verwijderd

Op dinsdag 22 januari 2002 10:53 schreef sjis het volgende:
En Otis, klopt wat je zegt met 1 0000 0000, maar de waarde die terugkomt van de uitleesfunctie is een UCHAR, ik ga er even van uit dat het om 8 bits gaat. En dan kun je, door met 192 te vergelijken en te kijken of dat goed gaat, duidelijk krijgen in welk statement e.e.a. de mist in gaat.
Oh, ja ik maakte niet echt op uit de OP dat het om een UCHAR ging, dat stond er nl. niet bij.

Ik begrijp niet echt wat hij wil, maar als het idd gaat om UCHAR's (bytes in de volksmond) dan moet het idd zo zijn dat wanneer bit 6 en 7 gezet zijn de while loop stopt, dus >= 192.

De OP's code is wel typisch een geval van sqrt(brakke_code);

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 07-07 21:48
Op dinsdag 22 januari 2002 11:10 schreef Zotty het volgende:


Goed, ik zal het zo duidelijk mogelijk proberen uit te leggen: Aan de paralelle poort hangt een controller dat een display aanstuurd. In de controller zit een status register, waaruit de status van de controller af te lezen is. Die status komt binnen in de vorm van een byte, waarbij 11xxxxxxxx de enige waarde(n) is/zijn waarbij de controller klaar is voor gebruik. Dus als er iets anders uitkomt dan 11xxxxxxxx, dan moet de software even pauze nemen totdat de betrffende 2 bits weer geset zijn.
Kan het zo zijn dat de controller nooit op "ready" komt omdat je in de while loop ook nog naar de controller toe stuurt met Dlportwriteportushort? (dus dat het ding overstelpt wordt met commando's) Is het nodig om in de loop dit steeds te doen, kun je niet gewoon alleen maar de dlportreadportuchar in de loop laten staan ?

Whatever


Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 11:21 schreef sjis het volgende:

[..]

Kan het zo zijn dat de controller nooit op "ready" komt omdat je in de while loop ook nog naar de controller toe stuurt met Dlportwriteportushort? (dus dat het ding overstelpt wordt met commando's) Is het nodig om in de loop dit steeds te doen, kun je niet gewoon alleen maar de dlportreadportuchar in de loop laten staan ?
De writes naar de controller toe is de aansturing van de controllines (RD, WR, CE en C/D). Die moeten gebruikt worden, anders wordt de status hardwarematig niet ververst.

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 07-07 21:48
Op dinsdag 22 januari 2002 11:31 schreef Zotty het volgende:

[..]

De writes naar de controller toe is de aansturing van de controllines (RD, WR, CE en C/D). Die moeten gebruikt worden, anders wordt de status hardwarematig niet ververst.
Ok, maar probeer eens een kleine delay (smerig loopje of zo) voordat je de status probeert uit te lezen, en nadat je er commando's naartoe knalt ? Ik kan me zo ondertussen echt niks anders meer voorstellen dan zo'n soort timing-probleem.

Whatever


Verwijderd

Topicstarter
edit:
bugje....

while lus eruit slopen, status globaal declareren en er dit van maken helpt ook niet.
code:
1
2
3
4
while (status != 192) {
      Status();
      cout << "BUSY: " << status << endl;
    }

Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 11:37 schreef sjis het volgende:

[..]

Ok, maar probeer eens een kleine delay (smerig loopje of zo) voordat je de status probeert uit te lezen, en nadat je er commando's naartoe knalt ? Ik kan me zo ondertussen echt niks anders meer voorstellen dan zo'n soort timing-probleem.
Gisteren allemaal al geprobeerd. Timing probleem dacht ik in eerste instantie ook aan. Sleep(250) geprobeerd, getch() geprobeerd, allebei geen effect op de uitkomst.

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Op dinsdag 22 januari 2002 11:44 schreef Zotty het volgende:

[..]
Gisteren allemaal al geprobeerd. Timing probleem dacht ik in eerste instantie ook aan. Sleep(250) geprobeerd, getch() geprobeerd, allebei geen effect op de uitkomst.
En waar heb je die Sleep(250) precies geplaatst? Volgens mij is de correcte plaats namelijk na de twee writes (0x04 en 0x07), en voor het uitlezen van de status. Als je de sleep als eerste of laatste regel in het while-block zet, dan krijgt je hardware nog steeds niet de kans om het commando uit te voeren voordat je de status opvraagt.

Motor-forum.nl


Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 15:19 schreef Bananeman2002 het volgende:
En waar heb je die Sleep(250) precies geplaatst?
Tussen elk commando in de lus, met verschillende waarden(van 20 t/m 500) voor sleep.

Verwijderd

Topicstarter
Het probleem zit hem in de computer zelf en niet in de controller. Aan de controller een scoop gehangen en op die manier gecontroleerd. De controller werkt volledig naar behoren en zet de status netjes op de paralelle poort. Het probleem zit hem dus in de computer. Misschien iets met een input-buffer die iets raars doet met de data?
Pagina: 1