- Az NVIDIA szerint a partnereik prémium AI PC-ket kínálnak
- Két Zen 5-ös dizájnjának mintáit is szállítja már az AMD
- A Colorful "fagyosan kompakt" alkatrészekkel megy elébe a nyárnak
- A Keychron ismét egy űr betöltését vállalta magára az egerek szegmensében
- Az átlagnál vaskosabb ventilátorok kandikáltak ki a Corsair vitorlája mögül
- Gaming notebook topik
- OLED TV topic
- TCL LCD és LED TV-k
- Sony MILC fényképezőgépcsalád
- HiFi műszaki szemmel - sztereó hangrendszerek
- Fejhallgató erősítő és DAC topik
- Milyen egeret válasszak?
- Házi barkács, gányolás, tákolás, megdöbbentő gépek!
- Milyen CPU léghűtést vegyek?
- Milyen asztali (teljes vagy fél-) gépet vegyek?
Hirdetés
-
AMD Radeon undervolt/overclock
lo Minden egy hideg, téli estén kezdődött, mikor rájöttem, hogy már kicsit kevés az RTX2060...
-
Kapnak egy rakás reklámot a Roblox játékosai
it Videohirdetésekre készülhetnek ezentúl a virtuális világokban a Roblox játékosai.
-
Az NVIDIA szerint a partnereik prémium AI PC-ket kínálnak
ph Megkezdődött az NPU-k elleni hadjárat, de egy fontos részletet nem említ a cég.
Új hozzászólás Aktív témák
-
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.
DRM is theft
-
Tomi_78
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;
}
-
Tomi_78
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;
}
-
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.
DRM is theft
-
Tomi_78
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?
-
Tomi_78
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?[ Szerkesztve ]
-
Tomi_78
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...
[ Szerkesztve ]
-
Tomi_78
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
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); -
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.
„Kétségtelen, hogy nem tudjuk, mit tegyünk, de felkészültek és elszántak vagyunk.” - Olaf Scholz német kancellár
-
dabadab
titán
-
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.[ Szerkesztve ]
„Kétségtelen, hogy nem tudjuk, mit tegyünk, de felkészültek és elszántak vagyunk.” - Olaf Scholz német kancellár
-
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. -
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!
“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
-
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?
កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។
-
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.DRM is theft
-
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
កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។
-
Livius
őstag
Állítólag a C# .NET 6 multiplatfrom lett már. Tehát elképzelhető, hogy a Windows-os WPF GUI, ugyan úgy megy MacOS-en is, igazából ha ez tényleg igaz, akkor most ez lenne a state of the art ami neked kellene.
[ Szerkesztve ]
Gigabyte GA-Z170-D3H, Intel Core i7-7700K, Corsair Vengeance 2x8GB DDR4-3600MHz, Intel 545s 256GB SSD, EVGA GeForce GTX 1060 GAMING 6GB
-
dabadab
titán
-
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.
Gigabyte GA-Z170-D3H, Intel Core i7-7700K, Corsair Vengeance 2x8GB DDR4-3600MHz, Intel 545s 256GB SSD, EVGA GeForce GTX 1060 GAMING 6GB
-
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...[ Szerkesztve ]
"What is bravery, without a dash of recklessness!"
-
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.
DRM is theft
-
-
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]DRM is theft
-
jattila48
aktív tag
Általános "szabály" (inkább javaslat):
Az ős osztály destruktora publikus és virtuális,
vagy protected és nem virtuális.Nálad az első eset érvényes, mert polimorf módon használod az osztályt.
[ Szerkesztve ]
„Kétségtelen, hogy nem tudjuk, mit tegyünk, de felkészültek és elszántak vagyunk.” - Olaf Scholz német kancellár
-
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;
}
[ Szerkesztve ]
Miért vegyem meg, ha 3x annyiért, 3x annyi idő alatt megépíthetem? ´¯`·.¸¸.·´¯`·.¸><(((º>
-
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++;[ Szerkesztve ]
DRM is theft
-
sztanozs
veterán
válasz daninet #4343 üzenetére
if (autofile_index = 10)
autofile_index = 1;
else if (autofile_index < 10)
autofile_index++;
helyettautofile_index = (autofile_index % 9) + 1;
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!