Różnica miedzy wersjami gcc

0

Witam wszystkich.
Uczę się z moim 11 letnim synem programowania. Chciałem zacząć od pythona bo przydałby mi się w pracy ale zanim się przygotowałem on już zaczął pisać w c++ i kategorycznie odmawia porzucenia tej ścieżki. Cóż robić, zacząłem zatem porządkować mocno zakurzoną wiedzę ale że programista ze mnie żaden a ostani kontakt z programowaniem miałem na studiach grubo ponad 20 lat temu to od razu napotkałem na pierwszy problem: ja używam OSX i Xcode: gcc 4.2.1 a on Windows i Code Block: gcc 5.1.0.

i tak na OSX:

string Imie;
plik.open(Imie, ios::out);

zakłada plik o nazwie ze zmiennej Imie bez żadnych problemów.

Niestety na Windowsach muszę użyć:

string Imie;
plik.open(Imie.c_str(), ios::out);

reszta kodu jest taka sama na obu platformach.

No i teraz mam kłopot bo za mało wiem i nie jestem pewien skąd ta różnica. Żyłem do tej pory w błogim przekonaniu, że kod mogę sobie przenosić dowolnie między platformami. Podejrzewam że różnica bierze się z różnicy wersji pomiędzy kompilatorami ale pewności mi brak. Pomagam mu pisać prostą grę i zastanawiam się na jakie jeszcze problemy się natknę w związku z różnicą platform i używanych wersji gcc. Możecie mi to wytłumaczyć i coś doradzić bo droga przede mną wyboista, doświadczenie praktycznie żadne, wygospodarować musiałem 2 godziny dziennie na C++ co samo w sobie jest bolesne (i lekko traumatyczne bo wykłady i ćwiczenia z Bieleckim miałem ) wiec nie potrzebuje podobnych problemów w przyszłości ;).
pozdrawiam

0

Z tego co przeczytałem tutaj wynika że:

  • W C++11 możesz użyć string jako argument do open() (Czyli tak jak robisz to na OSX)
  • W wersjach starszych można użyć tylko string znanego z C czyli tablicę char zakończoną \0.
0

Dziękuję za odpowiedź. No tak ale na chłopski rozum to ja mam wersję starszą (4.2.1) a on nowszą (5.1.0).
pozdrawiam

0

Wersja kompilatora nie jest w tym momencie istotna - ważny jest używany standard.
Możesz użyć flagi -std=c++11 przy kompilacji aby kompilator używał wersji C++11, bo możliwe że domyślnie ustawiona jest wersja starsza.

0

Według standardu obie wersje są poprawne - http://en.cppreference.com/w/cpp/io/basic_fstream/open , ale od c++11.

Polecam jednak zainstalować gcc 7.x. Jest dostępne w homebrew.

0

Dziękuję za odpowiedź. Czyli reasumując: po pierwsze sprawdzić flagi kompilacji w obu IDE, po drugie dla porządku na OSX zainstalować wersję gcc 7.x z homebrew. Mam jeszcze jedną wątpliwość: następnym krokiem po zakończeniu pisania gry w wersji input/output z terminala będzie naturalnie przerobienie gry na wersję okienkową/graficzną (brakuje mi zdecydowanie słownictwa ;)). Czy różnice w środowiskach graficznych wymagają jakiś zmian w kodzie c++ pomiędzy platformami czy też operuje on na standardowych multiplatformowych bibliotekach? Jeśli tak to jakich, może Qt? Chodzi mi o to czy już teraz stawiać wirtualkę z windowsami by uniknąc jakiś kłopotów w przyszłości, czy mogę spokojnie zostać na OSX i Xcode ?

0

po pierwsze sprawdzić flagi kompilacji w obu IDE

Nie tyle co sprawdzić, a dodać do tego z Windowsa flagę -std=c++11. OSX widać że już działa na tej wersji.

0

Skoro nie chce Pythona i upiera się przy C++, to może przekonasz go wspominając o C z czterema plusami? C# :P

Zainstalujecie sobie obaj MonoDevelop i powinno nie być niezgodności między systemami.

Jak będziecie chcieli zrobić aplikację okienkową, to po prostu skorzystacie z WinForms ( http://www.mono-project.com/docs/gui/winforms/getting-started-guide/ ).

0

OK W Codeblock settings>linker settings dodałem w prawym oknie -std=c++11. lecz problem dalej występuje. tj: dostaję bład:
main.cpp|16|error: no matching function for call to 'std::basic_fstream<char>::open(std::string&)'|
przy próbie skompilowania:

plik.open(Imie, ios::out);```
Pomóżcie bo już się pochwaliłem że rozwiązałem ten problem ;).

Jeśli zaś chodzi o poradę od spine dotyczącą MonoDevelop to rzeczywiście chodzi mi o uniknięcie w przyszłości, jak będziemy się zagłębiali w temat potencjalnych problemów.  Czy możecie mi doradzić co będzie prostsze, mniej czasochłonne: instalacja monoDevelop czy visual studio na Macu? Potrzebuje jak najprostszej solucji wiadomo: dużo obowiązków ,brak czasu więc chcę od razu zacząć z sensem. Wiem że najprościej byłoby zainstalować Windows w wirtualce, ale ponieważ z wiekiem zaskakująco prawilny się zrobiłem i  nie mam legalnej licencji Windowsów chciałbym uniknąć ich zakupu. Linux odpada bo myślę że syn nie potrzebuje na tym etapie dodatkowych utrudnień.
Dziękuję za pomoc.
0

Wydaję mi się że umieściłeś -std=c++11 w złym miejscu. Z tego co przeczytałem tutaj musisz:

  • Wejść w ustawienia kompilatora (Settings -> Compiler)
  • W Selected Compiler zaznacz GNU GCC Compiler
  • Poniżej zaznacz Compiler Settings a następnie Compiler Flags
  • Tam znajdziesz listę i musisz zaznaczyć: Have g++ follow the C++11 ISO C++ language standard [-std=c++11]
  • Ok do zapisu ;)
0

Dziękuję, zadziałało po oznaczeniu w Settings>compiler>global compiler settings> GNU GCC Compiler opcji : Have g++ follow the C++ language standard [-std=c++11]. Dzięki wielkie za pomoc, będę mógł się dzisiaj puszyć do woli. ;)

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