• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problemy z kompilowaniem C++ w Sublime Text, kompilator G++ MinGW generuje błędy, a w CodeBlocks jest OK

Object Storage Arubacloud
+1 głos
514 wizyt
pytanie zadane 27 kwietnia 2017 w C i C++ przez andrut Użytkownik (870 p.)
edycja 1 maja 2017 przez andrut

Niedawno zacząłem uczyć się C++. Wcześniej działałem głównie w PHP, korzystając głównie z Notepad++, a później z Sublime Text. Ucząc się C++ nie chciałem za bardzo przesiadać się na inne oprogramowanie, więc porzuciłem CodeBlocks. Zainstalowałem u siebie na komputerze (z Windows 10) MinGW, "podpiąłem" kompilator G++ pod Sublime Text... i tu zaczęły się problemy...

Przykładowo w 7 odc. kursu pana Zelenta: https://www.youtube.com/watch?v=h2Taf16gQDI&t=723s
Jest program, który odczytuje dane z pliku i wypisuje je na ekranie (około 12 minuty filmu jest pokazane jaki powinien być efekt).

Napisałem ten program w Sublime, skompilowałem go i program po uruchomieniu w ułamku sekundy wyłącza się. Po otworzeniu pliku main.cpp w CodeBlocks i uruchomieniu przez F9 program uruchamia się, wyświetla zawartość pliku i (tak jak to zamierzyłem) czeka na wprowadzenie klawisza Enter, po czym normalnie kończy pracę.

Czy ktoś z Was próbował działać w C++ za pomocą Sublime Text mające tego typu problemy? Dodam, że w innych programach z kursu, po kompilacji poprzez MinGW też zdarzają się pewne problemy...

EDIT (27.04.2017 23:29): Dodaję cały kod programu:
http://wklej.org/id/3099248/
Zarówno Sublime, jak i serwis wklej.org nie pokolorował mi składni stringa linia. CodeBlocks zrobił to, ale na zielono, a nie tak int czy float na niebiesko. Myślę, że w tym może tkwić błąd.
 

cout << "test" << endl;
getchar();

Powyższe służy tylko i wyłącznie do testu czy program działa do momentu deklaracji zmiennej linia.

EDIT (01.05.2017 17:05): Powyższe nie jest kwestią zastosowania getchar(), bądź niezastosowania go. Inne programy też nie działają mi poprawnie poza CodeBlocks.

Przykład z ciągiem liczb Fibonacciego (https://youtu.be/Rt1HnMdzINo?list=PLOYHgt8dIdoxx0Y5wzs7CFpmBzb40PaDo):

[serwis wklej.org ma w tym momencie problem z serwerem, więc wrzucam tutaj]

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <stdio.h>

using namespace std;

  long double fibonacci[100000];
  int n;

  int main() {
    cout << "Ile liczb Fibonacciego mam wyznaczyc? ";
    cin >> n;


    fibonacci[0] = 1;
    fibonacci[1] = 1;

    for (int i=2; i<n; i++) {
      fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
    }

    cout << setprecision(10000);

    for (int i=0; i<n; i++) {
      cout << endl << "nr " << i+1 << ": " << fibonacci[i];
    }

    getchar(); getchar();
    return 0;
  }

Powyższy kod wykonuje się poprawnie po potraktowaniu go F9 w C::B. Program go kompiluje, uruchamia i po wpisaniu liczby np. 21000 wszystko śmiga tak jak należy.
Tymczasem w Sublime Text po uruchomieniu CRTL + B kompilator wykonuje pracę w 0.9s i...
Po wpisaniu ile liczb Fibonacciego ma program wyznaczyć otrzymuję wyniki w stylu:
nr 1: -0
nr 2: -0
nr 3: -0
nr 4: -2
nr 5: -1.4916681462400413e-154
nr 6: -0
nr 7: -231584178474632390000... i sporo zer
kolejne liczny wyglądają podobnie...

Czy ktoś ma jakiś pomysł w czym tkwi problem?
Dodam tylko, że specjalnie na innym komputerze zainstalowałem Sublime i MinGW, po uruchomieniu tam powyższych programów problem jest taki sam.

2 odpowiedzi

+1 głos
odpowiedź 27 kwietnia 2017 przez MetGang Nałogowiec (34,360 p.)
wybrane 5 maja 2017 przez andrut
 
Najlepsza
CodeBlocks jako IDE "stopuje" konsolę po wykonaniu programu i wyświetla informacje np. o czasie trwania programu.

Daj na końcu coś w stylu std::cin.get(), aby program czekał na enter przed zakończeniem programu i nie zamykał konsoli od razu.
komentarz 27 kwietnia 2017 przez andrut Użytkownik (870 p.)
Sądzę, że to nie to, bo użyłem na końcu podwójnego getchar().
Edytowałem posta i dorzuciłem cały kod...
komentarz 28 kwietnia 2017 przez MetGang Nałogowiec (34,360 p.)
To czy jest to C::B czy Sublime nic nie wnosi do procesu samej kompilacji (o ile używasz tego samego kompilatora). Też ciekawe, bo getchar() zawiera się w <cstdio>, a nie widzę tej biblioteki w kodzie.

Osobiście spróbowałbym std::cin.get() albo w ostateczności system("pause").
komentarz 2 maja 2017 przez andrut Użytkownik (870 p.)
Niestety trudno mi stwierdzić czy to ten sam kompilator - raczej nie, gdyż ten w C::B jest raczej wbudowany, zaś Sublime korzysta z zewnętrznego kompilatora G++ w ramach MinGW.
Edytowałem tego posta, są pewne nowe "objawy". Co o tym sądzisz?
komentarz 2 maja 2017 przez MetGang Nałogowiec (34,360 p.)

Trochę popatrzyłem u siebie.

Po pierwsze jeśli używasz gdzieś std::cin to przed próbą pobrania jakiegoś znaku inną komendą (np. getchar()) użyj std::cin.ignore().

int n; std::cin >> n; std::cin.ignore(); getchar();

Jest to pewnie związanie jakoś dziwnie ze strumieniami.

Co do drugiego problemu z wynikami to już jest większa zagadka. Najpierw sprawdź wersję obu kompilatorów (MinGW -> bin -> Shift + PPM -> Otwórz konsolę -> g++ --version) oraz upewnij się czy kompilator, którego używasz z Sublime jest w zmiennej PATH, a nie ma tego z C::B. Dobrze by było, gdybyś podał też komendę jaką kompilujesz w Sublime.

komentarz 5 maja 2017 przez andrut Użytkownik (870 p.)
Program Files (x86)\CodeBlocks\MinGW\bin>g++ --version
g++ (tdm-1) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.

MinGW\bin>g++ --version
g++ (GCC) 5.3.0
Copyright (C) 2015 Free Software Foundation, Inc.

Sublime Text korzysta z tego drugiego - 5.3.0, czyli z nowszej wersji. Wydaje mi się, że to raczej kwestia tego, co jest w nawiasie tdm-1 i GCC...
Zastanawiam się czy po prostu nie przeinstalować MinGW??
komentarz 5 maja 2017 przez MetGang Nałogowiec (34,360 p.)
tdm-1 to na pewno inna "architektura" niż GCC (SEH albo dwarf-2), więc przeplatanie w jakikolwiek sposób plików z tych kompilatorów nie jest pożądane. Nadal mi się zdaje, że to może być problem ze zmienną PATH.

Przeinstalować MinGW lub pobrać inny (polecam https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/6.1.0/threads-posix/dwarf/i686-6.1.0-release-posix-dwarf-rt_v5-rev0.7z/download) i upewnić się, że jako jedyny jest on w PATH, a C::B najlepiej usunąć.
komentarz 5 maja 2017 przez andrut Użytkownik (870 p.)

Zdeinstalowałem MinGW g++ (GCC) 5.3.0 . Dzięki temu, że powiedziałeś mi o sprawdzaniu wersji, dokopałem się do MinGW "wbudowanego" w C::B miałem go pod ścieżką: Program Files (x86)\CodeBlocks\MinGW\bin. Tą ścieżkę dopisałem w Sublime do pliku *.sublime-build, który już wcześniej miałem zrobiony na podstawie artykułu z internetu. A później w zmiennych środowiskowych zastąpiłem to, co miałem z tego GCC i wrzuciłem ścieżkę z C::B. Dzięki temu zarówno Sublime, jak i C::B działają na dokładnie tym samym kompilatorze. Sprawdziłem zarówno pierwszy kod (z odczytem z pliku txt) i drugi (ten z ciągiem Fibonacciego), i oba działają poprawnie.
yes Dzięki za pomoc! laugh
Zapytam jeszcze tylko: Dlaczego polecasz akurat wersję dwarf?

komentarz 5 maja 2017 przez MetGang Nałogowiec (34,360 p.)

Szczerze powiedziawszy to bardziej mi chodziło o nowszą wersję kompilatora, która wspiera więcej rzeczy z nowszych standardów i ma też nie najgorsze wsparcie (skompilowanych już) bibliotek cheeky. Lecz póki zaczynasz przygodę z programowaniem (wnioskuję po Fibonaccim) to w sumie nie ma to znaczącej różnicy. Czy to dwarf (x86), czy SEH (x64 x86) to już bardziej zależy od samych aplikacji i ich targetów (systemów).

komentarz 5 maja 2017 przez andrut Użytkownik (870 p.)

Póki co, to zależało mi na tym, żeby zmusić Sublime, do którego przyzwyczaiłem się działając coś w HTML i PHP do współpracy z C++. Dzięki Tobie się udało. Myślę, że na najnowsze wersje kompilatora i nowinki techniczne jeszcze przyjdzie dla mnie pora smiley

0 głosów
odpowiedź 28 kwietnia 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
Dwa getchar();  na koniec w VS dziala

Podobne pytania

0 głosów
2 odpowiedzi 287 wizyt
pytanie zadane 12 lutego 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)
+3 głosów
1 odpowiedź 785 wizyt
pytanie zadane 9 lipca 2015 w C i C++ przez Dash Nałogowiec (29,650 p.)
0 głosów
2 odpowiedzi 193 wizyt
pytanie zadane 1 lipca 2016 w Systemy operacyjne, programy przez Jacque Obywatel (1,300 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...