Kombinace a zpětné zjištění – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kombinace a zpětné zjištění – C / C++ – Fórum – Programujte.comKombinace a zpětné zjištění – C / C++ – Fórum – Programujte.com

 

TomyB
~ Anonymní uživatel
57 příspěvků
12. 1. 2019   #1
-
0
-

Možná se ptám hloupě, ale dostávám identifikátor v podobě hexa, který identifikuje jaké indikační ikony jsou právě zobrazeny

Zjednoduším to

Ikona A předtavuje 0x1
Ikona B předtavuje 0x2
Ikona C předtavuje 0x8
Ikona D předtavuje 0x10
Ikona E předtavuje 0x30
atd

pokud je zobrazeno více ikon obdržíme součet jejich hexa čísel, tedy pokud je zobrazeno
A, E obdržím 0x31
A, B, C, D obdržím 0x1B
C, D, E obdržím 0x48
atd.


Snažím se zpětně zeptat, zda je daná ikona právě aktivní, tzn obdržím např. 0x48 a potřebuji vědět, zda ikona C tj. 0x8 je právě zobrazena.
Protože kombinací bez opakování je fakt hodně, tak mi přijde ptát se podmínkou trošku nepraktické.
Netušil by někdo jak by se to dalo ošetrit nejakou funkci a zjistit zda je ikona aktivní?

Díky za jakokolic radu jak se k tomu dopracovat


 

Nahlásit jako SPAM
IP: 94.112.168.–
TomyB
~ Anonymní uživatel
57 příspěvků
12. 1. 2019   #2
-
0
-

#1 TomyB
Napadlo mě toto, vypadá, že by to mohlo funovat
 

bool IsIconActive(int icon, int grp) {
	byte indicators[]={0x01, 0x02, 0x08, 0x10, 0x30};

	int total;
	for (int i=0; i<sizeof(indicators);i++){
		total += int((unsigned char)indicators[i]);
	}

	int a = grp - icon;

	for (int i=sizeof(indicators)-1; i>=0;i--){
		int indi = int((unsigned char)indicators[i]);

		if (indi<=a) {
			a -=  indi;
		}
		if (a==0) {
			return TRUE;
		}
	}
	return FALSE;
}
Nahlásit jako SPAM
IP: 94.112.168.–
TomyB
~ Anonymní uživatel
57 příspěvků
12. 1. 2019   #3
-
0
-

#2 TomyB
Ten výpočet totalu je tam navíc, není potřeba :-)

Nahlásit jako SPAM
IP: 94.112.168.–
gna
~ Anonymní uživatel
1849 příspěvků
12. 1. 2019   #4
-
0
-

Koukám do toho 5 minut a nějak mi uniká ten myšlenkový pochod. Piš věci debilně, tak je pochopíš i zítra.

bool IsIconActive(int icon, int grp)
{
	int indicators[]={0x01, 0x02, 0x08, 0x10, 0x30};
	bool isset[]={false, false, false, false, false};

	for (int i = 5; i >= 0; i--) {
		int ind = indicators[i];
		if (grp >= ind) {
			grp -= ind;
			isset[i] = true;
		}
	}

	return isset[icon];
}
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1849 příspěvků
12. 1. 2019   #5
-
0
-

Tu 5 mám samozřejmě blbě :D

Nahlásit jako SPAM
IP: 213.211.51.–
TomyB
~ Anonymní uživatel
57 příspěvků
12. 1. 2019   #6
-
0
-

#4 gna
#5 gna
ok, zkousim ten tvuj kod, ale ten mi jaksi nejde

IsIconActive(0x30, 0x48);

grupa 0x48 se skládá z ikon (0x8 , 0x10 a 0x30)

a testuji zda je v grupě ikona 0x30

výsledkem v tvem kodu jsou všechny false, ačkoli u té poslední by se očekávalo true

Nahlásit jako SPAM
IP: 94.112.168.–
gna
~ Anonymní uživatel
1849 příspěvků
12. 1. 2019   #7
-
0
-

Ahá. No, ta moje funkce předpokládá icon jako 0 až 4 a asi není tak čitelná, jak jsem si myslel ;)

Nahlásit jako SPAM
IP: 213.211.51.–
TomyB
~ Anonymní uživatel
57 příspěvků
12. 1. 2019   #8
-
0
-

#7 gna
Perfektní, funguje to dokonale, upravil jsem si, rptože na vstupu mam hexa toho indikatoru, ne jeho poradove cislo.

bool IsIconActive(int icon, int grp)
{
	int indicators[]={0x01, 0x02, 0x08, 0x10, 0x30};
	bool isset[]={false, false, false, false, false};
	int iconpos;

	for (int i = (sizeof(indicators)/sizeof(*indicators)); i >= 0; i--) {
		if (icon == indicators[i])
			iconpos = i;
		int ind = indicators[i];
		if (grp >= ind) {
			grp -= ind;
			isset[i] = true;
		}
	}

	return isset[iconpos];
}


Díky moc

Nahlásit jako SPAM
IP: 94.112.168.–
Radek Chalupa
~ Redaktor
+1
Super člen
13. 1. 2019   #9
-
0
-

no nevím, ale neměla by tak "ikona" být 0x20, resp. tak aby ty hodnoty byly bitové příznaky (čísla s právě jednou 1 v binárním tvaru, resp. mocniny 2)?. Pak by se celý problém a kód radikálně zjednodušil na bitové operace, jako if (indikator & 0x20) ....

Nahlásit jako SPAM
IP: 213.220.218.–
TomyB
~ Anonymní uživatel
57 příspěvků
13. 1. 2019   #10
-
0
-

#9 Radek Chalupa
měla, ale je tam nějaká výjimka, resp nastavil jsem si

int indicators[]={0x01, 0x02, 0x08, 0x10, 0x20, 0x30};

fakt je, že u ikon 0x10 a 0x20 může být zobrazena jen pouze jedna z nich, nemuzou svitit obe. Zbytek libovolne. Protože kdyby svítili obě, dostal bych 0x30, coz je uplne jina ikona.

A s tímto nastavením se mi to detekuje správně. Otestoval jsem všechny varianty, a je to ok.

Díky

Nahlásit jako SPAM
IP: 94.112.168.–
Radek Chalupa
~ Redaktor
+1
Super člen
13. 1. 2019   #11
-
0
-

#10 TomyB
no právě; pokud budou VŠECHNY indikátory "jednobitové" flagy, nestane se že součtem libovolné kombinace dostaneš příznak jiné ikony.

takže si ty příznaky nastav jako 0b1, 0c10, 0b100, 0b1000 atd. a vše se zjednoduší:-)

Nahlásit jako SPAM
IP: 213.220.218.–
Radek Chalupa
~ Redaktor
+1
Super člen
13. 1. 2019   #12
-
0
-

#10 TomyB
PS: tady je ukázka včetně testovacího příkladu, jak vidíš podstatně jednodušší ..

#include <stdlib.h>
#include <stdio.h>

bool je_aktivni(int poradi_ikony, unsigned int identifikator)
{
	return (identifikator & 1<<(poradi_ikony-1)) != 0;
}

int main(int argc, char* *argv)
{
	 // nastavím 2. 3. a 7. jako aktivní
	unsigned int test = 0b10 + 0b100 + 0b1000000;
	for (int i = 1; i < 8 /*max pocet ikon*/; i++)
	{
		if (je_aktivni(i, test))
			printf("%d. je aktivní\n", i);
	}
	getchar();
	return 0;
}
Nahlásit jako SPAM
IP: 213.220.218.–
TomyB
~ Anonymní uživatel
57 příspěvků
13. 1. 2019   #13
-
0
-

#12 Radek Chalupa
Díky, takhle by se mi to libilo, je to elegantni, ale ja tu hodnotu, kterou obdržím nemůžu ovlivnit, vytváří ji jiná aplikace a zapisuje do sdílené paměti. Musim si poradit z toho co mam.

Připojen obrázek.

Nahlásit jako SPAM
IP: 94.112.168.–
Radek Chalupa
~ Redaktor
+1
Super člen
13. 1. 2019   #14
-
0
-

#13 TomyB
chceš tím říct že ten indikátor (takhle blbě) generuje aplikace "třetí strany", ke které nemáš přístup, resp. zdrojový kód?

v tom případě jediná rada: nakopat autora té aplikace do prd....

Nahlásit jako SPAM
IP: 213.220.218.–
TomyB
~ Anonymní uživatel
57 příspěvků
13. 1. 2019   #15
-
0
-

#14 Radek Chalupa
je to tak, mám stejný názor

Nahlásit jako SPAM
IP: 94.112.168.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý