Błąd kompilacji

Odpowiedz Nowy wątek
2011-08-18 19:20
pyt.
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?

Pozostało 580 znaków

2011-08-18 19:45
0

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


Pozostało 580 znaków

2011-08-18 22:51
msm
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.

edytowany 3x, ostatnio: msm, 2011-08-18 22:52

Pozostało 580 znaków

2011-08-18 23:30
pyt.
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[]);

Pozostało 580 znaków

2011-08-18 23:36
MSVS2010
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.

Jakimś cudem uzbierałeś na Visual Studio 2010, a utworzyć projektu nie potrafisz :D? - Rev 2011-08-19 00:49
Napisz do pomocy technicznej :D - Sarrus 2011-08-19 07:43
@Sarrus, jesteś okrutny. ;) - somekind 2011-08-19 21:07

Pozostało 580 znaków

2011-08-19 00:39
0

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

Pozostało 580 znaków

2011-08-19 01:00
MSVS2010
0

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

Pozostało 580 znaków

2011-08-19 01:01
msm
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).

edytowany 2x, ostatnio: msm, 2011-08-19 01:02

Pozostało 580 znaków

2011-08-19 06:19
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.

True, zapomniałem o tym. - msm 2011-08-19 06:48

Pozostało 580 znaków

2011-08-19 17:17
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.

ujemna" wartość informuje że "ten" znak zajmuje dwa bajty - jakieś źródło do tego? Mogę się mylić, ale to, czy char jest signed czy unsigned zależy tylko od implementacji kompilatora. - Afish 2011-08-19 18:17
Ujemna to był skrót myślowy od mającej ustawiony ósmy bit. Co do Unicode'u, niedawno świetna odpowiedź została wysłana tutaj: http://programmers.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful - Zjarek 2011-08-19 18:25
niekoniecznie dwa, bo jeden znak w UTF-8 może zajmować od 1 do 4 bajtów - Azarien 2011-08-19 21:09

Pozostało 580 znaków

2011-08-19 19:58
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>

edytowany 2x, ostatnio: vpiotr, 2011-08-19 20:08

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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