- CPU léghűtés kibeszélő
- Iszonyatos mennyiségű hulladékkal járhat a Windows 10 terméktámogatásának vége
- Mégsem búcsúznak a DDR4-es memóriák
- Apple MacBook
- Bluetooth hangszórók
- Nagyon érzékeny lett a játékok archiválására a Nintendo
- NVIDIA GeForce RTX 4060 / 4070 S/Ti/TiS (AD104/103)
- Milyen billentyűzetet vegyek?
- Milyen cserélhető objektíves gépet?
- Elképesztően drága az új Ryzen Threadripper PRO generáció
Új hozzászólás Aktív témák
-
Dánkas
csendes újonc
Kitöltenétek? Az első kérdés nem hiba, inkább olyan "beugratós".
-
jattila48
aktív tag
válasz
Tomi_78 #4394 üzenetére
"WM_CREATE-ből átraktam a program tetejére a változók létrehozását, illetve a képernyőméret lekérdezést az ablak létrehozása elé."
Nem ezen múlik a dolog. Az ablakkezelő WM_CREATE ágát a CreateWindow fc. hívja meg. A legtöbb inicializálás (ablakhoz kapcsolódó, főablak esetén ptogramhoz kapcsolódó is) itt szokott megtörténni. Az itt létrehozott objektumokat (handle-kat, stb.) a WM_DESTROY ágban (amit a WM_CLOSE ágban kiadott DestroyWindow fv. fog meghívni) kell lebontani, lezárni.
Az, hogy az ablaknak van-e címsora, vagy méretezhető-e, a CreateWindow (vagy CreateWindowEx) fv. dwStyle (és dwExStyle) flag paramétereivel kell megadni, vagy esetleg az ablakosztály megfelelő stílusát (WNDCLASSEX típusú struktúra style tagja) kell beállítani, mielőtt a RegisterClassEx fv.-t meghívod. -
jattila48
aktív tag
válasz
Tomi_78 #4392 üzenetére
A GetWindowRect bool típussal tér vissza. Mit akarsz abból kiszedni? Azt csak ellenőrizni kell, hogy sikerült-e a fv. hívás. A RECT típusú 'kijelzo' változóban (struktúrában) vannak a keresett értékek:
ablakszel=kijelzo.right-kijelzo.left;
ablakmag=kijelzo.bottom-kijelzo.top;Bizonyos esetekben a left és top tagok negatívak is lehetnek (a drop shadow miatt?), de itt ez nem fordul elő.
-
jattila48
aktív tag
válasz
DrojDtroll #4391 üzenetére
Amit a GetDesktopWindow visszaad, az csak egy window handle, nem struktúra pointer. Próbálkozz a
HWND kijelzo=GetDesktopWindow();
RECT rect;
GetWindowRect(kijelzo,&rect);kóddal.
-
Tomi_78
aktív tag
És még egy kérdésem/gondom van a fejlesztendő programommal kapcsolatban: a címképernyőjén egy olyan animációt szeretnék, hogy a képernyő közepéből jönnek ki a csillagok véletlen irányba, és ez a "csillagkirobbanás" ismétlődne.
Egy ciklussal 22 csillagot hozok létre, de a hatás finoman szólva nem az, amit szeretnék, mert mindig csak 4 irányba mennek a csillagok, nem pedig véletlenszerűen.
Ez a csillagok osztálya:
class Csillag {
public:
Csillag(int xh, int yh) {
xhely = xh;
yhely = yh;
fajta = rand()%2;
szin = rand()%2;
do {
celx = rand()%ablakszel;
} while (celx==xhely);
if (celx < xhely)
xseb = -8;
else xseb = 8;
do {
cely = rand()%ablakmag;
} while (cely==yhely);
if (cely < yhely)
yseb = -8;
else yseb = 8;
};
void kirajzol(HDC grafkez) {
if (fajta == 0) { //Csak egy pont:
if (szin == 0)
SetPixel(grafkez,xhely,yhely,RGB(255,255,255));
else
SetPixel(grafkez,xhely,yhely,RGB(255,255,0));
} else { //+ alakú:
if (szin == 0) {
SetPixel(grafkez,xhely,yhely,RGB(255,255,255)); //Közepe
SetPixel(grafkez,xhely-1,yhely,RGB(255,255,255)); //Közepétől balra
SetPixel(grafkez,xhely+1,yhely,RGB(255,255,255)); //Közepétől jobbra
SetPixel(grafkez,xhely,yhely-1,RGB(255,255,255)); //Közepe fölött
SetPixel(grafkez,xhely,yhely+1,RGB(255,255,255)); //Közepe alatt
}
else {
SetPixel(grafkez,xhely,yhely,RGB(255,255,0)); //Közepe
SetPixel(grafkez,xhely-1,yhely,RGB(255,255,0)); //Közepétől balra
SetPixel(grafkez,xhely+1,yhely,RGB(255,255,0)); //Közepétől jobbra
SetPixel(grafkez,xhely,yhely-1,RGB(255,255,0)); //Közepe fölött
SetPixel(grafkez,xhely,yhely+1,RGB(255,255,0)); //Közepe alatt
};
};
};
int xhely,yhely,celx,cely;
unsigned char fajta,szin;
char xseb,yseb;
bool tulcelxen=false,tulcelyon=false;
};
std::vector<Csillag> csillagok;Ez pedig a kirajzolásuk a WM_PAINT-ben:
for (int cs=0; cs<csillagok.size(); cs++) {
if (csillagok[cs].tulcelxen == false) {
csillagok[cs].xhely += csillagok[cs].xseb;
if ((csillagok[cs].xhely >= csillagok[cs].celx && csillagok[cs].xseb == 8) || (csillagok[cs].xhely <= csillagok[cs].celx && csillagok[cs].xseb == -8))
csillagok[cs].tulcelxen = true;
} else csillagok[cs].xhely += csillagok[cs].xseb;
if (csillagok[cs].tulcelyon == false) {
csillagok[cs].yhely += csillagok[cs].yseb;
if ((csillagok[cs].yhely >= csillagok[cs].cely && csillagok[cs].yseb == 8) || (csillagok[cs].yhely <= csillagok[cs].cely && csillagok[cs].yseb == -8))
csillagok[cs].tulcelyon = true;
} else csillagok[cs].yhely += csillagok[cs].yseb;
if (csillagok[cs].xhely<0 || csillagok[cs].xhely>ablakszel || csillagok[cs].yhely<0 || csillagok[cs].yhely>ablakmag) {
csillagok[cs].xhely = ablakszel/2;
csillagok[cs].yhely = ablakmag/2;
do {
csillagok[cs].celx = rand()%ablakszel;
} while (csillagok[cs].celx == csillagok[cs].xhely);
if (csillagok[cs].celx < csillagok[cs].xhely)
csillagok[cs].xseb = -8;
else csillagok[cs].xseb = 8;
do {
csillagok[cs].cely = rand()%ablakmag;
} while (csillagok[cs].cely == csillagok[cs].yhely);
if (csillagok[cs].cely < csillagok[cs].yhely)
csillagok[cs].yseb = -8;
else csillagok[cs].yseb = 8;
csillagok[cs].tulcelxen = false;
csillagok[cs].tulcelyon = false;
};
csillagok[cs].kirajzol(Memhdc);
};Gyanítom, valami akkor nem lesz jó, mikor a képernyőn kívülre kerülve visszahelyezem őket a közepére, és új célxy koordinátát kapnak véletlenszerűen, de akárhogy nézem, nem látok benne semmi logikai hibát.
-
Tomi_78
aktív tag
válasz
DrojDtroll #4393 üzenetére
Már nagyjából sikerült megoldanom, mégpedig azzal, hogy a WM_CREATE-ből átraktam a program tetejére a változók létrehozását, illetve a képernyőméret lekérdezést az ablak létrehozása elé.
De még valahogy el kéne tüntetnem az ablak tetejéről a címsort vagy letiltani a felhasználó általi átméretezhetőségét.
Ebben tudtok segíteni nekem? -
Tomi_78
aktív tag
válasz
DrojDtroll #4391 üzenetére
Igen, azt is.
És ilyeneket ír ki: error: jump to case label [-fpermissive]
erre:
HWND kepernyo = GetDesktopWindow();
RECT kijelzo;
ablakszel = LOWORD(GetWindowRect ( kepernyo, &kijelzo ));
ablakmag = HIWORD(GetWindowRect ( kepernyo, &kijelzo )); -
Tomi_78
aktív tag
válasz
DrojDtroll #4389 üzenetére
Ezt láttam már, de sajnos nem működik: a WM_RESIZE ágra ír ki valami hibát.
De most próbálkoztam így is:
HWND kijelzo=GetDesktopWindow();
ablakszel=kijelzo.right;
ablakmag=kijelzo.bottom;De ez sem jó: error: request for member 'right' in 'kijelzo', which is of pointer type 'HWND {aka HWND__*}' (maybe you meant to use '->' ?)|
-
DrojDtroll
veterán
válasz
Tomi_78 #4388 üzenetére
windows - How to get screen resolution in C++? - Stack Overflow
Google a barátod. -
Tomi_78
aktív tag
És arra vannak utasítások C++-ban, amivel lekérdezhető a felhasználó monitorának mérete, hogy a program ablaka mindig kitöltse a képernyőt?
Mert most én perpillanat csak konkrét számokat tudok megadni a hwnd-nek, de ez így nem jó. -
kispx
addikt
válasz
Tomi_78 #4386 üzenetére
Nagyon sok éve nem láttam a Code :: Blocks-ot, így fejből nem tudom.
Ha még releváns ez a 2017-es fórum, akkor project szinten nem tudod beállítani, csak MAKE fájl szerkesztésével. Vagy globálisan (minden projectre kiterjedően) a #define fülön
A harmadik pontot pedig az Edit > File encoding menüponttal tudod elméletileg beállítani. -
kispx
addikt
válasz
Tomi_78 #4384 üzenetére
The wingdi.h header defines TextOut as an alias which automatically selects the ANSI or Unicode version of this function based on the definition of the UNICODE preprocessor constant. [link]
1) A project beállítások között definiáld a UNICODE preprocesszor konstanst.
2) használj wchar_t-n alapuló stringet: LPCWSTR (emiatt strlen helyett wcslen függvényt kell majd használnod kell majd használnod 5. paraméterként
3) a forrásfájl karakterkódolása is legyen Unicode -
Tomi_78
aktív tag
válasz
sztanozs #4381 üzenetére
Azt nem tudom, hogy támogatja-e és hogy egyáltalán milyen grafikus könyvtárat használok.
Ezeket a header fájlokat illesztettem be eddig:
#include <tchar.h>
#include <windows.h>
#include <vector>
#include <locale>
A képernyő alján az van többek között, hogy UTF-8 meg a jobb szélén egy amerikai zászló. De ezekre hiába kattintok, nem történik semmi, tehát máshol kellene beállítani ezt. -
Tomi_78
aktív tag
Sziasztok!
Code:
locks segítségével C++-ban próbálok egy windowsos grafikus játékot készíteni. Tehát nem konzolos programot.
Jó lenne kiíratnom a magyar ékezetes betűket is, ha lehet. De nem tudom, hogyan kell...
Próbáltam ezzel a lehetőséggel:
#include <locale>
és utána:
setlocale(LC_ALL, "hun");De rá se bagózik a program. Valaki tudna segíteni nekem ezügyben?
-
ngl0323
újonc
Sziasztok!
Bin fájl elhomályosítás megvalósítására keresek embert.
Találtam neten kapcsolatos kész projektet hozzá, de működésre kéne bírni. Akit tudna segíteni, kérem jelezze.https://www.codeproject.com/Articles/856846/Binary-Obfuscation
-
Így? Ez sem műxik. De mindegy, mert megoldás van. Igazából tényleg az érdekel mi a különbség a kettő között, mindkettő változó definíció inicializálással.
class B
{
private:
A m_a;
public:
B()
{
m_a( "asdf" );
}dabadab: Viszont azzal a metódusdeklarációval igazad lesz, mert majdnem ugyanúgy néz ki.
-
dabadab
titán
A válasz nagyon egyszerű: azért nem megy, mert a C++ szabvány nem engedi
A "miért nem engedi?" kérdésre talán az a válasz, hogy kinézetre nagyon hasonlít a metódusdeklarációra, nem tudom.
Szóval ami lehetőség marad, az a copy initializing (amit te is írtál) vagy, ami az adott esetben értelmesebb, a közvetlen brace-es (direct list initialization):class B
{
private:
A m_a{"asdf"};
public:
std::string get()
{
return m_a.get();
}
};
-
-
-
Fordítási hiba.
Clang:
<source>:23:12: error: expected parameter declarator
A m_a( "asdf" );
^
<source>:23:12: error: expected ')'
<source>:23:10: note: to match this '('
A m_a( "asdf" );GCC:
<source>:23:12: error: expected identifier before string constant
23 | A m_a( "asdf" );
| ^~~~~~
<source>:23:12: error: expected ',' or '...' before string constantEz
A m_a = A( "asdf" );
ill. ezA m_a = { "asdf" };
is működőképes. Az elsőt még csak-csak értem, mert az, ha nem tévedek valami copy constructoros móka, bár nem tudom, hogy mennyire effektív, de a második, háááát. -
Scale
őstag
Tudomásom szerint így ahogy a B-ben értéket adsz az m_a-nak úgy nem lehet, B-nek kell egy konstruktort megadnod ahol az m_a-t így inicializalod ahogy tetted a változó definicional, úgy elvileg menni fog ugyanez.
Bár most nem próbáltam ki, mobilról nézve ezt látom problémának, esetleg a hiba bemásolása is segíthet amit kapsz. ( Fordítás vagy futás idejű hiba, stb?) -
Valszeg láma kérdés, de nem értem. Ez nem megy:
#include <iostream>
class A
{
private:
std::string m_s;
public:
A( std::string s )
{
m_s = s;
}
std::string get()
{
return m_s;
}
};
class B
{
private:
A m_a( "asdf" );
public:
std::string get()
{
return m_a.get();
}
};
int main()
{
B b;
std::cout << b.get();
return 0;
}De ez igen:
#include <iostream>
class A
{
private:
std::string m_s;
public:
A( std::string s )
{
m_s = s;
}
std::string get()
{
return m_s;
}
};
int main()
{
A m_a( "asdf" );
std::cout << m_a.get();
return 0;
}A lényeg, hogy egyszer jó a
A m_a( "asdf" );
másszor meg nem. -
sztanozs
veterán
válasz
DrojDtroll #4362 üzenetére
Próbálj meg belőni egy SSH Port Forwardingot a gdb szerver portjáta. SSH csak nyitva van...
-
DrojDtroll
veterán
Sziasztok!
Van egy beágyazott linux amiről meglehetősen keveset tudok. Root/sudo jogom nincs rajta. Egy erre fejlesztett alkalmazást kellene debug-olnom. gdb nincs a rendszeren. Szeretnék buildeni egy binárist a gdb-ből, de nem sikerül. Maga a build elkészül, de amikor futtatnám not found üzenetet kapok. Azt már világos, hogy a dinamikusan linkelt libek miatt van ez, de --static beállítással sem jutok előrébb, ugyan azt látom -> not found. Hogyan tudnám kideríteni, hogy pontosan mire volna az adott rendszeren szüksége a binárisnak és azt hogyan tudom bejátszani a configure-nak paraméterként?
(Egy lehetséges megoldás lenne gdbservert használni, amiből sikerült is megfelelő binárist előállítanom, de nem tudok hozzácsatlakozni, mert a portok le vannak tiltva, amihez szintén nincs erőforrásom)
A kérdés feltettem a linux haladó topikban is. -
DrojDtroll
veterán
válasz
DrojDtroll #4360 üzenetére
Meglett a megoldás.
c++ - variadic function template without formal parameters - Stack Overflow
Another way is turning the non-template function
f
into a variadic template function which accepts zero or more template arguments (the otherf
requires one or more template arguments). Then to avoid ambiguity, SFINAE away this template function when the number of arguments is not zero. Well, a code is better than 1000 words:#include <type_traits>
template <typename... Ts>
typename std::enable_if<sizeof...(Ts) == 0>::type f() { }
template <typename T, typename... Ts>
void f()
{
// do something with
T
f<Ts...>();
}
-
DrojDtroll
veterán
válasz
dabadab #4359 üzenetére
Az a lényeg, hogy van 5-6 komponensem amit be kell regisztrálni egy DI frameworkbe. Ezeknek a komponenseknek a legyártására és beregisztrálására akarok egy template függvényt csinálni. Eddig n-szer le volt másolva ugyan az a kód egy kis változtatással(c). Igazából most az a-b paraméterek el is felejthetjük.
Összegezve azt akarom, hogy az adott típusokból egy templatefüggvény gyártson példányokat. createclient<clienta, clientb, clientc>(); -
dabadab
titán
válasz
DrojDtroll #4357 üzenetére
Nem teljesen értem, hogy mit akarsz (pl. hogy miért van ott az x típus), de nekem kifejezetten gyanús, hogy azért nem akar összeállni neked ez a megoldás, mert meg akarod erőszakolni a nyelvet és valójában azt kellene csinálnod, hogy átgondold, hogy igazából mit akarsz és azt megoldani.
Szóval: igazából mit akarsz csinálni?
-
doc
nagyúr
válasz
DrojDtroll #4357 üzenetére
nem biztos hogy jol ertem mire gondolsz, de nem a "variadic template" kell neked?
-
DrojDtroll
veterán
Sziasztok!
Van egy template-es megoldásom.
template<typname a, typename b, typenamec c>
void creatC(b _b)
{
//itt végül elkészül a c típusú objektum amire szükségem van és eltevődik a megfelelő helyre
}
a programban a következő módon van most használva az alábbi rész:
createC<x, y, z1>(_y);
createC<x, y, z2>(_y);
createC<x, y, z3>(_y);
createC<x, y, z4>(_y);
createC<x, y, z5>(_y);
....
z1-z5 mind más típusok amiből példányt szeretnék gyártani. Szeretném ezt egyszerűbbé tenni.
Az elképzelésem:
createC<x, y, z1, z2, z3, z4, z5>(_y);
typename... c -vel kellene próbálkozni, de ahogy látom azt a ()-jelek között tudnám használni a <> jelek között nem.
Megoldható valahogyan amit szeretnék? -
-
Van arra mód, hogy egy usingolt típusnévhez tagfüggvényt adjak? Tehát van egy ilyen:
using kiskutyak = std::unordered_map<string, kiskutya>;
kiskutyak k;Ide szeretnék egy olyat, hogy
k.print();
-
daninet
veterán
válasz
jattila48 #4353 üzenetére
igen
dabadab: igenmindenkinek köszi, működik.
Egyébként ha valaki érdekel egy ilyen homokba rajzasztal playlistjét indítja majd a kód, a 9 fájl darabja 30-60perc egymás után rajzolódik a homokba. -
opr
nagyúr
válasz
daninet #4343 üzenetére
Amit a tobbiek irtak, plusz annyit tennek hozza, hogy sprintf helyett en std::string+std::regex+std::regex_replace-el operalnek.
Picit lassabb, az teny, cserebe sokkal atlathatobb, olvashatobb, konnyebb modositani es megerteni, es ebben a kodban ugyse ez lesz a sok ido/szuk keresztmetszet, azt a +1ms-et, ami a nativ char helyett string operation lesz siman bealdoznam a szebb es erthetobb kod erdekeben.szerk: Most csak fejbol idegepeltem, nem vagyok benne 100% biztos, hogy ez igy fordul, de a lenyeg stimmelni fog:
#include <regex>std::string daFox =R("The quick REPLACE_ME_SENSEI fox...");
daFox = std::regex_replace(daFox, std::regex("REPLACE_ME_SENSEI"), "brown"); -
dabadab
titán
válasz
daninet #4343 üzenetére
Úgy nézem, hogy igen.
Én ennyit változtatnék rajta, ha már tulajdonképpen az if feltételei között impliciten szóba került, hogy az autofile_indexnek akár 10 feletti értéke is lehet (és akkor ez lekezelné azt is, meg rövidebb is):if (autofile_index >= 10)
autofile_index = 1;
else
autofile_index++; -
daninet
veterán
Sziasztok!
Valaki validálná nekem, hogy az alábbi kód helyes? Azt akarom, ha ez a loop eléri az auto9.g sorszámot ugorjon vissza nullára (vagyis a számlálóban 1-re amiből kivonunk egyet).
Ezek a fájlok majdnem 6 óráig futnak ezért szeretném tudni a hosszú teszt előtt, hogy amit belekontárkodtam működikvoid CardReader::autofile_begin() {
autofile_index = 1;
(void)autofile_check();
}
bool CardReader::autofile_check() {
if (!autofile_index) return false;
if (!isMounted())
mount();
else if (ENABLED(SDCARD_EEPROM_EMULATION))
settings.first_load();
// Don't run auto#.g when a PLR file exists
if (isMounted() && TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) {
char autoname[10];
sprintf_P(autoname, PSTR("/auto%c.g"), '0' + autofile_index - 1);
if (fileExists(autoname)) {
cdroot();
openAndPrintFile(autoname);
if (autofile_index = 10)
autofile_index = 1;
else if (autofile_index < 10)
autofile_index++;
return true;
}
}
autofile_cancel();
return false;
}
-
dabadab
titán
Teljesen jol definialt az elso eset
A C++ standard ezt másképpen gondolja
"In a single-object delete expression, if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined."
[link] -
-
dabadab
titán
Delete esetén ha a statikus (az első példában Base, a másodikban void) és a dinamikus (Derived) típus különbözik, akkor a dinamikus típusnak a statikus leszármazottjának kell lennie ÉS a statikus típus destruktorának virtuálisnak kell lennie, máskülönben undefined behaviour.
Szóval mindkét példa definiáltlan működés, saccra a gyakorlatban annyi történik, hogy az első példában meghívódik a Base destruktora (így a Derived saját dolgai felszabadítatlanul maradnak), a második példában meg csak egy free() a pointerrel.
-
MageRG
addikt
Tisztelt Hölgyek és Urak!
class Base
{
/* ..., nincs virtual destructor */
};
class Derived: public Base
{
/* ... */
};
int main()
{
Base *basePtr = new Derived();
delete basePtr; /* (1) memory leak, de miért? */
void *ptr = (void*) new Derived(); /* tudom, borzalom */
delete ptr; /* (2) itt mi történik? */
return 0;}
Szóval a fenti agymenés lenne a kérdés:
(1)-nél gondolom azt hiszi a fordító, hogy ez egy Base objektum, ezért a származtatott osztály részeit már nem szabadítja fel.
Ez mindig így van? Van olyan fordító, ami "tudja", hogy az adott pointer ténylegesen mekkora területre mutat?
(2)-nél mi történik? Ha jól értem itt már semmilyen takarítás nincs (egy destruktor sem hívódik meg).
Elnézést ha kicsit csekély értelmű kérdés... -
Livius
őstag
válasz
dabadab #4333 üzenetére
Nézem mi ez a MAUI pontosan, de szerencsére ez is XAML-ben van, szóval elvileg a régi WPF kódok copy pastel 90%-ra működhetnek ugyan úgy, és az ábrák szerint tényleg multiplatform. Ha GUI-s programról van szó, akkor egyszer mindenképpen lépni kell a C++-ról C#-ra majd. Ha ez végre tényleg Multi-platform App UI lesz, akkor itt az ideje ennek a váltásnak, és aki ezt hamarabb kezdi el, az igazán sokat fog nyerni fejlesztési időkben és rugalmasságban a SW piacon.
-
-
coco2
őstag
Win alatt c-ben van system() függvény - os shell parancsot kiadni. Linux alatt szintén elérhető. Mac alatt nem tudom. Számíthatok ugyanarra? A developer.apple.com site keresője nem dobott nekem semmi bíztatót
-
dabadab
titán
Hasonlót kerestem és akkor jött szembe az Ultimate++.
Addig még nem jutottam el, hogy használjam is, szóval konkrét tapasztalataim egyáltalán nincsenek, de jól néz ki. -
coco2
őstag
Sziasztok!
Multiplatform win/mac projectbe UI-t kellene rakni (kiírások, gombok, checkboxok, scroll ilyesmik), C++. Milyen lib supportot lehet találni? VS környezetben van a project. Qt-n kívül van bármi más?
-
amargo
addikt
Sziasztok!
Tudom nem hirdetési felület, de max törölni fogják.
Ha lenne itt jelentkező, hogy egy Borland C++ Builder 6.0-ban íródott programot átvegyen az kérem privátban jelentkezzen.Köszi!
-
ttomas2005
csendes tag
Sziasztok!
Az egyetemen olyan feladatunk van, hogy egy esztétikus gráfrajzoló programot kell írnunk OpenGL segítségével. A feladat kitétele, hogy használjunk hozzá dinamikai modellt(súrlódás, pontok egymásra ható ereje stb alapján) ami a végső simítást végzi. De ez előtt még kellene használnunk egy heurisztikát, ami nagyjából elhelyezi úgy a gráf csomópontjait, hogy a szomszédosak (van közöttük él) egymás közelében lesznek, azok pedig akik nem szomszédosak távolabb. A tanár annyi segítséget adott, hogy a K közép (K-means) módszert lehet erre használni, de nem igazán értem, hogy passzolna ez a módszer ide. Valaki tudna segíteni esetleg abban, hogyan kapcsolódik ez a feladathoz, illetve elindulni nagyjából az algoritmus elkészítésében? Előre is köszönöm a válaszokat. -
jattila48
aktív tag
válasz
dabadab #4318 üzenetére
Épp azt írtam, hogy ne kész megoldásokra hivatkozzatok (OK, nem boost hanem már std), hanem hogy hogy lehetne megírni ezek nélkül. A működése érdekel. A generátor azért más mint az iterátor, bár hasonló célt szolgál. Arra kíváncsi lennék azért, hogy az iterátor alkalmazásához előbb eltárolja-e a fájl neveket konténerbe utána pedig azon iterál, vagy "röptében" állítja elő a fájl neveket. Gyanítom, hogy az előbbi, akkor pedig nem túl memória kímélő. Míg a generátor csak az éppen következő fájl nevet állítja elő.
Közben olvasom, hogy mi a LegacyInputIterator, így a fenti megjegyzésemet visszavonom. Ehhez nem kell előzőleg konténerben eltárolni a fájl neveket. Na ezt sem tudtam eddig, hogy létezik ilyen, hogy LegacyInputIterator. -
dabadab
titán
-
jattila48
aktív tag
Sziasztok!
C/C++-ban szeretnék írni egy generátort, ami adott directory-tól kezdve rekurzívan visszaadja a fájl neveket. Lenne egy init tfv.-e, aminek meg kell adni a gyökér directory nevét, a get_next_file tfv. pedig visszaadja a következő fájl nevet, a finish tfv. pedig kilép a generátorból. Hasonlóan ahhoz, mintha iterátort használnánk, de a fájl nevek nem kerülnek előzetesen konténerbe, hanem mindig a get_next_file adja vissza a következő fájl nevet, de csak azt. Pythonban van generátor, de C/C++-ban nincs (egyébként egyáltalán nem értek a Pythonhoz). Hogy lehetne hasonlót írni? Ne boost-ot ajánljatok, mert igazából a mechanizmus érdekel. Bár ha tudjátok, hogy a boost file system iterátora hogy működik, az is érdekel. Én megírtam egy működőképes megoldást, amit elegánsnak nem éppen lehet nevezni.
-
Tomi_78
aktív tag
Kedves szakértők, tudnátok némi információval szolgálni a SwapBuffers() paranccsal kapcsolatban? Ugyanis ezt használnám Code: Blocks Win32GUI programomban a WM_PAINT ágban, hogy kiküszöböljem a képernyő eddigi villódzását rajzoláskor. Ezt meg is akadályozza, de a program érezhetően sokat lassul a használatával. Akkor lehet, hogy nem is a SwapBuffers() való a kettős buffereléshez?
Dióhéjban így néz ki most a program, kiragadva a lényeges elemeket:LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC grafikakezelo;
PAINTSTRUCT ps;(...)
case WM_PAINT:
grafikakezelo = BeginPaint(hwnd, &ps);(...Rajzolások...)
SwapBuffers(grafikakezelo);
EndPaint(hwnd, &ps); -
Tomi_78
aktív tag
Most egy teljesen másféle kódot próbáltam ki képkirajzolásra, mint az előző, de mégsem rajzol ki semmit...
Ezzel mi a baj? Megjegyzéseket is írtam hozzá, hogy - szerintem - mi mit csinál:LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC grafikakezelo;
PAINTSTRUCT ps;
static HBITMAP kep;
BITMAP bitmapkep;
HDC grafikakezelo2;
switch (message) /* handle the messages */
{
case WM_CREATE:
//A kép betöltése:
kep = (HBITMAP) LoadImageW(NULL, L"kek_labda.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADTRANSPARENT);
break;
case WM_PAINT:
grafikakezelo = BeginPaint(hwnd, &ps);
//Készítek egy másik grafikakezelőt az első alapján:
grafikakezelo2 = CreateCompatibleDC(grafikakezelo);
//A kep-et betöltöm ebbe az új grafikakezelőbe:
SelectObject(grafikakezelo2, kep);
//Kiolvasom a kep méretét:
GetObject(kep, sizeof(bitmapkep), &bitmapkep);
//Végül a kép kirajzolása az 50-50 képernyőkoordinátára:
BitBlt(grafikakezelo, 50, 50, bitmapkep.bmWidth, bitmapkep.bmHeight, grafikakezelo2, 0, 0, SRCCOPY);
-
Tomi_78
aktív tag
válasz
dabadab #4313 üzenetére
"a WM_PAINT ágban deklarálsz egy változót, amit csak ott inicializálsz, viszont mindenhol látható. A megoldás az, hogy a case WM_PAINT: utána részt kapcsos zárójelek közé rakod, mert az ott egy külön blokk."
Kapcsos zárójelek közé raktam a WM_PAINT-on belüli részt, de megbolondult tőle a programom a futtatáskor; valami krikszkrakszokat ír ki...
-
Tomi_78
aktív tag
Az előző problémát sikerült megoldani, viszont a képkirajzolás nem megy nekem, illetve a programomnak Code:
locks-ban :
#include <gdiplus.h>
(...)
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC grafikakezelo;
PAINTSTRUCT ps;
switch (message) /* handle the messages */
{
case WM_PAINT:
grafikakezelo = BeginPaint(hwnd, &ps);
Gdiplus::Graphics rajz(grafikakezelo);
Gdiplus::Image labdakep(L"kek_labda.bmp");
rajz.DrawImage(&labdakep, 60, 10);És mégsem rajzol ki semmit, hanem azt írja hibaként:
F:\progsetup\codeblocks-17.12mingw-nosetup\sajatok\ablakosrajz\Rajz\main.cpp|114|note: crosses initialization of 'Gdiplus::Image labdakep'|
meg:
F:\progsetup\codeblocks-17.12mingw-nosetup\sajatok\ablakosrajz\Rajz\main.cpp|113|note: crosses initialization of 'Gdiplus::Graphics rajz'|
Mit rontottam el és hogyan hozható helyre? -
Tomi_78
aktív tag
Tisztelt segítők!
Jól használom én az időzítőt a programomban?1. Megadom a változót a kód elején:
const unsigned int idozito=1;
bool cselekedhet=true;2. Itt beállítom 10 másodpercre:
case WM_CREATE:
SetTimer(hwnd,idozito,10000,(TIMERPROC)NULL);
break;
3. Itt pedig használom a cselekedhet változó értékének beállítgatására:
case WM_TIMER:
switch (wParam)
{
case idozito: if (cselekedhet==false) {
cselekedhet = true;}
else {
cselekedhet = false;
};
break;
};
break;
A WM_PAINT-ban mozgatom a kockát, ha a cselekedhet értéke igaz. De bármennyire állítom a SetTimer-ben a számot, ugyanolyan gyors lesz. Ki is íratom a változó értékét:
char szoveg[1];
itoa(cselekedhet,szoveg,10);
TextOut(grafikakezelo, 50, 10, szoveg,5);és mindig 1-et, azaz igaz-t mutat. Hol és mit rontottam el, hogy ez az érték nem változik 1 mp.-enként igaz és hamis között?
-
-
dabadab
titán
válasz
Tomi_78 #4308 üzenetére
azt hittem, hogy te valami kívülről származó eljáráskönyvtárról írtál, amit állítólag használok a progimban, ez meg alapban benne van a C++-ban
Jól hitted, pont erről beszéltem és ez nincs benne alapból a C++-ban
Ez egy Windows-only könyvtár, amit gondolom a Codeblocks alapbeállításoknál behúz.A hiba, amit kidob, az azért van, mert a WM_PAINT ágban deklarálsz egy változót, amit csak ott inicializálsz, viszont mindenhol látható. A megoldás az, hogy a case WM_PAINT: utána részt kapcsos zárójelek közé rakod, mert az ott egy külön blokk.
-
Tomi_78
aktív tag
válasz
dabadab #4307 üzenetére
Aha. Hát... ezt nem tudtam. Akkor volt egy kis félreértés részemről
.
Most egyébként próbáltam leegyszerűsíteni a programomat, már ami a Device Context (DC) beállításokat illeti. Ahogy olvastam a "Borland C++ Builder 6 Developer's Guide" című könyvben, a DC az a grafikus eszközillesztőhöz való hozzáférést biztosító kezelő(?). Tehát ez mindenképpen kell a rajzolásokhoz (itt volt a félreértés, mert azt hittem, hogy te valami kívülről származó eljáráskönyvtárról írtál, amit állítólag használok a progimban, ez meg alapban benne van a C++-ban).
Szóval, a következőképpen fest most egy kis programom, de valami nem jó benne, mert a default ágra mutatva a következő hibaüzenetet írja:
F:\progsetup\codeblocks-17.12mingw-nosetup\sajatok\ablakosrajz\Rajz\main.cpp|103|error: jump to case label [-fpermissive]|
Röviden el tudnátok mondani, hogy mi a baj vele, vagy hogy mi hiányzik belőle? Pedig a könyv alapján csináltam, de így sem jó.int kockax=50, kockay=5;
(...)LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_KEYDOWN:
switch (wParam) {
case VK_LEFT: kockax-=4; InvalidateRect(hwnd, NULL, true); break;
case VK_RIGHT: kockax+=4; InvalidateRect(hwnd, NULL, true); break;
case VK_UP: kockay-=4; InvalidateRect(hwnd, NULL, true); break;
case VK_DOWN: kockay+=4; InvalidateRect(hwnd, NULL, true); break;
}
break;
case WM_PAINT:
HDC grafikakezelo = GetDC(hwnd);
Rectangle(grafikakezelo,kockax,kockay,40,40);
ReleaseDC(hwnd,grafikakezelo);
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
-
Tomi_78
aktív tag
válasz
dabadab #4305 üzenetére
Pedig tényleg nem használok semmi extrát a programozáshoz. De inkább be is szúrom kis programomat (175 sor talán még belefér a fórumba; ha nem, hát szóljatok érte, hogy az ilyet mellőzzem legközelebb), hogy lássátok. Persze így azt is látni, hogy sokminden még nem világos benne nekem sem; ezeket megjegyzésbe írtam.
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif
#include <tchar.h>
#include <windows.h>
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");
int xhely=50,yhely=5,xseb=8,yseb=8;
UINT idozito;
RECT ablak;
const unsigned int idozito1=1;
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default colour as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
_T("Jatekom"), /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nCmdShow);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc; //handle to device context a jelentése, de mire is jó?
hdc = GetDC(hwnd);
static HBITMAP kep;
BITMAP bitmapkep;
HDC hdcMem;
HGDIOBJ oldBitmap;
PAINTSTRUCT ps; //előző helyről törléshez
switch (message) /* handle the messages */
{
case WM_CREATE:
kep = (HBITMAP) LoadImageW(NULL, L".\\kek_labda.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (kep == NULL) {
MessageBoxW(hwnd, L"Nem tudtam betolteni a kepet!", L"Error", MB_OK);
}/*
else {
System::Drawing::Bitmap::kep.MakeTransparent();
};*/
idozito = SetTimer(hwnd,idozito1,100,(TIMERPROC)NULL);
break;
case WM_KEYDOWN:
switch (wParam) {
case VK_LEFT: xhely-=4; InvalidateRect(hwnd, NULL, true); break;
case VK_RIGHT: xhely+=4; InvalidateRect(hwnd, NULL, true); break;
case VK_UP: yhely-=4; InvalidateRect(hwnd, NULL, true); break;
case VK_DOWN: yhely+=4; InvalidateRect(hwnd, NULL, true); break;
}
break;
case WM_PAINT:
hdcMem = CreateCompatibleDC(hdc); //ez mire jó?
oldBitmap = SelectObject(hdcMem, kep); //és ez?
GetObject(kep, sizeof(bitmapkep), &bitmapkep); //beolvassa a kep változóba a bitmap adatait(?)
BeginPaint(hwnd, &ps); //előző helyről törléshez
BitBlt(hdc, xhely, yhely, bitmapkep.bmWidth, bitmapkep.bmHeight,
hdcMem, 0, 0, SRCCOPY); //ez rendben van: kirajzolás
/*BLENDFUNCTION pixelblend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
AlphaBlend(hdc, 0, 0, bitmapkep.bmWidth, bitmapkep.bmHeight, hdcMem, 0, 0, bitmapkep.bmWidth, bitmapkep.bmHeight, pixelblend);*/
EndPaint(hwnd, &ps); //előző helyről törléshez
SelectObject(hdcMem, oldBitmap); //ez is mit csinál?
DeleteDC(hdcMem); //???
TextOut(hdc, 10, 10, TEXT("Szia!"),5); //ez is oké: kiírok egy szöveget.
GetWindowRect(hwnd, &ablak);
char szoveg[30];
itoa(ablak.right,szoveg,10);
TextOut(hdc, 50, 10, szoveg,5);
itoa(xhely+8+bitmapkep.bmWidth,szoveg,10);
TextOut(hdc, 100, 10, szoveg,5);
Rectangle(hdc, 50, 50, 200, 100); //meg ez is: téglalap rajzolása
ReleaseDC(hwnd, hdc); //ez minek kell?
break;
case WM_TIMER:
switch (wParam)
{
case idozito1:
GetWindowRect(hwnd, &ablak);
xhely = xhely + xseb;
yhely = yhely + yseb;
if (xhely+xseb+bitmapkep.bmWidth>ablak.right-ablak.left-bitmapkep.bmWidth) {
xseb = -1*abs(xseb);
}
else
if (xhely<0) {
xseb = abs(xseb);
};
if (yhely+yseb+bitmapkep.bmHeight>ablak.bottom) {
yseb = -1*abs(yseb);
}
else
if (yhely<0) {
yseb = abs(yseb);
};
InvalidateRect(hwnd, NULL, true);
break;
}
break;
case WM_DESTROY:
KillTimer(hwnd,idozito1);
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
-
dabadab
titán
válasz
Tomi_78 #4299 üzenetére
Amit találtál, az egy külön megvehető library API-ja, amivel mindenféle fileformatumokat tudsz írni meg olvasni (röviden: tutira nem ez kell neked
)
A standard C++-ban nincs semmi, amivel rajzolni tudnál a képernyőre, szóval biztosan már most is valami külső könyvtárat használsz erre, innen kezdve az a kérdés, hogy mit és hogy az tud-e ilyet.
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Nokia 105 4G (2023) charcoal, Nokia 110 4G (2023) midnight blue
- ASRock B550 PG Velocita + Ryzen 5 3600 + 32GB (4x8GB) DDR4 3600Mhz CL18
- Philips 58PUS8505 Smart LED Televízió,146 cm, 4K Ultra HD ,Android, Ambilight, HDR10+ KIJELZŐHIBÁSAN
- Canon EOS 250D kiegészítőkkel, táskával (CSAK 200 expoval !!! )
- Lenovo Legion Go 512GB + rengeteg extra!
- DELL PowerEdge R730xd 16LFF+2SFF rack szerver - 2xE5-2680v3,64GB RAM,4x1GbE,H730 RAID v ZFS
- ÁRGARANCIA! Épített KomPhone Ryzen 5 7500F 32/64GB RAM RX 9060 XT 16GB GAMER PC termékbeszámítással
- Prémium! Felsőkategória! Asus Rog Strix Maximus Z790 Hero Wi-fi Alaplap!
- ÁRGARANCIA!Épített KomPhone Ryzen 7 5700X 16/32 RAM RTX 5060Ti 16GB GAMER PC termékbeszámítással
- LG 34WR55QK-B - 34" Ívelt VA - 3440x1440 - 100Hz 5ms - FreeSync Premium - HDR 10 - USB Type-C 65W
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest