Nazdárek, pár dotazů (možná i hloupých):
1.) Chtěl bych se zeptat, proč mi nejde uložit operator+ do ukazatele na funkci. Vím, že je masivně přetížený, ale jak mám tedy specifikovat, kterou fci operator+ chci uložit? Nešlo to jak s intem, tak s vlastní třídou s přetypovaným +. Debuger, hlásí cosi o šablonách.
2.) Mám se učit Win32Api, které je pouze pro 32-bitové systémy. Slyšel jsem, že ho dnes již téměř nikdo nepoužívá, jak se jmenuje nové api a kde se ho mám naučit? Funguje i na 32-bitových systémech?
3.) Chtěl bych udělat jeden program pro Win (příp. independet), který se spustí při startu konkrétního jiného programu. Tuším, že budu muset udělat malý zavaděč, který se spustí při startu systému a který bude nějak kontrolovat, zda inkriminovaný (zmíněný) program startuje. Potom budu potřebovat z toho hlavního programu spuštěného zavaděčem zjistit, zda okno hlídaného programu je aktivní či nikoli. Jak na to (s ohledem na výše zmíněný problém ani nevím v jakém api)?
Chtěl bych totiž naprogramovat plánovač projektů v wx-DevC++, kde by si člověk stanovil, kolik času hodlá obětovat určitému projektu a on by mu to pak odpočítával, když by ho měl otevřený. Jestli nějaký takový program znáte, třeba i lepší, klidně se zmiňte.
Každá rada dobrá, díky za jakékoli užitečné informace.
Fórum › C / C++
C++: Funcion pointer, Api for Win - poraďte
ad 1) Operator jsou obycejne funkce, takze problem bych v tom nevidel(akorat netusim k cemu jeto dobre):
#include <iostream>
struct A
{
int num;
A(int n=0)
:num(n){};
A operator+(const A& other) const
{ return A(num+other.num);}
};
A operator+(const A& a, const A& b)
{ return A(a.num+b.num);
}
typedef A(*TPlus)(const A&, const A& );
typedef A(A::*TMemPtr)(const A&)const; // poyor na const
int main()
{
TPlus plus = &operator+;
A a1(10), a2(5);
TMemPtr mem = &A::operator+;
std::cout << plus(a1,a2).num << std::endl;
a1.num = 20 ; a2.num = 25;
std::cout << (a1.*mem)(a2).num << std::endl; // pozor na zavorky
return 0;
}
ad 2) Nesouhlasim. Klidne bych se na WinAPI podival(a nekdy se i opravdu divam), ale radeji davam prednost wxWidgets(nebo jakoukoliv jinou GUI knihovnu).
ad 3) No, podle meho by mozna slo vyuzit hakovani, popr. udelat nejaky program ktery pojede na pozadi a bude hledat treba pomoci FindWindow okno toho programu v urcitych casovych intervalech, ale bohuzel nevim jestli se to taktoda realizovat - nemam cas to tedkom hledat a mozna to bude dost neefektivni.
ad 3)Neviem ci som ta pochopil ale mozno by si to mal lahsie ak by si spravil nejaky maly spustac, ktory by iba pustil novy proces a ulozil by si cas spustenia a po uplinuti casu by ten novy proces zabil/dal moznost zabit. Ale musel by si pustat dany program vzdy cez tento spustac...
WinAPI nepoznam ale pokial viem ponuka funkcie pre multiprocessing.
To Huge:
2) Win API mrtvé není a používá se. Ale osobně se mi zdá lepší SDL, které je lehčí na práci a zahrnuje jen to nejpotřebnější (samozřejmě že další a další f-cemi disponují knihovny ke stáhnutí na oficiálním webu).
mozes vytvorit script/program ktorym spustis toho tvojho spiona a nasledne aplikaciu po ukonceni aplikacie skonci aj spion (samozrejmo az po tom co zhromazdi udaje a spise protokol).
Díky za odpovědi,
1. Prošel jsem si ten kód a už to asi chápu. Jenom s tím
typedef A(*TPlus)(const A&, const A& );
jsem se ještě nesetkal. Je to trošku matoucí, TPlus totiž vypadá jako deklarace ukazatele na fci, ale ve skutečnosti je to jen zavedení nového typu. K čemu to je? Například chcete generovat pseudonáhodná čísla, ale rand() dělá jen čísla >= 0. Chcete-li náhoné znaménko, máte 2 možnosti:
int cislo = rand() * ((rand % 2) * 2 - 1); // První možnost.
// Nebo si vytvoříte pole ukazatelů na unární fce operator- a operator+ a pak takto:
cislo = znamenko[rand() % 2] rand(); // Efektivnější kód. Efektivita je důležitá!
Našla by se i další využití.
2. Názory dobré, ale co takhle odpovědět na otázku? Je Win32Api jen pro 32-bitové Windows? A jaké GUI používají Windows Vista a další plánované?
3. Není to žádný špion, ale plánovač práce. Šlo by to tedy řešit tak, že bude "špion" asociovaný se sledovanými soubory (.dev) a potom sám spustí wx-DevC++ko s tímto souborem a bude hlídat, jestli běží a jestli je jeho okno aktivní. Ale jak na to?
To Huge:
Nechápu, co je na typedef matoucího? Pokud s tím máš problém, tak si klidně před každou proměnnou nadl¨klaruj její typ, ale garantuji ti, že u 2. deklarace nasekáš spoustu chyb.
No, dělat na znaménka pole funkcí je trochu brutální, navíc píšeš něco o efektivitě, ale neuvědomuješ si, že druhá možnost bude daleko horší než první - musi se volat další funkce navíc.
int num = rand() % 10+15; // nebo jaky chces interval
if(rand() % 2) num = -num;
Ano, volá - jednou pro číslo a podruhé pro znaménko. Ale já mluvil o volání přetížených operátorů - to jsou taky jen funkce, které si Huge uložil do pole. Tvůj příklad jsem nepobral - ty losuješ čísla intervalu <0; RAND_MAX), takže neurčíš nijak jeho zaménko.
no ja som si to (aby som nepisal nejaku blbost) skusil na priklade:
#include <stdlib.h>
int main(){
char s_random = 0;
unsigned char u_random = 0;
printf("rand_max == %u\n", RAND_MAX);
srand((unsigned int)time(NULL));
s_random = u_random = rand();
printf("%d\n%d\n", s_random, u_random);
if(s_random < 0){
printf("zaporne\n");
}
return 0;
}
a vsetko facha.
To Jura: no teraz vazne neviem ci si robis srandu, alebo tu nekto druhy vystupuje pod cudzim nickom.
vo svojom druhom prispevku som nacrtol sposob fungovania. s tvojej reakcie na moj kod som usudil ze si ho asi nepochopil (ci bol problem v mojom vyklade alebo na tvojej strane riesit nechcem) tak som ho rozpisal obsirnejsie. samotny kod nema za ucel sluzit ako super-duper flexibilny modul ale stale iba ako demonstracia principu, naco snad bohate staci. velkost premennych pri tejto demonstracii samozrejme nehra ulohu.
btw.: nabuduce si podobne vyryvanie prosim odpusti. ok?
To olgo:
Řešíme tu to, že jedním voláním rand() nelze ziskat zápornou hodnotu??
Sorry, ale mi jde o to, že rand() implicitně losuje z intervalu <0, RAND_MAX). Čili nemůžeš z rand(), aniž bys ztratil vylosovanou hodnotu, dostat záporné číslo. Tobě se to ale povedlo, tím že jsi výsledek rand() nacpal do char, díky tomu došlo k přetypování int na char(přeteklo to) a výsledek je úplně jiné číslo(které uživatel třeba ani nechtěl).
>>btw.: nabuduce si podobne vyryvanie prosim odpusti. ok?
Sorry, ale nebylo to myšleno škodolibě. Takže ještě jednou se omlouvám.
ono je kludne mozne pouzit akykolvek ini celociselny typ (kludne aj int a unsigned int kde nic nepretecie a nic sa nestrati) ja som ale minimalistickej povahy takze mi kludne staci jeden byte.
a výsledek je úplně jiné číslo(které uživatel třeba ani nechtěl).
to cislo bude ale iba orezane a teda na svojej nahodnosti nic nestrati.
ad 2) WinAPI "pouze" poskytuje prostředky pro programování ve windows. Tzn. pokud chceš aby se tvá aplikace chovala a vypadala "win" (editBoxy, tlačítka, apod) použiješ WinAPI. 32b systémy a 64b se podle mě liší jen rychlostí, takže API by mělo být stejné.
Viz. MSDN
The Windows API can be used in all Windows-based applications. The same functions are generally supported on 32-bit and 64-bit Windows.
Ohledně záporného náhodného čísla) dá se to obejít
int i;
i = rand(4) - 10;
To olgo:
Aha, no já měl na mysli, že se tím přetypování snažíš dokázat, že JEDNÍM voláním rand() (bez dalších výpočtů intervalu) lze získat zápornou hodnotu.
To tucna:
No, mělo by to být spíše takto:
int i;
i = rand()%4 - 10;
Ale to není podstatné, já jsem totiž řešil asi úplně něco jiného, než se Olgo snažil demonstrovat.
to Jura: jj mělo, sry za překlep
to Olgo: toto jsem nepochopil
to cislo bude ale iba orezane a teda na svojej nahodnosti nic nestrati
...tím myslíš že to číslo sice bude úplně jiné než jsme chtěli ale za to bude taky náhodné takže je vše OK??
Olgo můžu vědět kolik je ti let?
Teď už ti dva lidé tady píšou že říkáš blbiny a ty místo toho aby jsi to přiznal (popř. promyslel) dále hloupě argumentuješ. Juro ti psal hned zkraje že ten tvůj zdroják výš je blbost (pokud nechápeš proč, nauč se první programovat (tím myslím PROGRAMOVAT ne rozumět syntaxi)).
Podle mě jsi Pascalista který se naučil syntax c a cítí se jako nějvětší borec, který si nenechá poradit.
To tucna: ja si necham poradit a netvarim sa ako borec lebo nim proste niesom ale ovela viac oko osocovanie by som uvital fakty.
ak je to ako hovoris blbina nerobi mi problem to uznat ale tim ze sem proste len napises ze JE TO BLBINA ma nepresvecis
To olgo: Doporučuji ti znova přečíst celé téma. Sám ti píšu o pár příspěvků výš že je tvůj "postup" špatný. Záporné číslo se negeneruje tímto způsobem, ale to už se opisuju...Pročti si co říká Juro a já a zamysli se nad tím.
Ono je totiž normální říct "Jo vymyslel jsem špatný postup, máš pravdu tvým způsobem by to fungovalo líp"
Ale ty píšeš "Nenene, to měla být jen ukázka" - v ukázce jde totiž především o naznačené řešení
Už je kvůli tohoto
rand() = Returns a pseudo-random integral number in the range 0 to RAND_MAX.
...by tě mohlo napadnout že se to dělá jinak. A když ti někdo navrhne jak na to, a ty odpovíš že "to děláš dobře, to číslo náhodné bude, jen bude trochu jiné", tak sry ale to už je trochu moc ne?
To tucna: no nechcem sa s tebou hadat celkovo tu boli navrhnute postupi tusim od styroch ludi pricom ten tvoj bol asi najlepsi zato moj dovolim si tvrdit najrychlejsi aj ked uznavam za urcitych okolnosti nepouzitelny.
ad nahodne zaporne cisla: uz len s tohto vlakna je vidiet ze si to kazdy robi po svojom a hovorit teda o tom "akym sposobom sa generuje zaporne nahodne cislo" je trochu ...
ad ukazka: ona totiz funguje. a vygeruje nahodne znamienkove cislo. za tie jednobytove typy si mozes dosadit akekolvek ine celociselne typy a bude to fungovat (okrem pripadu ked RAND_MAX nebude rovnaky alebo vecsi ako rozsah datoveho typu)
A když ti někdo navrhne jak na to, a ty odpovíš že "to děláš dobře, to číslo náhodné bude, jen bude trochu jiné", tak sry ale to už je trochu moc ne?
nie som si isti ci vies co sa v danej chvily stane a ked ano tak som asi ozaj blbi lebo stale nechapem co ti na tom vadi
#include <stdlib.h>
int main(){
short int random;
srand((unsigned int)time(NULL));
random = rand();
random%=6;
printf("%d\n", random);
return 0;
}
gcc 3.4.6
inak tu je vypis:
bash-3.1# ./rand5
1
bash-3.1# ./rand5
-3
bash-3.1# ./rand5
-3
bash-3.1# ./rand5
5
bash-3.1# ./rand5
5
bash-3.1# ./rand5
-5
bash-3.1# ./rand5
-5
bash-3.1# ./rand5
2
bash-3.1# ./rand5
2
bash-3.1# ./rand5
-5
bash-3.1# ./rand5
-1
bash-3.1# ./rand5
-5
- inicializacia
- vygenerovanie neznamienkoveho nahodneho cisla
- priradenie do znamienkoveho typu (cisla vecsie ako polovica sa perevedu na zaporne preto je nutne aby RAND_MAX pokryval cely rozsah typu)
- ziskanie zvysku
co je za problem ide ti to ci nie?
A naco to robite tak komplikovane ? ved staci rand()%(2*x) - x a mate cisla z mnoziny {-x,...,x}. Taktiez vacsi mozny rozsach x kedze to nepchame do 16bit(short) ale do 32(int)
Mna by skor zaujimalo da sa urobit algoritmus bez podmienok co by generoval cisla z mnoziny {-x,...,-y} U {x,...,y}, kde x, y su z N ?
To k: termin kompikovane je dost relativni. pre stroj je to o dost jednoduhsie.
Taktiez vacsi mozny rozsach x kedze to nepchame do 16bit(short) ale do 32(int)
to robis naschval?
ja mam RAND_MAX 2 147 483 647 kad dobre pocitam tak je to 2^31-1 a je to teda pre mna nepouzitelne (bez jeho zmeny samozrejme)
btw.: uz ste niekto pisal program co by potreboval tak velky rozsah nahodnych cisel?
To tucna: Ja som si to cele precital a vy tu neriesite vlastne nic :). Riesilo sa tu zo zaciatku ako jednym volanim rand() ziskat nahodne znamienkove cisla z danej mnoziny (TO NIE SU INTERVALY!!!!!! :) ), vlastne ten poziadavok na mnozinu tam ani nebol, to len dakdo spomenul ze povodnym olgovym kodom sa to neda. Co bolo vyriesene, uz dost vyssie, a od vtedy sa hadate uplne o nicom :)
To olgo: To som si akosi neuvedomil, sorry mas pravdu :). A pre stroj su jednoduche obidva, len pre cloveka je jednocduchise pochopit bez pretekania :)
To olgo:
Hmm, tak já mám na svém překladači jinou hodnotu RAND_MAX, nejmenší možnou:). To by možná ysvětlovalo, proč se dostaneš na záporná čísla.
Pokud se nemýlím, tak v kryptografii se používají i delší a pokud se pletu, tak mě někdo jistě opraví.
to k: no neřekl bych že neřešíme nic. Snažíme se olgovi říct že generovat nah. čísla způsobem který popsal je fakt blbost :)
RAND_MAX je definovaná v <cstdlib> a standartně je rovna 32767. Takže taky koukám :)
Kryptografie - o délce použitého klíče většinou vypovídá údaj přímo v názvu. Např "128b RSA"
To olgo:
Aha, už jsem asi pochopil na co spoléháš-že rozsah RAND_MAX je vždy větší než je rozsah typu cílové proměnné, je to tak správně?
To k:
Mna by skor zaujimalo da sa urobit algoritmus bez podmienok co by generoval cisla z mnoziny {-x,...,-y} U {x,...,y}, kde x, y su z N ?
Tohle asi bez podmínek nepůjde..
To Jura:
To by možná ysvětlovalo, proč se dostaneš na záporná čísla.
sice neviem cim som si vysluzil nalepku debil ale skus to brat tak ze to neni nahodni ukaz ale cieleny vysledok
To olgo:
Nikdo z tebe debila nedělá. Kromě toho teď nevím na co nárážíš. Já mám na svém překladči nejmenší možný RAND_MAX(podobně jako tucna), který je shodou okolností roven SHRT_MAX, tím pádem nikdy, samozřejmě pokud nezměním typ cílové proměnné na menší, nemůžu dostat zápornou hodnotu.
Olgo: nikdo netrdí že jsi debil. Tvé řešení je jen zárážející (a tvé lpění na něm též :) - to co jsi udělal prostě není algoritmizování problému, tvé řešení funguje v jazyce x s překladačem y. Ale na jiném jazyce a celkově v jiných podmínkách fungovat nemusí!
To tucna: mas pravdu len by som to poopravil na urcitych platformach a v jazykoch dost nizkych na to aby do toho prekladace moc nekecali a dost benevolentnych na to aby bol vysledny kod dielom programatora a nie prekladaca.
To tucna:A kde je ta konstanta definovana ? V libc. A libc je sucastou coho ? Pomozem ti citataom z stranky gcc:
The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages.
Preto sem pchame kompilery...
To tucna:
Asi jsem to blbě napsal, spíše by se hodilo ve svém protředí(vč. hl. souborů, atd.),ale i to je sporné - navíc sem to dával do souvisloti se shortem a ten je závislý na překladači, paltformě,atd. To proto, že sem zdůvodňoval, proč mi nevylosuje Olgův příklad zápornou hodnotu. Toť vše. Už nemám sílu se tu moc dohadovat.
Ano? A skusal si ju menit? Asi nie, ze. Lebo inak by sa to nepovedal. Ta hodnota, RAND_MAX, je natvrdo zakodovana v zdrojaku funkcie rand() to co je v *.h ma "len" informativnu hodnotu a rand() na nu z vysoka dlabe, ona sa riadi tym co jej bolo dane pri kompilacii.
btw. v glibc je definovana takto:
/* The largest number rand will return (same as INT_MAX). */
#define RAND_MAX 2147483647
a ako chces dostat zmenenu hodnotu makra do skompilovanej kniznice bez toho aby si ju rekompiloval?
Ty si ma vobec nepochopil... Ja si mozem nastavit v stdlib.h RAND_MAX aj na -50 ak chcem, no rand() sa na to vyserie. Ja som hovoril o tom, ze rand() bude nadalej vracat hodnoty z {0,...,povodny_rand_max}. RNAD_MAX, moze mat kazdy iny s tym suhlasim, zavisy to na implemetacii standartnej c kniznice. A ten co to implementoval napisal rand() tak aby vracala take a take hodnoty, a to co je v stdlib.h bolo pouzite _LEN A LEN PRI KOMPILACII TEJ KNIZNICE_. Skompilovany rand() ti absolutne dalbe na to co je v stdlib.h ak ja si prepisem RAND_MAX na 5, tak mi bude rand() vracat aj tak cislo z {0,...,2^31} (2^31 na mojom systeme). Uz si to pochopil ? Na kery kkt si ja budem menit konstanty ked nebudu mat vobec ale vobec ziadny efekt az na to ze printf-nem nieco ine ?
S prepacenim tu teraz ty potis blaboly, sam si tu volakoho kritizoval ze nedokaze priznat chybu, mal by si sa zamyslet teraz pre zmenu nad sebou.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Win 32 API — založil radvis
Win 32 api Dialogy — založil whysper
WIN API WM_PAINT — založil unk
Psaní Win API — založil matesz
Moderátoři diskuze