Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: webhope 06. 11. 2013, 11:22:23

Název: Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 06. 11. 2013, 11:22:23
Zdar,
mám to ve Visual Studiu Express 2008. Založil jsem si nový projekt win32 console app, vybral jsem Console Applicaiton a zrušil jsem precompiled header. Vložil jsem kód:
http://paste.ofcode.org/zkuqiGRSXkqpCTR7dS8JnG (http://paste.ofcode.org/zkuqiGRSXkqpCTR7dS8JnG)
A vono to píše unresolved dependencies a že tam je prý nějaký symbol _main který tam ale v kódu nikde nevidím.

Kód: [Vybrat]
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
S:\TEMP\C++\lesson03\Debug\lesson03.exe : fatal error LNK1120: 1 unresolved externals

A tady je ten tut: kód je dole. Rozdíl je v tom, že oni includují main.h kvůli tomu aby načetli windows.h což jsem ale dal do jednoho souboru.
http://www.builder.cz/rubriky/c/c--/ucime-se-winapi-zaciname-156002cz (http://www.builder.cz/rubriky/c/c--/ucime-se-winapi-zaciname-156002cz)
V čem je teda problém? Ty předchozí lekce jsem četl.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 06. 11. 2013, 11:50:26
 :( Čert aby se v tom tutorialu vyznal   ???, tak on tam nejdříve píše: vytvořte Console project a pak že mi to nejede, když to obsahuje WINAPI WinMain .... Příště se budu raději řídít svým vlastním úsudkem a vytvořím rovnou projekt Win32 windows.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: eMko 06. 11. 2013, 14:33:35
Už jsme Ti tu někde psali, že je potřeba pořádně číst ty chybové hlášky z kompilátoru.

error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

"unresolved" znamená nenalezen. To, že jej tedy nikde nevidíš, není překvapující - kompilátor taky ne ;-) .

Správně jsi napsal, že máš vytvořit Win32 projekt, ne Console application. Viz ten tutoriál

Citace
Ve Visual C++ ("File -> New ->Projects") typu Win32 Application, dále zvolíme "prázdný projekt",

Hláška o tom, že máš spustit Console Wizard, se týká Borland C++ builderu, pro Visual Sudio platí to, co je v citaci.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: Ivorne 06. 11. 2013, 18:25:32
Už jsme Ti tu někde psali, že je potřeba pořádně číst ty chybové hlášky z kompilátoru.

error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

"unresolved" znamená nenalezen. To, že jej tedy nikde nevidíš, není překvapující - kompilátor taky ne ;-) .

Unresolved symbol je hláška linkeru, takže většinou když se objeví, tak se ten symbol někde v kódu vyskytuje. Problém u linker errorů bývá, že jsi něco deklaroval ale nedefinoval, nebo že nelinkuješ nějakou knihovnu.

Unresolved symbol u symbolu, který v programu nepoužíváš se ti objeví jen v případě, že zapomeneš linkovat nějakou systémovou knihovnu. A nebo samozřejmě zapomeneš linkovat knihovnu, která je používána jinou knihovnou, kterou linkuješ.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: Sten 06. 11. 2013, 18:40:17
Konzolová aplikace používá jako vstupní bod funkci main. Ta tu ale není a proto linker řve, že ji nemůže nalézt. Ta ukázka je totiž pro Win32 aplikaci, kde je vstupním bodem (u MS klasicky v rozporu s ISO C++) funkce WinMain.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: eMko 06. 11. 2013, 19:29:51
Unresolved symbol je hláška linkeru

Myslím, že zrovna webhope to moc nerozlišuje :-)
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 22. 11. 2013, 14:07:39
Zdravím, mám celkem tři kódy na práci s fstream. Všechny tři se daří úpěšně nakomplilovat, avšak z nějakého důvodu mi nefunguje nejspíš to otevření souboru.

Tedy příklad:
Kód: [Vybrat]
std::ifstream ifs ("test.txt", std::ifstream::in);nebo
Kód: [Vybrat]
ifstream ifs("in.txt");Zdá se mi, že ani jedno ifs neobsahuje otevřený objekt. Respektive, v tom prvním kódu 
ifs.fail() vrací true. Takže bych rád přišel na to v čem je problém. Jen podotýkám, že soubor obsahuje české znaky.
Doposud jsem pracoval s kódy, které mi fungovali a tedy načítali ty data ze souborů, ale tady to prostě nejde.

1. http://paste.ofcode.org/dekmDHmYfJybaTEKTCa83t
2. http://paste.ofcode.org/pT4MXeXpuXxq8g8sU8cw2u
3. http://paste.ofcode.org/EvUF6V5ANmAhiqpwKKvZdM
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: Sten 22. 11. 2013, 14:15:29
Zdravím, mám celkem tři kódy na práci s fstream. Všechny tři se daří úpěšně nakomplilovat, avšak z nějakého důvodu mi nefunguje nejspíš to otevření souboru.

Tedy příklad:
Kód: [Vybrat]
std::ifstream ifs ("test.txt", std::ifstream::in);nebo
Kód: [Vybrat]
ifstream ifs("in.txt");Zdá se mi, že ani jedno ifs neobsahuje otevřený objekt. Respektive, v tom prvním kódu 
ifs.fail() vrací true. Takže bych rád přišel na to v čem je problém. Jen podotýkám, že soubor obsahuje české znaky.
Doposud jsem pracoval s kódy, které mi fungovali a tedy načítali ty data ze souborů, ale tady to prostě nejde.

1. http://paste.ofcode.org/dekmDHmYfJybaTEKTCa83t
2. http://paste.ofcode.org/pT4MXeXpuXxq8g8sU8cw2u
3. http://paste.ofcode.org/EvUF6V5ANmAhiqpwKKvZdM

Obsah souboru je istreamům úplně jedno, dokud ho nezačnete zpracovávat. Podle mě je tam problém jednoduše v tom, že ten soubor neexistuje, resp. se nachází jinde, než ho ten program hledá.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 22. 11. 2013, 15:12:50
jak bych mohl zjistit pracovní cestu?
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 22. 11. 2013, 15:45:15
První kód funguje.

Druhý kód funguje, ale zapíše do souboru nějaké číslo. Proč?

Kód: [Vybrat]
int i; // File modes
ifs >> i; // in, out, ate, app, trunc, binary
ofs << i;

Ve zdrojovém souboru je text ne čísla.

Třetí kód zdá se že nedělá nic (žádný text se nezobrazuje).
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: eMko 22. 11. 2013, 17:58:05
jak bych mohl zjistit pracovní cestu?

Ve WinAPI je na to metoda http://msdn.microsoft.com/en-us/library/aa364934%28v=vs.85%29.aspx .

Na linuxu funguje
Kód: [Vybrat]
#include <unistd.h>

char *getcwd(char *buffer, size_t size);

což je sice C, ne C++, ale fungovat bude.

Ještě se dá zavolat metoda ze stdlib

Kód: [Vybrat]
char* path;
_get_pgmptr(&path);
printf(path);

http://msdn.microsoft.com/en-us/library/24awhcba%28v=vs.110%29.aspx

Osobně bych preferoval tu první možnost, volat WinAPI.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: xavyer 23. 11. 2013, 08:17:26
Jak jsi správně napsal, řiď se raději vlastním úsudkem. Takové bezplatné tutoriály píší lidé, kteří na to mají čas. Nebo přesněji řečeno, kteří neumí svůj čas zpeněžit efektivněji než psaním tutoriálů. Výjimky možná jsou weby jako flipcode.org, ale ty zase nejsou pro úplné záčatečníky a takových webů ubývá. Pro nějaké obecné seznámení s C++ pro úplného začátečníka je nejlepší konzolová aplikace a příklady typu setřiď pole a vypiš na konzolu. Pro naučení GUI aplikací je Windows je nejlepší tutorial přímo od Microsoftu v MSDN, protože oni mají zájem aby tutoriál fungoval a dával smysl.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 23. 11. 2013, 12:50:45
xavyer: asi máš pravdu. No pohleď na toto:

http://paste.ofcode.org/3aDpeurZnRVAr4dvTRvKrwL
z článku o paměťových kódech. Naprostý nonsense. Kód sice jede, ale k čemu. Fakt jako do tutoriálů dávat takové nesmyslné kódy, jen to člověka zmate, co tím chtěl vlastně autor říct.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 23. 11. 2013, 12:52:51
Poznámka: ty poznámky do kódu jsem vložil já aby z toho aspoň trochu bylo jasné co to dělá.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: eMko 23. 11. 2013, 16:55:38
No pohleď na toto:

http://paste.ofcode.org/3aDpeurZnRVAr4dvTRvKrwL

Citace
// 3 - Size of buffer (it is 1000*8 bites)

yes, to "bite" (= kousnout, uštnkout) místo "byte" celkem sedí :-) . Jinak kód mi nepřipadá prvoplánově nesmyslný - demonstruje na něm jak funguje posílání věcí do streamu. Z jakého tutorialu je, nebo z jakého kontextu jsi ho vzal? Taková se streamy je téměř denní chleba v prostředích jako je C++, Java nebo C#.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 23. 11. 2013, 20:32:28
"Paměťové proudy v C++"
Povšimni si věty "V dalším příkladu předvedu jak zapisovat za konec řetězce."
Místo aby proběhl nějaký zápis, tak to celé selže. Kdyby ten ukázkový kód byl dobrý, tak by měly fungovat obě možnosti if bloku podle toho jak dlouhý text zadáš. Což se očividně neděje. A prý se už dnes strstream nepoužívá, takže mám použít stringstream.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: eMko 23. 11. 2013, 21:02:19
Tak zrovna označení strstream za deprecated má smysl, viz http://stackoverflow.com/questions/2820221/why-was-stdstrstream-deprecated .

Jinak co se týče zvlášť českých programovacích tutoriálů, víc než kde jinde platí "what you pay is what you get". Navíc v dnešní době se stačí podívat různě po internetu a získat i dobré knihy zadarmo (odkazy sem samozřejmě dávat nebudu, ale stačí použít google - "název knihy".pdf)
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 26. 11. 2013, 14:46:54
Nevíte někdo kdo napsal seriál o C/C++ na builderu cz? Je tam jeden článek:
http://www.builder.cz/rubriky/c/c--/pole-s-libovolnym-intervalem-indexovani-v-c--155896cz
který obsahuje nefunkční odkaz na array.h (údajně obsahuje detailní poznámky k projektu) tak by mě zajímalo kde tenhle soubor stáhnout.
Název: Re:Nefunguje kód z tutoriálu v C++
Přispěvatel: webhope 26. 11. 2013, 16:51:30
Tak to je hustý, mě se povedlo najít zálohu z roku 2002:
http://web.archive.org/web/20020330155834/http://www.builder.cz/data/array.h
tuhle stránku všem vřele doporučuju, až budete hledat nějaký dokument na starém nefunkčním linku.