Dlaczego program ten jest błędnie odrzucany przez trzy kompilatory C++?

Mam pewne trudności ze skompilowaniem napisanego przeze mnie programu C++.

Ten program jest bardzo prosty i, według mojej najlepszej wiedzy, jest zgodny ze wszystkimi zasadami określonymi w standardzie C++. Przeczytałem całą ISO/IEC 14882:2003 dwa razy, aby się upewnić.

Program wygląda następująco:

Tutaj wpisz opis obrazka

Oto wyjście, które otrzymałem podczas próby skompilowania tego programu z Visual C++ 2010:

c:\dev>cl /nologo helloworld.png
cl : Command line warning D9024 : unrecognized source file type 'helloworld.png', object file assumed
helloworld.png : fatal error LNK1107: invalid or corrupt file: cannot read at 0x5172

Przerażony, próbowałem g++ 4.5.2, ale był równie nieprzydatny:

c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status

Uznałem, że Clang (Wersja 3.0 trunk 127530) musi działać, ponieważ jest bardzo chwalony za zgodność ze standardami. Niestety, nie dał mi nawet jednego ze swoich ładnych, podświetlonych komunikatów o błędach:

c:\dev>clang++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
clang++: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

Szczerze mówiąc, tak naprawdę Nie wiem, co oznacza którykolwiek z tych komunikatów o błędzie.

Wiele innych programów C++ posiada pliki źródłowe z .rozszerzenie cpp , więc pomyślałem, że może powinienem zmienić nazwę pliku. Zmieniłem nazwę na helloworld.cpp , ale to nie pomogło. Myślę, że w Clang jest bardzo poważny błąd, ponieważ gdy próbowałem go użyć do kompilacji programu, to się wywróciło, Wydrukowano " 84 ostrzeżenia i wygenerowano 20 błędów."i sprawił, że mój komputer często bił!

Co zrobiłem źle? Czy przegapiłem jakąś krytyczną część standardu C++? A może wszystkie trzy Kompilatory są naprawdę tak zepsute, że nie mogą skompilować tego prostego programu?
Author: James McNellis, 2011-04-01

30 answers

W standardzie §2.1 / 1 określa:

Fizyczne znaki plików źródłowych są mapowane, w sposób zdefiniowany w implementacji, do podstawowego zestawu znaków źródłowych (wprowadzenie znaków nowej linii dla wskaźników końca linii), jeśli to konieczne.

Twój kompilator nie obsługuje tego formatu (aka nie może odwzorować go na podstawowy zestaw znaków źródłowych ), więc nie może przejść do dalszych etapów przetwarzania, stąd błąd. Jest całkowicie możliwe, że Twój kompilator obsługuje mapowanie z obrazu do podstawowego zestawu znaków źródłowych, ale nie jest wymagane.

Ponieważ mapowanie to jest zdefiniowane w implementacji, musisz przejrzeć dokumentację implementacji, aby zobaczyć obsługiwane formaty plików. Zazwyczaj każdy główny producent kompilatora obsługuje (kanonicznie zdefiniowane) pliki tekstowe: każdy plik wyprodukowany przez edytor tekstu, zazwyczaj serię znaków.


Zauważ, że standard C++ jest oparty na standardzie C (§1.1/2), a standard C (99) mówi, w §1.2:

Ten Międzynarodowy Standard nie określa
- mechanizm, za pomocą którego programy C są przekształcane do wykorzystania przez przetwarzanie danych system;
- mechanizm, za pomocą którego wywoływane są programy C do wykorzystania przez przetwarzanie danych system;
- mechanizm, za pomocą którego dane wejściowe są przekształcane do wykorzystania przez program C;

Więc, znowu, traktowanie plików źródłowych jest czymś, co musisz znaleźć w dokumentacji kompilatorów.

 174
Author: GManNickG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 01:45:09

Oryginalnie z Overv @ reddit .

 576
Author: Sven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-16 09:31:00

Spróbuj w ten sposób:

Tutaj wpisz opis obrazka

 320
Author: Benoit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 13:55:50

Twoje < i >, ( oraz ), { i } wydaje się, że nie pasują zbyt dobrze; spróbuj narysować je lepiej.

 212
Author: Bala R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-03 01:44:58

Możesz wypróbować następujący skrypt Pythona. Należy pamiętać, że należy zainstalować PIL i pytesser .

from pytesser import *
image = Image.open('helloworld.png')  # Open image object using PIL
print image_to_string(image)     # Run tesseract.exe on image

Aby go użyć, wykonaj:

python script.py > helloworld.cpp; g++ helloworld.cpp
 157
Author: sje397,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 01:07:59

Zapomniałeś użyć Comic Sans jako czcionki, dlatego jego błąd.

 111
Author: bl00dshooter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 00:59:11

Nie widzę nowej linii po tym ostatnim nawiasie.

Jak wiesz: "jeśli plik źródłowy, który nie jest pusty, nie kończy się znakiem nowej linii, ... zachowanie jest nieokreślone".

 76
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 01:14:20

Ten program jest poprawny -- nie mogę znaleźć żadnych błędów.

Zgaduję, że masz wirusa na swojej maszynie. Najlepiej byłoby sformatować dysk i ponownie zainstalować system operacyjny.

Daj nam znać, jak to działa, lub jeśli potrzebujesz pomocy przy ponownej instalacji.

Nienawidzę wirusów.

 75
Author: Jerry Asher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 04:22:47

Odkryłem, że pomaga nie pisać kodu na szybie mojego monitora za pomocą magicznego markera, mimo że wygląda ładnie, gdy jest naprawdę czarny. Ekran wypełnia się zbyt szybko, a ludzie, którzy dają mi czysty monitor, nazywają mnie co tydzień.

Kilku moich pracowników (jestem menedżerem) kupuje mi jeden z tych czerwonych komputerów z pokrętłami. Powiedzieli, że nie będę potrzebował markerów i mogę wyczyścić ekran sam, gdy jest pełny, ale muszę być ostrożny, potrząsając nim. I przypuszczam, że to delikatne.

Dlatego zatrudniam mądrych ludzi.

 63
Author: the Tin Man,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 05:48:24

File format not recognized musisz poprawnie sformatować swój plik. Oznacza to użycie odpowiednich kolorów i czcionek dla kodu. Zobacz konkretne dokumenty dla każdego kompilatora, ponieważ te kolory różnią się między kompilatorami;)

 60
Author: helloworld922,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 00:57:36

Zapomniałeś o pre-procesorze. Spróbuj tego:

pngtopnm helloworld.png | ocrad | g++ -x 'c++' -
 57
Author: Andrew Cooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-20 22:43:32

Napisałeś program ręcznie, a następnie zeskanowałeś go do komputera? To właśnie sugeruje " helloworld.png". Jeśli tak jest, musisz mieć świadomość, że standard C++ (nawet w jego najnowszej wersji) nie wymaga obecności optycznego rozpoznawania znaków, a niestety nie jest on opcjonalny w żadnym aktualnym kompilatorze.

Warto rozważyć transpozycję grafiki do formatu tekstowego. Można użyć dowolnego edytora zwykłego tekstu; użycie słowa procesor, chociaż może generować ładny Wydruk, najprawdopodobniej spowoduje ten sam błąd, który pojawia się podczas próby skanowania.

Jeśli jesteś naprawdę poszukiwaczem przygód, możesz spróbować napisać swój kod w edytorze tekstu. Wydrukuj go, najlepiej używając czcionki typu OCR-a . Następnie weź swój wydruk i zeskanuj go z powrotem. Skanowanie można następnie uruchomić za pośrednictwem zewnętrznego pakietu OCR w celu wygenerowania formularza tekstowego. Formularz tekstowy może być następnie skompilowany przy użyciu jednego z wielu standardowych Kompilatory.

Uważaj jednak na wielki koszt papieru, który poniesie podczas fazy debugowania.

 49
Author: Kevin Lacquement,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 00:57:53

Narysuj poniższy include, aby skompilować:

#include <ChuckNorris>
Słyszałem, że potrafi kompilować Błędy składniowe...
 46
Author: Grofit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 12:32:17

Niestety, wybrałeś trzy Kompilatory, które obsługują wiele języków, nie tylko C++. Wszyscy muszą odgadnąć język programowania, którego używałeś. Jak zapewne już wiesz, Format PNG jest odpowiedni dla wszystkich języków programowania, nie tylko C++.

Zazwyczaj kompilator potrafi sam zrozumieć język. Na przykład, jeśli PNG jest oczywiście narysowany kredkami, kompilator będzie wiedział, że zawiera Visual Basic. Jeśli wygląda jak narysowany mechanicznym ołówek, łatwo rozpoznać inżyniera w pracy, piszącego kod FORTRAN.

Ten drugi krok nie pomaga również kompilatorowi, w tym przypadku. C i C++ wyglądają zbyt podobnie do #include. Dlatego musisz pomóc kompilatorowi zdecydować, jaki to naprawdę jest język. Możesz użyć niestandardowych środków. Na przykład kompilator Visual Studio akceptuje argumenty linii poleceń /TC i /tp, lub możesz użyć opcji "Compile as: C++" w pliku projektu. GCC i CLang mają własne mechanizmy, których nie znam.

Dlatego zalecałbym użycie standardowej metody, aby powiedzieć kompilatorowi, że poniższy kod jest w C++. Jak już odkryłeś, kompilatory C++ są bardzo wybredne co do tego, co akceptują. Dlatego standardowym sposobem identyfikacji C++ jest dodawanie do kodu C++ przez programistów. Na przykład, następująca linia wyjaśni kompilatorowi, że to, co następuje, to C++ (i lepiej skompilować go bez skarg).

// To the compiler: I know where you are installed. No funny games, capice?
 41
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 11:22:40

Czy twój kompilator jest ustawiony w trybie eksperckim?! Jeśli tak, nie powinno się kompilować. Współczesne Kompilatory mają dość " Hello World!"

 33
Author: zamanbakshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 16:30:21

Spróbuj tego:

Widzisz dinozaura w promie kosmicznym?

 33
Author: Chris Cudmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 04:58:33

OCR Says:

N lml_�e <loJ+_e__}

.lnt Mk.,n ( ln+ _rSC Lhc_yh )
h_S_
_l

s_l . co__ <, " H llo uo/_d ! '` << s l� . ena_ .
TP__rn _ |
_|
Co jest cholernie dobre, szczerze mówiąc.
 27
Author: Robin Duckett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 13:21:38
Helloworld.png: file not recognized: File format not recognized

Oczywiście powinieneś sformatować swój dysk twardy.

Naprawdę, te błędy nie są takie trudne do odczytania.
 26
Author: Chris Cudmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 13:33:21

Przekonwertowałem Twój program z PNG do ASCII, ale jeszcze się nie skompilował. Dla twojej informacji, próbowałem z szerokością linii 100 i 250 znaków, ale oba dają porównywalne wyniki.

   `         `  .     `.      `         ...                                                         
   +:: ..-.. --.:`:. `-` .....:`../--`.. `-                                                         
           `      `       ````                                                                      
                                                                      `                             
   ` `` .`       ``    .`    `.               `` .      -``-          ..                            
   .`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :                            
   .`         ` `    ` .`         ````:``  -                  ` ``-.`  `                            
   `-                                ..                           ``                                
    .       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `       
           `:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `     
            ``  `       ```.      ``    ````    `       `     `        `    `         `   `   .     
            : -...`.- .` .:/ `                                                                      
    -       `             `` .                                                                      
    -`                                                                                              
    `                                                                                               
 21
Author: Yves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 12:31:31

Pierwszy problem polega na tym, że próbujesz zwrócić nieprawidłową wartość na końcu głównej funkcji. Standard C++ nakazuje, że zwracanym typem main() jest int, ale zamiast tego próbujesz zwrócić pusty zestaw.

Innym problemem jest - przynajmniej w g++ - to, że kompilator wydedukuje język używany z sufiksu pliku. From g++(1):

Dla dowolnego pliku wejściowego, plik sufiks nazwy określa jakiego rodzaju kompilacja jest wykonywana:

File.cc plik.plik cp.plik cxx.plik cpp.Plik CPP.plik c++.C

Kod źródłowy C++, który musi być wstępnie przetworzony. Zauważ, że w .cxx, the dwie ostatnie litery muszą być dosłownie x .podobnie,.C odnosi się do a literalna litera C.

Naprawienie ich powinno pozostawić w pełni działającą aplikację Hello World, co widać z demo tutaj .

 16
Author: Antti Laine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 14:54:48

Twoja czcionka jest do bani, jak parser może to odczytać? Weź udział w kursie kaligrafii.

 15
Author: Frank Osterfeld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 11:47:34

Twoje Kompilatory oczekują ASCII , ale ten program jest Oczywiście napisany przy użyciu EBCDIC.

 13
Author: oosterwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 12:26:47

Próbujesz skompilować obraz.

Wpisz to, co ręcznie zapisałeś w dokumencie o nazwie main.cpp, uruchom ten plik przez kompilator, a następnie uruchom plik wyjściowy.

 8
Author: William,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 12:00:59

Musisz określić precyzję wyjścia poprzedzoną dwukropkiem bezpośrednio przed końcowym nawiasem zamykającym . Ponieważ wyjście nie jest numeryczne, dokładność wynosi zero, więc potrzebujesz tego -

:0}

 7
Author: MikeJ-UK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 11:14:52

Dodaj:

using namespace std;

Zaraz po include: P: D

 6
Author: Spyros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 00:56:32

Wygląda na to, że Twój kompilator nie obsługuje plików w takim hmm... kodowanie. Spróbuj przekonwertować go do ASCII.

 6
Author: Kirill V. Lyadvinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 04:53:35

Problem leży w definicji składni, spróbuj użyć linijki i kompasów dla bardziej klasycznego opisu!

Pozdrawiam,

 5
Author: quarkonium,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 10:57:06

Spróbuj zmienić interfejs wejściowy. C++ oczekuje, że klawiatura zostanie podłączona do komputera, a nie skaner. Mogą tu występować problemy związane z konfliktami między urządzeniami peryferyjnymi. Nie sprawdzałem w standardzie ISO, czy interfejs wprowadzania klawiatury jest obowiązkowy, ale dotyczy to wszystkich kompilatorów, których kiedykolwiek używałem. Ale może wejście skanera jest teraz dostępne w C99 i w tym przypadku twój program rzeczywiście powinien działać. Jeśli nie będziesz musiał czekać na następne standardowe wydanie i aktualizację kompilatorów.

 5
Author: kriss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 12:07:31

Mógłbyś wypróbować różne kolory nawiasów, może jakiś zielony lub czerwony by pomógł ? Myślę, że Twój kompilator nie potrafi rozpoznać czarnego tuszu: p

 5
Author: lothar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 12:17:25

Czy tylko ja nie mogę rozpoznać znaku pomiędzy 'return' a średnikiem? To może być to!

 5
Author: techolic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 13:58:20