Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: webhope 22. 10. 2013, 17:59:01

Název: C++ na Win a chyba poblíž case
Přispěvatel: webhope 22. 10. 2013, 17:59:01
Zdravím, začínám s C++. Snažím se z jedné opensource vytáhnout kód na dekomprimování souboru.

Může mi někdo pomoci s odstraněním těchto chyb? Asi mají stejnou příčinu.

Kód: [Vybrat]
error C2065: 'PSCB_PRECREATE' : undeclared identifier
error C2051: case expression not constant
error C2065: 'PSCB_INITIALIZED' : undeclared identifier
error C2051: case expression not constant
error C2065: 'TOOLTIPS_CLASS' : undeclared identifier
error C3861: 'TooltipInit': identifier not found
error C2065: 'PROPSHEETHEADER' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'header'
There is this code:

Kód: [Vybrat]
int CALLBACK PropSheetProc(HWND sheet, UINT msgid, LPARAM lParam)
{
    switch (msgid)
    {
    case PSCB_PRECREATE:
        {
            DLGTEMPLATE *templ = (DLGTEMPLATE*)lParam;

            templ->cy += 5;
slovo PSCB_PRECREATE jsem v projektu našel jenom jednou, takže nechápu smysl té hlášky.

A pak se objevuje chybová hláška v souvislostí s funkci
HWND MakeSheet(HINSTANCE app)
Kód: [Vybrat]
error C2065: 'header' : undeclared identifier
For this line:
PROPSHEETHEADER header;


'PSH_MODELESS' : undeclared identifier
error C2065: 'PSH_USECALLBACK' : undeclared identifier
error C2065: 'PSH_NOAPPLYNOW' : undeclared identifier
error C2065: 'PSH_NOCONTEXTHELP' : undeclared identifier
error C2065: 'PSH_USEICONID' : undeclared identifier
error C2065: 'header' : undeclared identifier

Looks similar

Code:
http://paste.ofcode.org/35B57JYGkaJDnct4UkDfGcB
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: eMko 22. 10. 2013, 18:26:04
slovo PSCB_PRECREATE jsem v projektu našel jenom jednou, takže nechápu smysl té hlášky.

To možná bude ta příčina - mělo by tam být minimálně 2x - jednou deklarované a jednou použité. Nechybí Ti nějaký hlavičkový soubor nějaké knihovny? Co to je za aplikaci a jaké má závislosti (zpravidla se uveřejňují na stránkách té aplikace)?
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 22. 10. 2013, 18:54:16
No ale vono tam je vážně jenom jednou. A předtím to jelo bezproblému než jsem tam teda udělal ty změny.

Mohl by ses prosím tě podívat, na ten originál?
http://www.mediafire.com/download/o5yo6o6t91bpcix/aokts-1.0.1_rev-70.zip#!
Je to AOK Trigger Studio v1.0.1 rev70
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 22. 10. 2013, 19:04:22
a jedná se o soubor view/aokts.cpp
v originálním projektu jsem našel jednu chybu a to, že je nutno includovat
Kód: [Vybrat]
#include <iterator>     // std::back_inserter
hned za #include <functional>
to jen kdyby si to zkoušel spustit.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: danielsoft 22. 10. 2013, 19:06:21
zkusil jsem googlit PSCB_PRECREATE a podle tohoto

http://msdn.microsoft.com/en-us/library/windows/desktop/bb760815(v=vs.85).aspx

se má includnout Prsht.h - máš to tam?
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 22. 10. 2013, 19:22:06
Nevím co znamená to header ... Prsht.h
ale autor to v tom originálním projektu nemá a přesto jim to jede... Přijde na to někdo v jakto že mu to jede a mě ne? A jde o to, že ono těch chybových hlášek je více

error C2065: 'PSCB_PRECREATE' : undeclared identifier
error C2051: case expression not constant
error C2065: 'PSCB_INITIALIZED' : undeclared identifier
error C2051: case expression not constant
error C2065: 'TOOLTIPS_CLASS' : undeclared identifier
error C3861: 'TooltipInit': identifier not found
error C2065: 'PROPSHEETHEADER' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'header'

'PSH_MODELESS' : undeclared identifier
error C2065: 'PSH_USECALLBACK' : undeclared identifier
error C2065: 'PSH_NOAPPLYNOW' : undeclared identifier
error C2065: 'PSH_NOCONTEXTHELP' : undeclared identifier
error C2065: 'PSH_USEICONID' : undeclared identifier
error C2065: 'header' : undeclared identifier
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 22. 10. 2013, 20:52:51
Ještě se chci zeptat na toto... Jelikož studuju tento článek
http://www.builder.cz/rubriky/c/c--/ucime-se-winapi-3--156008cz (http://www.builder.cz/rubriky/c/c--/ucime-se-winapi-3--156008cz)
jak vytvořit okno, zajímá mě, jestli je nutné pro vytvoření aplikace win32 vytvářet okno?
Tam se píše, že pomocí CreateWindowEx se vytváří okno. Ve v originálu zmiňovaného projektu, viz výše, se objevuje tvorba oken pomocí CreateWindowEx a CreateWindow a to pro tooltip (TOOLTIPS_CLASS), stavový řádek (STATUSCLASSNAME). V celém projektu se žádné jiné okna nevytváří. Alespoň jsem tedy nenašel další slova začínající na CreateWindow a obsahující tyto klíčové slova.

Takže proto se ptám, mě přijde divné, že se nikde nevytváří okno aokts (tak se jmenuje aplikace). Je to normální? Nebo se okno dá nahradit něčím jiným, například použitím PropSheetData? Protože vidím že v PropSheetData se nachází stavový řádek, menu, prohlížeč mapy, ale nevidím že by jeho součástí byly listy (stránky) aplikace.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: eMko 22. 10. 2013, 21:01:13
Zrovna Prsht.h tam k tomu projektu přilinkován je ;-)

V čem to kompiluješ? Ve Visual Studiu? Je tam pro to přímo připravený .sln soubor, pro verzi 2005. Mně kompilace ve 2012 padá na tom, že 1 parametrický konstruktor std::bad_alloc není přístupný. Kdybych měl nainstalovaný kompilátor, který používá verze 2005, pravděpodobně by to asi buildnout šlo.

Každopádně má to pro Tebe nějaký hlubší smysl? Ten kód není špatně napsaný, ale ukázka "best practices" to taky není.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: eMko 22. 10. 2013, 21:07:57
Nutné to není. Např. takové ty oblíbené tiché instalace/samorozbalovací archivy/spouštěče nevytváří okno - ani windowsovské, ani konzolové. Každopádně začínat s C++ tím, že hrabeš rovnou na Win32 API ... chlape to je jak kdyby horolezec začínal tím, že by lezl na K2.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 22. 10. 2013, 22:38:58
eMko
Citace
Zrovna Prsht.h tam k tomu projektu přilinkován je ;-)

V čem to kompiluješ? Ve Visual Studiu? Je tam pro to přímo připravený .sln soubor, pro verzi 2005. Mně kompilace ve 2012 padá na tom, že 1 parametrický konstruktor std::bad_alloc není přístupný. Kdybych měl nainstalovaný kompilátor, který používá verze 2005, pravděpodobně by to asi buildnout šlo.


Prosím tě kde? Já ten soubor nemohu najít. Používám Visual Studio 2010 Express a většina programátorů co používá AOKTS (ti mi s tím neporadili) to používá taky.

No tak K2 to snad ne. Rozdíl je v tom že si mohu dovolit metodu pokus omyl. Já jen vyhazuju co nepotřebuju. Nepotřebuju ty okna, mě jde jen o to, aby to byla tichá aplikace, skrytá, s možnosti vyhodit chybu pokud selže načítání souboru.

Kde je ten soubor?
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: Michal Kovacic 22. 10. 2013, 23:29:28
Nutné to není. Např. takové ty oblíbené tiché instalace/samorozbalovací archivy/spouštěče nevytváří okno - ani windowsovské, ani konzolové. Každopádně začínat s C++ tím, že hrabeš rovnou na Win32 API ... chlape to je jak kdyby horolezec začínal tím, že by lezl na K2.
Tohle určitě podepíšu - pokud se učíš C++ vykašli se na Win32 API. Je to úplný nesmysl... Pokud se chceš učit programovat GUI pro Windows, na to jsou knihovny a frameworky, které jsou výrazně lepší než Win32 API. I stařičká MFC je mnohem lepší varianta... A pokud máš problém s .h souborem nebo 'case' - jakákoli učebnice C nebo C++ určitě pomůže.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: eMko 23. 10. 2013, 07:46:54
Kde je ten soubor?

Je vidět v External Dependencies v Solution Exploreru. Je možné, že to VS 2010 zobrazuje jinde nebo že to Expresska nezobrazuje vůbec.

Já jen vyhazuju co nepotřebuju.

To není nejlepší přístup - riskuješ, že Ti tam zbude spoustu mrtvýho kódu, který dokáže akorát tak udělat binec. Spíš lokalizuj co potřebuješ a to vytáhni ven. Co konkrétně potřebuješ?

BTW víš, že je to licencované pod GNU GPL a tím pádem pokud z toho něco zkopíruješ do svého projektu, tak to budeš muset licencovat pod GNU GPL?

Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 23. 10. 2013, 16:18:28
Michal Kovacic:
Jak jsem psal nehodlám vůbec dělat GUI.

eMko:
Vcelku si věřím. V tom aokts.cpp potřebuju akorád spustit funkci FileOpen ... na otevření sccénáře. Viz
Kód: [Vybrat]
scen.open(setts.ScenPath, setts.TempPath)Nechci aby ta aplikace byla vidět, to že běží. Samozřejmě že AOKTS má připravené nějaké chybové hlášky a s těmi musím počítat aby v případě chyby vyskočilo chybové okno.

Není mi úplně jasný proč je tam nastavení cesty přes soubor s nastavení (settings), dejme tomu, že bych přidal ještě jeden argument, který by definoval cestu přímo.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 23. 10. 2013, 16:21:53
A nevíš jak zjistit kde se ten prs ht.h includuje :-) ? Já ho vidím v Ex. dependencies ale nevím kde se includuje nebo jak to je propojené. Jak tu závislost vytvořit i v mojem projektu.

A díky za informace o tom GNU. To mi nevadí. Rád budu sdílet.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 23. 10. 2013, 17:04:05
Tak jsem zjistil, že ten soubor tam mám v těch ext. dep. ale stejně jako by nebyl... Tak ho do aokts.cpp iincluduju manuálně:
#include "c:/program files/microsoft sdks/windows/v7.0a/include/prsht.h"

Mám tam ještě pár chyb vesměs undeclared identifier nebo identifier not found
a to v souvislosti s Tolltips (to ale nepotřebuju, takže mohu odstranit).

A chci se zeptat jestli Sheet_HandleCommand náhodou neobsluhuje Accelerators? Protože příkaz
Kód: [Vybrat]
case ID_FILE_OPEN:
FileOpen(sheet, true, -1);
break;
ID_FILE_OPEN je definován v common.rc jako id menuitem pro otevření souboru...

Čili zde bych potřeboval radu, jak místo tohoto způsobu (switch (id) ... case ... ID_FILE_OPEN) to zprovoznit tak, abych mohl v budoucnu použít volání funkce FileOpen s parametrem cesta k souboru? Momentálně to má fungovat přes menu, které jsem zrušil.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 23. 10. 2013, 17:14:18
Ještě tady mi to hází chyby:

http://paste.ofcode.org/yeuwweRTq2riCg6FZj4afJ

Tj. tam kde se objevuje return CALLPROC();

r:\++informace\+pc improve\c++\source codes\aokts-1.0.1-r70_convertor\view\aokts.cpp(950): error C2065: 'pproc' : undeclared identifier
r:\++informace\+pc improve\c++\source codes\aokts-1.0.1-r70_convertor\view\aokts.cpp(957): error C2065: 'pproc' : undeclared identifier
r:\++informace\+pc improve\c++\source codes\aokts-1.0.1-r70_convertor\view\aokts.cpp(963): error C2065: 'pproc' : undeclared identifier
r:\++informace\+pc improve\c++\source codes\aokts-1.0.1-r70_convertor\view\aokts.cpp(976): error C2065: 'pproc' : undeclared identifier
r:\++informace\+pc improve\c++\source codes\aokts-1.0.1-r70_convertor\view\aokts.cpp(998): error C2065: 'pproc' : undeclared identifier

Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: eMko 23. 10. 2013, 19:00:06
Tohle opět vypadá na okenní kód. Hele, klasický postup je lokalizovat jen to, co potřebuješ a to zkopírovat a upravit - přináší to lepší výsledky za méně práce. Máš méně kódu, ve kterým se musíš orientovat.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 23. 10. 2013, 19:33:21
Tak tu chybu se mi povedlo vyřešit, stačilo odkomentovat DLGPROC pproc;. Ale stejně by mě zajímalo proč to hází tu chybu u tooltipů i když je nepotřebuju a chystám se to zakomentovat. Prostě mi to nedá.

error C2065: 'TOOLTIPS_CLASS' : undeclared identifier

Kód: [Vybrat]

// Add a tooltip window
HWND tooltip;
tooltip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, "AOKTS Tooltip", WS_POPUP,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
sheet, NULL, aokts, NULL);
TooltipInit(tooltip);

Vždyť na stránkách MS taky neuvádí že by se to mělo nějak předdefinovat.

http://msdn.microsoft.com/en-us/library/windows/desktop/bb760250%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/bb760250%28v=vs.85%29.aspx)

Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: Emanuel Komínek 23. 10. 2013, 20:43:16
3 sekundy na MSDN (a případná omluva, pokud je chyba ještě někde jinde):

#include <commctrl.h>
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: Mirek 23. 10. 2013, 21:10:43
Tohle není dobrý způsob jak se seznámit s C++. Naložil sis moc nových věcí najednou. Nejdřív se zlepši v C++ a potom se (pokud budeš chtít a přijde ti to užitečné) ponoř do WinAPI.

Takhle ti odlaďovat naprosté drobnosti a úplně základní věci v diskuzi, to není žádný med.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: tyvole 23. 10. 2013, 22:30:10
webhope webhope: ty raději neprogramuj a nebo zůstaň u CLI aplikací... nejdřív se nauč najít podstatný rozdíl mezi C a C++... to co tady ukazuješ je WIN32API C kod žádné pojebané C++ asi soudíš podle toho že to má koncovku *.cpp oh god why...
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 24. 10. 2013, 05:02:54
tyvole:
Ty se radši neexhibuj a mluv tady slušně. Na sprosté výrazy a urážení tady není nikdo zvědavý.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: Michal Kovacic 24. 10. 2013, 09:31:31
tyvole:
Ty se radši neexhibuj a mluv tady slušně. Na sprosté výrazy a urážení tady není nikdo zvědavý.

Hmmm...
Plně souhlasím s tím, že nkteré výrazy jsem nepatří, nicméně plně s tyvole souhlasím. Včera jsem napsal něco velice podobného a pak jsem to smazal - nemá to smysl.

Prokázal jsi naprostou neznalost základů programování v C, nepochopení rozdílů mezi C a WIN32API a nenecháš si poradit - pak doporučuji obrnit se proti ostřejším odpovědím.

Doporučuji se držet klasiky a přečíst - pozorně:
* "The C Programming Language. Brian W. Kernighan, Dennis M. Ritchie. Prentice-Hall, 1978. ISBN 0-13-110163-3" nebo
* "The C Programming Language, Second Edition. Brian W. Kernighan, Dennis M. Ritchie. Prentice-Hall, 1988. ISBN 0-13-110370-9"

a pak se možná začít ptát. České vydání někde bude také - viz google.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: eMko 24. 10. 2013, 10:41:51
tyvole:
Ty se radši neexhibuj a mluv tady slušně. Na sprosté výrazy a urážení tady není nikdo zvědavý.

Sice to tyvole napsal nevhodně, ale na rozdíl od mnoha jiných nevkusných příspěvků na internetových fórech, tento obsah stále má. Zakryj si vulgarismy a jeho příspěvek si přečti, obsahuje pro Tebe velmi cenné rady.

Potřetí a naposledy píši, že jdeš na to ze špatného konce. Programovat v C a C++ se dá naučit, bohužel ne tímto způsobem.
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: Lol Phirae 24. 10. 2013, 11:17:49
Čtení jsem ukončil u hlášky

Citace
A předtím to jelo bezproblému než jsem tam teda udělal ty změny.

a zbytek času věnoval otírání poprskaného monitoru od kafe.   :D ;D :D ;D
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: hollees 24. 10. 2013, 15:08:14
slovo PSCB_PRECREATE jsem v projektu našel jenom jednou, takže nechápu smysl té hlášky.

To možná bude ta příčina - mělo by tam být minimálně 2x - ...

já se zase bavil tady. taková správně "suchá" odpověď :-)

když nerozumím tomu co na mě kompilátor křičí, tak to se prgoramuje blbě v čemkoliv, nejen v C. Jediný řešení je pak programovat bez chyb ;-)
Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: jholas 24. 10. 2013, 15:33:22
Zdravím, začínám s C++. Snažím se z jedné opensource vytáhnout kód na dekomprimování souboru.
...

Zvědavost mi nedala a tak nějak nechápu co tam s tím děláš.
Zkompilováno MS Visual C++ 2008. release verze. na debug tam není přiložená zlib1d.lib (debug verze).
Jinak to dekomprimování/komprimování souboru kdybys koukl do zdrojáků, tak bys našel v zlibfile.h/cpp,
kde jsou dvě funkce (deflate_file, inflate_file) zakrývající implementaci knihovny zlib1.

Název: Re:C++ na Win a chyba poblíž case
Přispěvatel: webhope 25. 10. 2013, 17:01:09
Jholas:
Citace
Jinak to dekomprimování/komprimování souboru kdybys koukl do zdrojáků, tak bys našel v zlibfile.h/cpp,
kde jsou dvě funkce (deflate_file, inflate_file) zakrývající implementaci knihovny zlib1.
Tak zrovna tohle jsem udělal hned na začátku. Ale už si s tím nelámej hlavičku :-) Dík za zapojení