Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[BCB/C++] probleem bij het maken van disco-programma*

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

  • bart0l0meus
  • Registratie: Mei 2006
  • Laatst online: 04-11-2022
Hallo,

Op het moment ben ik bezig met een project om via de pc microcontrollers via de com-poort aan te sturen waar rgb-leds aanhangen die ik vanaf de pc kan besturen.
Nu ben ik bezig met de Gui en de echte-software, dus nog niet met het aansturen van de Com-poort.
De software wordt geprogrammeers in C++.
De Code ziet er als volgt uit:
code:
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
void __fastcall TForm1::EditDec1Click(TObject *Sender)
{
  ColorDialog1->Execute();
  Color1 = ColorDialog1->Color;
  Label1->Color = Color1;
  EditDec1->Text = ColorToRGB(Color1);
  Hex1 = Color1;
  EditHex1->Text = IntToHex(Hex1,6);
};
//---------------------------------------------------------------------------

void __fastcall TForm1::EditDec2Click(TObject *Sender)
{
  ColorDialog1->Execute();
  Color2 = ColorDialog1->Color;
  Label2->Color = Color2;
  EditDec2->Text = ColorToRGB(Color2);
  Hex2 = Color2;
  EditHex2->Text = IntToHex(Hex2,6);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::EditDec3Click(TObject *Sender)
{
  ColorDialog1->Execute();
  Color3 = ColorDialog1->Color;
  Label3->Color = Color3;
  EditDec3->Text = ColorToRGB(Color3);
  Hex3 = Color3;
  EditHex3->Text = IntToHex(Hex3,6);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::EditDec4Click(TObject *Sender)
{
  ColorDialog1->Execute();
  Color4 = ColorDialog1->Color;
  Label4->Color = Color4;
  EditDec4->Text = ColorToRGB(Color4);
  Hex4 = Color4;
  EditHex4->Text = IntToHex(Hex4,6);      
}
//---------------------------------------------------------------------------

Als we de kleur Wit hebben is de hexadecimale kleur: FFFFFF en voor Zwart 000000, Groen: 00FF00, Blauw FF0000 en Rood 0000FF.
Nu gaan we de Leds aansturen met PWM en we willen de helderheid (beetje overkill maar daar gaat het niet om) dus van 00 (0%) tot 255/FF (100%) kunnen aansturen.
Hiervoor moeten we dus de hexadecimale code in 3 groepjes van 2 splitsen.
Dus bij de groen meot ik voor: Blauw=00, Groen=255 en Rood=00 ipv 00FF00.
Heeft iemand een idee hoe ik dat zou moeten?
en weet iemand ook hoe ik die waarden aan elkaar kan plakken? zodat ik bij Wit bijvoorbeeld; 255255255 (FFFFFF) krijg?

“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Bitmanipulatie dus?
C++:
1
2
3
4
 unsigned maakKleur(int r, int g, int b)
{
    return r | (g << 8) | (b << 16);
}

In woorden: bitwise-or de bits van r, de bits van g 8 plaatsen naar links geschoven, en de bits van b 16 plaatsen naar links geschoven, bij elkaar.

Niet echt een Software Engineering & Architecture topic trouwens.

[ Voor 7% gewijzigd door .oisyn op 13-11-2007 16:26 ]

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.


  • bart0l0meus
  • Registratie: Mei 2006
  • Laatst online: 04-11-2022
Sorry .oisyn, ik snap het nog niet helemaal.
Ik doe namelijk pas 4 maanden Software Design, dus niet bepaald lang :P
Hoe meot ik die code van jou integreren in mijn code? zou je die er op de juiste manier tussen willen zetten?

“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-11 22:54
Dit heeft niets met software engineering te maken; eerder met programming.
En volgens mij gaat dit ook over Borland C++ Builder ?

>PRG

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-11 22:54
bart0l0meus schreef op dinsdag 13 november 2007 @ 16:35:

Hoe meot ik die code van jou integreren in mijn code? zou je die er op de juiste manier tussen willen zetten?
Nou, dat is ook niet de bedoeling van ons forum .... Mits een beetje inzet moet je toch zien dat de code die .oisyn gepost heeft , een functie is.
Je kan zien wat die functie doet, wat ze returned, en wat ze verwacht qua argumenten; en ik denk ook wel dat je kan zien waar die argumenten voor staan...

[ Voor 6% gewijzigd door whoami op 13-11-2007 16:37 ]

https://fgheysels.github.io/


  • bart0l0meus
  • Registratie: Mei 2006
  • Laatst online: 04-11-2022
Ik dacht dat er een forum was voor iedereen, en niet alleen voor mensen die al weet ik hoeveel ervaring hebben??
We hebben dat wat .oisyn poste nog niet gehad.....

“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-11 22:54
Een forum is voor iedereen, maar, zoals je wel gelezen hebt toen je je registreerde, stellen we hier toch een paar eisen aan de 'vraagsteller'; we verwachten niet dat je alles al weet of dat je veel ervaring hebt.
We verlangen echter wel dat je zelf moeite wil doen om de oplossing te vinden en te snappen; dit forum is geen afhaalbalie voor kant en klare code.

Dat je nog niets gezien hebt over bit-shifting , bit-wise operators, en functies, dat kan ik best begrijpen. Echter, met de code die .oisyn post, en met de sleutelwoorden die hier gepost werden, kan je toch zelf even de moeite doen om een en ander op te zoeken, zodanig dat je zelf te weten komt hoe die code van .oisyn in jouw programma kan passen.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dan pak je de handleiding erbij om te zien wat het precies doet. Het forum is idd voor iedereen, maar het is hier wel de bedoeling dat je zelf ook wat moeite doet.

Maar kijk bijvoorbeeld eens wat je krijgt als je IntToHex(maakKleur(0, 255, 0)) doet.

.edit: whoami was me voor :)

[ Voor 5% gewijzigd door .oisyn op 13-11-2007 16:45 ]

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.


  • bart0l0meus
  • Registratie: Mei 2006
  • Laatst online: 04-11-2022
Oke, ik begin het beetje te snappen.
Maar is << dan niet verkeerd om en moet het dan niet;
code:
1
2
3
4
unsigned maakKleur(int r, int g, int b)
  {
    return r | (g >> 8) | (b >> 16);
  }

Omdat een kleurcode is als volgt is opgebouwd:
code:
1
2
00000000-00000000-00000000
    B         G        R

Dus dan zou Blauw 16 bits naar rechts moeten schuiven ipv naar links, of zie ik dit verkeerd?

“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Juist.

[ Voor 97% gewijzigd door PrisonerOfPain op 13-11-2007 17:23 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

bart0l0meus schreef op dinsdag 13 november 2007 @ 17:17:
Dus dan zou Blauw 16 bits naar rechts moeten schuiven ipv naar links, of zie ik dit verkeerd?
Als je een 1 hebt, en je houdt rekening met hoe wij westerse mensen getallen schrijven, is dat dan hetzelfde als 0000000001 of 100000000? You do the math ;)

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.


  • bart0l0meus
  • Registratie: Mei 2006
  • Laatst online: 04-11-2022
dus het klopt wat ikz eg?
Niet dat ik het al werkend heb, maargoed:/
Ik ben even een klein nieuw projectje begonnen om dat met die kelur oke te krijgen.
Heb op het moment het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ColorDialog1->Execute();
  Color1 = ColorDialog1->Color;
  unsigned Color1(int r, int g, int b)
    {
      return r | (g >> 8) | (b >> 16);
    };

  Edit1->Text = IntToStr(r);
  Edit2->Text = IntToStr(g);
  Edit3->Text = IntToStr(b);
}

zien jullie fouten?

“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Euh nee, juist niet, anders zei ik het niet zoals ik zei :).

Als je een 1 hebt, wat gelijk is aan 000000000001, en je wilt 'm op de plek van de b hebben, welke kant moet je 'm dus opschuiven?

Wat je bedoeling is met die vage functie definitie in een functie definitie snap ik ook niet. Weet je überhaupt hoe je een functie definieert, en deze aanroept?

[ Voor 18% gewijzigd door .oisyn op 13-11-2007 17:43 ]

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.


  • bart0l0meus
  • Registratie: Mei 2006
  • Laatst online: 04-11-2022
Ik denk dat we elkaar nu tegen spreken!:P
Het is op het moment eerst de bedoeling om van een code als 00FF00; B: 00 G: FF R: 00 te maken.
Volgens mij zijn jullie nu aant uitleggen hoe ik van B: 00 + G: FF + R: 00 = 00FF00 kan maken.

“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Euh ja, dan moet je idd de andere kant op schuiven ja :)

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.


  • bart0l0meus
  • Registratie: Mei 2006
  • Laatst online: 04-11-2022
YESYESYES :D
Ik ben er bijna uit!
Alleen nog 1 probleempje, ik heb het als volgt gedaan:
code:
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ColorDialog1->Execute();
  Color1 = ColorDialog1->Color;
  r = Color1 >> 0;
  g = Color1 >> 8;
  b = Color1 >> 16;
  Edit1->Text = IntToStr(r);
  Edit2->Text = IntToStr(g);
  Edit3->Text = IntToStr(b);
}

Alleen is het probleem dat bij puur blauw:
r = 16711680
g = 65280
b = 255
puur groen:
r = 65280
g = 255
b = 0
puur rood:
r = 255
g = 0
b = 0
Hoe fix ik dit?

“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)


  • blackangel
  • Registratie: April 2002
  • Laatst online: 27-11 13:21
Nou, wat je uiteindelijk (bij puur groen) hebt, is 0x00FF00. Wanneer je dus color1 >> 0 doet, pak je dus 0x00FF00. Dit is dan 65280. Wat je eigenlijk wil, is alles voor die laatste twee 0tjes afkappen. Daarvoor kun je het beste een bitwise and gebruiken. And betekend: als alle ingangen waar (1) zijn, is de uitgang ook waar. Anders 0. Door alleen het getal wat je wil uitlezen op 1111 te zetten, en de rest aan te vullen met 0'tjes, lees je het correcte uit.

Een voorbeeldje, aangezien mijn woordelijke uitleg nooit zo goed is ;) :

Stel dat je de eerste 4 bit wilt hebben van een char, dan pak je dus
a = (b >> 4) & 0x0F.

Stel dat b 0xAB is (0x10101011b)
10101011 >> 4 = 00001010

00001010
00001111 &
--------------
00001010


Ofcourse, jij moet niet overal de eerste 4 bit hebben, maar als je bovenstaande snapt moet dat verder wel lukken :)

[ Voor 19% gewijzigd door blackangel op 13-11-2007 18:23 ]


  • writser
  • Registratie: Mei 2000
  • Laatst online: 28-11 15:44
Alleen is het probleem dat bij puur blauw:
r = 16711680
g = 65280
b = 255
Dat komt omdat de representatie van blauw is: 0xFF0000. Dat stop je in de variabele rood zonder bits op te schuiven. Dan komt er gewoon het getal 0xFF0000 in, wat gelijk is aan 16.711.680. Je stopt het in groen waarbij je 8 bits opschuift. Je krijgt dan 0x00FF00, oftewel 65280. En voor blauw schuif je het 16 bits op. Dan krijg je 0x0000FF, wat 255 is en dus wel goed.

Je lost dit op door bitmasks te gebruiken. Voor rood wil je alleen de achterste acht bits gebruiken. Dat doe je zo:

C++:
1
2
 
r = (Color1 & 0x0000FF) >> 0;


Voor groen wil je juist alleen de 8 bits daarvoor gebruiken:

C++:
1
2
 
g = (Color1 & 0x00FF00) >> 8;


Ongetwijfeld heb ik ergens een bitje verkeerd staan (ik ben meer theoreticus), maar dat zal oisyn waarschijnlijk wel verbeteren :)

[ Voor 7% gewijzigd door writser op 13-11-2007 18:36 ]

Onvoorstelbaar!


  • bart0l0meus
  • Registratie: Mei 2006
  • Laatst online: 04-11-2022
writser, je bent fantastisch :D het klopt :P
Allemaal bedankt, nu kan ik weer verder :)

“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)


  • bart0l0meus
  • Registratie: Mei 2006
  • Laatst online: 04-11-2022
Ik krijg alleen nog de volgende fout;
Ik zou alleen absoluut niet weten wat hier fout aan is :S
1. [C++ Warning] Color.cpp(26): W8018 Assigning int to TColor
2. [C++ Warning] Color.cpp(27): W8006 Initializing TColor with int
De fouten verwijzen naar:
1. Label1->Color = Color1;
2. EditDec1->Text = ColorToRGB(Color1);
Iemand een idee? heb het idee dat een kleurcode geen Int is? is dat zo? het werkt wel!

“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)


  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Zelf al gezocht naar die meldingen?
1: Google
2: Ook Google

Overigens hoef je je topic niet te kicken door te replien, je kan ook je vorige post editen ;) (zie policy)

Ey!! Macarena \o/


Verwijderd

Die melding krijg je omdat Borland's TColor een unsigned / DWord is, en een int is signed. Bij een signed integer bepaalt het hoogste bit of 't getal positief of negatief is (0/1), en een unsigned is altijd positief.
Dat 't bij jou wel werkt komt omdat je het alpha byte niet gebruikt (de hoogste byte in een TColor), die blijft dus altijd 0x00, en je resultaat is dus altijd positief.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op dinsdag 13 november 2007 @ 21:06:
Dat 't bij jou wel werkt komt omdat je het alpha byte niet gebruikt (de hoogste byte in een TColor)
Als ie die byte wel zou gebruiken dan werkt het nog steeds. Het maakt namelijk helemaal niet uit wat voor getal het representeert - niemand is namelijk geïnteresseerd in dat getal, alleen maar in de bits. Dus of je de kleur nou opslaat in een int, een unsigned int of een float, het werkt (met de uitzondering dat je een float natuurlijk niet kunt bitshiften)

Waar je overigens wel op moet letten is dat je de bitwise and na de shift doet, zeker als je naar rechts shift, omdat de sign bit mogelijk gereplicate wordt over de vrijgekomen posities. In de praktijk gebeurt dit alleen voor signed ints, maar de standaard zegt er niets over en het kan dus net zo goed voor unsigned ints gebeuren.

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.


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-11 22:54
bart0l0meus schreef op dinsdag 13 november 2007 @ 18:46:
Ik krijg alleen nog de volgende fout;
Ik zou alleen absoluut niet weten wat hier fout aan is :S
1. [C++ Warning] Color.cpp(26): W8018 Assigning int to TColor
2. [C++ Warning] Color.cpp(27): W8006 Initializing TColor with int
De fouten verwijzen naar:
1. Label1->Color = Color1;
2. EditDec1->Text = ColorToRGB(Color1);
Iemand een idee? heb het idee dat een kleurcode geen Int is? is dat zo? het werkt wel!
Mja, het is niet de bedoeling dat we het topic op deze manier verderzetten.
Als je compiler error krijgt, dan kan je toch eerst eens even die errors begrijpend lezen, en evt eens opzoeken wat ze precies betekenen.
Blijkbaar is bij jou Color1 van het type int, en wijs je die variable dus toe aan een property die een type TColor verwacht.
Hetzelfde met ColorToRgb; die laatste method zal ook een TColor verwachten, en geen int.

https://fgheysels.github.io/

Pagina: 1