#2 gna
Při takovémto zadávání to funguje, ale problém je, že při ukládání souboru se jedná o text a zde už vaše navrhované řešení je opět prostý text. Jméno souboru poté nejsou parametry ale ""str(1) + ", " str(2) + ".png" "" a nebo rovnou přijde Syntac Error.
Příspěvky odeslané z IP adresy 94.113.240.–
Ahoj, jsem začátečník s Pythonem, můj dotaz možná pro někoho bude maličkost, tak doufám, že se mi dostane pomoci.
Pracuji v programu a výsledkem je série obrázků jsou pojmenované podle parametrů za kterých byly vytvořeny. Zatím jsem musel vždy přepisovat jméno souboru podle parametrů. Co hledám je způsob jak automaticky do:
#Name_of_image
im.save(folder+"/45, 0.5, 0.52, 20, 0.51, 0.2.png")
namísto neustále kopírování číslic, měl pouze jakousi proměnnou, která bude parametry doplňovat automaticky.
Všem díky za pomoc :-)
#4 KIIV
Můj příspěvek přichází už poněkud pozdě, myslím ale, že bude mít pro někoho význam. tak tedy: Výše uvedené řešení také způsobí únik paměti. Nedojde k odalokování posledních členů stromu. (listů)
Příklad stromu:
10
/ \
6 14
/ \ / \
5 8 11 18
bude se dít následující rekurzivní volání
DeleteUzel(RootPtr_10)
DeleteUzel(RootPtr_10->ukLevy, což je RootPtr_6)
DeleteUzel(RootPtr_6->ukLevy, což je RootPtr_5)
DeleteUzel(RootPtr_5->ukLevy, což je nullptr) // podmínka RootPtr != nullptr nesplněna
free(RootPtr_5->ukLevy, což je nullptr) ; // uvolňuje se kukazatel na nullptr
RootPtr_5->ukLevy = nullptr;
DeleteUzel(RootPtr_6->ukPravy, což je RootPtr_8)
DeleteUzel(RootPtr_8->ukPravy, což je nullptr) // podmínka RootPtr != nullptr nesplněna
free(RootPtr_8->ukPravy, což je nullptr) ; // uvolňuje se kukazatel na nullptr
RootPtr_8->ukPravy = nullptr;
free(RootPtr_10->ukLevy, což je RootPtr_6) ; // ukazatel na 5 a 8 zůstává neuvolněn
RootPtr_10->ukLevy = nullptr; // uvolněním 6tky zaniká přístup k jeho větvím
DeleteUzel(RootPtr_10->ukLevy, což je RootPtr_6)
...
Lepší řešení je:
void DeleteUzel(tUkUzel RootPtr)
{
if( Ptr != nullptr )
{
DeleteUzel(RootPtr->ukLevy);
DeleteUzel(RootPtr->ukPravy);
free(RootPtr);
RootPtr = nullptr;
}
}
Volání bude probíhat takto:
DeleteUzel(RootPtr_10)
DeleteUzel(RootPtr_10->ukLevy), což je RootPtr_6)
DeleteUzel(RootPtr_6->ukLevy), což je RootPtr_5)
DeleteUzel(RootPtr_5->ukLevy), což je nullptr) // 5ka nemá levou větev. Ukazatel je nullptr pokračuje se na pravou
DeleteUzel(RootPtr_5->ukPravy), což je nullptr) // prava větev je rovnež nullptr
free(RootPtr_5); // uvolnění paměti
RootPtr_5 = nullptr;
DeleteUzel(RootPtr_6->ukPravy), což je RootPtr_8) // pokracuje se na pravou větev 6tky
DeleteUzel(RootPtr_8->ukLevy), což je nullptr)
DeleteUzel(RootPtr_8->ukPravy), což je nullptr)
free(RootPtr_8);
RootPtr_8 = nullptr;
free(RootPtr_6); // 6tka už nemá pravou ani levou větev a proto je možné ji odalokovat
RootPtr_6 = nullptr;
DeleteUzel(RootPtr_10->ukPravy), což je RootPtr_14)
DeleteUzel(RootPtr_14->ukLevy), což je RootPtr_11)
DeleteUzel(RootPtr_11->ukLevy), což je nullptr) // 11ka nemá levou větev. Ukazatel je nullptr pokračuje, se na pravou
DeleteUzel(RootPtr_11->ukPravy), což je nullptr) // prava větev je rovnez nulptr
free(RootPtr_11); // uvolnění paměti
RootPtr_11 = nullptr;
DeleteUzel(RootPtr_14->ukPravy), což je RootPtr_11)// pokracuje se na pravou větev 14tky
DeleteUzel(RootPtr_11->ukLevy), což je nullptr)
DeleteUzel(RootPtr_11->ukPravy), což je nullptr)
free(RootPtr_11);
RootPtr_11 = nullptr;
free(RootPtr_14); // 14tka už nemá pravou ani levou větev a proto je možné ji odalokovat
RootPtr_14 = nullptr;
free(RootPtr_10); // Nakonec se odalokuje kořen
RootPtr_10 = nullptr;
KIIV mně inspiroval k hledání leak detektoru pro Windows Visual Studio
Můžu doporučit https://vld.codeplex.com/ funguje perfektně a je zdarma.
Igor
#6 Satik
Ahoj Satik,
Díky za názor.
C# vs C++: Osobně bych taky raději používal C#, ale C++ se používá u nás v práci. To platí v podstatě i pro WinAPI.
GUI: Tady jsem se nepřesně vyjádřil, nechci implementovat vlastní GUI ale zahrnout do projektu GUI jako třeba právě Win_API nebo Qt.
V první řadě mi jde o to, abych si osvojil objektové myšlení
#4 ondrej39
Ahoj Ondro. C++za 21 dní mimo jiné pojednává o Abstraktních třídách. Jedna z pokročilých technik jsou například i propojené seznamy. Vcelku tomu rozumím, ale už je to už poněkud pokročilé. Asi bych měl začít postupně a jednoduššími věcmi.
Děkuji za názor ohledně implementace GUI. Ještě to rozmyslím ale patrně to nechám na dobu kdy si budu jistější s jazykem jako takovým.
Budu vděčný za jakýkoliv materiál.
Pánové, a co říkáte na návrhové vzory. Mám se tím zabývat? Používáte to?
Díky
Igor
Ahoj,
Jsem spíš programátor samouk. (Python, LabView, TCL, Matlab) Nyní začínám s C++ a chci to dělat seriózně(ji).
Přečetl jsem knihu Naučte se C++ za 21 dni( asi za 42 dní :-)) Většinu příkladů jsem udělal a danou látku pochopil. Teď procházím Tutorial WinAPI. Ovšem veškerá teorie je jak známo k ničemu, když se nezavede do praxe. Chci si určit projekt s konkrétním cílem (vytvořit vlastní třídu, gui ...) a na něm začít pracovat. Od vás bych rád dostal rady čemu se vyvarovat, nebo co se naopak Vám osvědčilo v začátcích. Například používání návrhových vzorů ano či ne. Kniha/ web s řešenými příklady. Můžete být konkrétní i obecní.
Předem moc děkuji za rady