Nefunguje kód z tutoriálu v C++

webhope

Nefunguje kód z tutoriálu v C++
« kdy: 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
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
V čem je teda problém? Ty předchozí lekce jsem četl.
« Poslední změna: 06. 11. 2013, 11:40:11 od Petr Krčmář »


webhope

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #1 kdy: 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.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Nefunguje kód z tutoriálu v C++
« Odpověď #2 kdy: 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.

Ivorne

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #3 kdy: 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š.

Sten

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #4 kdy: 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.


eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Nefunguje kód z tutoriálu v C++
« Odpověď #5 kdy: 06. 11. 2013, 19:29:51 »
Unresolved symbol je hláška linkeru

Myslím, že zrovna webhope to moc nerozlišuje :-)

webhope

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #6 kdy: 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

Sten

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #7 kdy: 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á.

webhope

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #8 kdy: 22. 11. 2013, 15:12:50 »
jak bych mohl zjistit pracovní cestu?

webhope

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #9 kdy: 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).

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Nefunguje kód z tutoriálu v C++
« Odpověď #10 kdy: 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.

xavyer

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #11 kdy: 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.

webhope

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #12 kdy: 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.

webhope

Re:Nefunguje kód z tutoriálu v C++
« Odpověď #13 kdy: 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á.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Nefunguje kód z tutoriálu v C++
« Odpověď #14 kdy: 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#.