Błąd kompilacji

0

Dlaczego przy składni z MSV:

#include<iostream>
#include <tchar.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        ...

	return 0;
}
 

spoj wywala błąd kompilacji, natomiast przy takiej składni:

#include<iostream>
using namespace std;

int main()
{
        ...

	return 0;
}

przechodzi bez problemu.

Może to ja gdzieś popełniam błąd w pierwszej składni?

0

Pewnie tworzysz zły projekt, nie można sobie od tak zmienić nazwy funkcji main

0

VS (w opisie miało być pewnie MS VS a nie MSV) tak domyślnie robi.

Ogólnie main jak wiadomo wygląda tak:

int main();

albo tak:

int main(int argc, char* argv[]);

Microsoft jednak pomyślał że szkoda że linia poleceń to zwykłe ASCII cstringi i doszedł do wniosku że fajnie by było móc tworzyć main z unicode. Tak powstało rozszerzenie:

int wmain(int argc, wchar_t* argv[]);

Ok, ale co z tmainem?

int _tmain(int argc, _TCHAR* argv[])

To makro które zmienia typ maina w zależności od ustawień ASCII/Unicode aplikacji.

Spoj czegoś takiego nie zna więc słusznie (wg. niego) traktuje to jako błąd.

0

Dzięki, tak naprawdę mało z tego zrozumiałem.

Zacznijmy od początku...
Dlaczego istnieją dwie różne wersje?

int main();

albo tak:

int main(int argc, char* argv[]);

0

powiedzcie mi bo kupiłem sobie niedawno najnowszą wersje 2010 i kiedy uruchamiam proste programiki które wcześniej pisałem w DevC++ to nie wiem jak skompilować program, właściwie nie widze takiej opcji.

0

Najlepiej stwórz nowy projekt i pododawaj do niego swoje pliki .cpp, projekt tworzysz bodajże pod F7.

0

A nie da się od razu bezpośrednio po otwarciu .cpp skompilować??

0

Dlaczego istnieją dwie różne wersje?

To trochę skomplikowane jeśli nie masz doświadczenia z programami konsolowymi.

Ogólnie main() i main(int argc, char* argv[]) działają dokładnie tak samo. Różnica polega na tym że ten drugi main dostaje dodatkowe parametry, które w przypadku pierwszego są ignorowane.

Czym są te parametry - w dawnych czasach DOSa programy uruchamiało się z lini poleceń. Czyli np. chcąc uruchomić program 'usun_folder' wpisywało się na ekranie 'usun_folder' i naciskało enter, po czym program się uruchamiał. Czasami zachodziła jednak potrzeba przekazania parametru dla programu. Na przykład program 'usun_folder' mógłby prosić użytkownika o podanie nazwy folderu, ale znacznie szybciej byłoby napisać 'usun_folder moje_zdjecia' - i tekst 'moje_zdjecia' jest w tym przypadku parametrem programu. Może być więcej parametrów, na przykład 'usun_folder moje_zdjecia --podfoldery' (dodatkowy parametr '--podfoldery' który rozkazuje, na przykład, usunąć również podfoldery).
Tak czy inaczej wszystkie te parametry idą do tablicy argv -
argv[0] = "usun_folder" // zerowy parametr to zawsze ścieżka do programu
argv[1] = "moje_zdjecia"
argv[2] = "--podfoldery"
Argc służy do określania ilości parametrów - w tym przypadku wynosi 3.

W aplikacjach Windowsowych parametry są coraz mniej przydatne. W sumie program uruchamiany dwuklikiem dostaje tylko jeden parametr - ścieżkę do siebie (sprawdź jeśli chcesz). Jeśli masz ochotę poeksperymentować, możesz utworzyć skrót do programu i tam zmienić parametr 'wiersz polecenia' albo uruchomić stare, dobre cmd (klawisz logo_windows + R, wpisujesz cmd i enter), przejść do folderu z twoim programem i uruchomić go z parametrami.

Podsumowując, dopóki nie chcesz żeby twój program był uruchamiany za pomocą cmd, możesz równie dobrze używać zwykłego main() bez parametrów.

A nie da się od razu bezpośrednio po otwarciu .cpp skompilować??

Raczej nie, trzeba stworzyć projekt (taka uroda VS).

0

W aplikacjach Windowsowych parametry są coraz mniej przydatne.
Uruchomienie dokumentu oznacza uruchomienie skojarzonego z nim programu ze ścieżką do otwieranego pliku jako argumentem.

0

Moim skromnym zdaniem UTF-8 jest bardziej optymalny względem "szerokich charów": char ma 2 bajty tylko wtedy gdy musi, a "ujemna" wartość informuje że "ten" znak zajmuje dwa bajty. Jako że UTF-8 jest stosowany na Unixach od dawna, twórcy GCC stwierdzili że jest dobrze jak jest i nie trzeba marnować 2 bajtów na literkę 'a'.

Podsumowując: _tmain i to wynalazeki kompilatora VC++, który nie jest w standardzie języka. Spoj i ideone używają kompilatorów GCC, a w nich nie ma takich niestandardowych ficzerów.

Taka mała rada: Jeśli piszesz algorytmy do SPOJa lub inne tego typu serwisy, olej VS, a zainstaluj Code::Blocksa, który używa w przybliżeniu tego samego kompilatora. Unikniesz wielu nieporozumień, a poza tym nie będziesz musiał do każdego zadania tworzyć nowego projektu, bo da się kompilować i uruchamiać pojedyncze pliki .cpp.

0

Dla mnie UTF-16 to diabelski wynalazek Windowsa (całe jego API się na tym opiera).
I generalnie stwarza takie same problemy jak stare kodowania - znaki specjalne są wieloznakowe.

A UTF-8:

  • może się przetwarzać programem który czyta tekst jako ASCII bez problemu
  • od razu wiadomo ile znak ma bajtów
  • dla podstawowych znaków zajmuje tyle samo miejsca co ASCII
  • można automatycznie wykryć

A do autora wątku:

  1. VS 2010 jak napisałeś generuje dziwaczne main ale:
  2. na pewno można użyć swojego main(), przenośnego jeśli (nie wiem czy wszystko niezbędne):

a) użyjesz tej wersji:

int main(int argc, char* argv[])
{ // treść
}

b) ustawisz:

Project \ Properties \ Linker \ System \ Subsystem
na wartość: Console (/SUBSYSTEM:CONSOLE)
Project \ Properties \ Configuration Properties \ Character Set
na wartość: Use Multi-Byte Character Set

plik .cpp z main w tej postaci nie potrzebuje:
#include <windows.h>

1 użytkowników online, w tym zalogowanych: 0, gości: 1