Boost - programy się wyłączają

Boost - programy się wyłączają
M2
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:11
0

Witam,

Korzystam z Dev C++ w wersji 4.9.9.2. Przy pomocy WebUpdate'era pobrałem i zainstalowałem boost w wersji 1.46.0. Do wiersza poleceń konsolidatora wpisałem "-lboost_regex". Przykladowy program:

Kopiuj
#include <iostream>
#include <string>
#include "boost/regex.hpp"
int main()
{
    boost::regex phoneRegex= boost::regex("[1-9][0-9]-[1-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]");
    std::string data;
    std::cout << "Wprowadz telefon (xx-xxx-xx-xx): ";
    getline( std::cin, data );
    while ( !( boost::regex_match( data, phoneRegex ) ) )
    {
          std::cout << "Ba!d." << std::endl;
          std::cout << "Wprowadz telefon: ";
          getline( std::cin, data );
          }
    std::cout << data << std::endl;
    return 0;
}

się kompiluje, jednak program po uruchomieniu się zawiesza. Co może być tego przyczyną?

edytowany 1x, ostatnio: mtm2
n0name_l
"Korzystam z Dev C++ w wersji 4.9.9.2", a uzywasz liczydla zamiast kalkulatora ? :)
LN
  • Rejestracja:około 16 lat
  • Ostatnio:około rok
  • Postów:1398
2

Przyczyną jest używanie tak archaicznego "narzędzia", jak Dev-c++. Zainstaluj coś normalnego - Code::Blocks albo Eclipse CDT. Wtedy pogadamy :)

M2
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:11
0

Przyzwyczajenie straszna rzecz ;)
Zanistalowalem code:blocks z MinGW i najpierw pytanie takie ogólno-konfiguracyjne:
W "Settings" -> "Compiler and debbuger", zakładka "Toolchain executables" jezeli jako scieżkę ustawię "C:\Dev-Cpp" to przykładowy program kompiluje sie bez problemu:

Kopiuj
#include<iostream>

using namespace std;

int main(int argc, char* argv[])
{
    int n = atoi(argv[1]);
    cout << "Hello world!" << RAND_MAX << " " << n << endl;
    getchar();
    return 0;
}

A jeżeli ustawie nowo zainstalowanego MinGW scieżką "C:\Program Files (x86)\CodeBlocks\MinGW" to wtedy kompilator sie pluje, ze nie zna stałej RAND_MAX, funkcji atoi i getchar, i wtedy muszę dodać biblioteki cstdio i stdlib.h. Czym ta różnica jest spowodowana? Byłem przyzwyczajony, że większość "standardowych" rzeczy znajduje się już w iostream.

Czy to wszystko jeżeli chodzi o wstępną instalację i konfigurację C::B? Czy coś jeszcze?

I jeszcze jedno pytanie: Od czego zależy wielkość stałej RAND_MAX? Innymi słowy: dlaczego ja mam ją równą 32767 a inni mają bodajże 2^31-1?

edytowany 2x, ostatnio: mtm2
no_solution_found
iostream czyli InOut Stream - strumień wejścia wyjścia, tam nie ma żadnych funkcji matematycznych. Dlaczego pod Devem Ci to działa? Bo to prastare IDE z jeszcze bardziej archaicznym kompilatorem.
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
2

W C++ jest bardzo wazne dolaczanie naglowkow i trzeba to po prostu robic, w C czy w innych prastarych wynalazkach typu Dev-C++ mogles sobie to darowac bo kompilator "znajdywal" odpowiednie funkcje/zmienne. Co do konfiguracji to w sumie nigdy jakos specjalnie nie konfigurowalem nic poza wygladem tego C::B. Polecilbym Ci jeszcze dodac sobie flagi -Wall, -pedantic, zeby Ci drukowala wszystkie ostrzezenia, na poczatku przydatna rzecz.

edytowany 1x, ostatnio: n0name_l
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 lat
1
mtm2 napisał(a):

kompilator sie pluje, ze nie zna stałej RAND_MAX, funkcji atoi i getchar, i wtedy muszę dodać biblioteki cstdio i stdlib.h. Czym ta różnica jest spowodowana? Byłem przyzwyczajony, że większość "standardowych" rzeczy znajduje się już w iostream.

Różnica jest spowodowana tym, że standard pozostawia pewną dowolność. Nie mówi on "atoi możesz używać wtedy i tylko wtedy jeśli zaincludujesz <cstdlib>" tylko "jeśli zaincludujesz <cstdlib> na pewno będziesz mógł używać atoi". Czyli dana inmplementacja bibliotek standardowej ma ci udostępnić to, co gwarantuje standard lub więcej. Ty polegałeś na tym niestandardowym "więcej" no i zemściło się.

mtm2 napisał(a):

Od czego zależy wielkość stałej RAND_MAX? Innymi słowy: dlaczego ja mam ją równą 32767 a inni mają bodajże 2^31-1?
Zależy to od twórców implementacji standardu C++. Standard nie określa ile to ma być. Dlatego każda implementacja definiuje RAND_MAX na swój sposób.

_13th_Dragon
Standard określa minimalny zakres tej wartości.
M2
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:11
0

Ok, a teraz instalacja boosta. Korzystałem z tej instrukcji: http://wiki.codeblocks.org/index.php?title=BoostWindowsQuickRef.
Pobrałem boost_1_47_0.zip i boost-jam-3.1.18-1-ntx86.zip wypakowałem oba archiwa do C:\boost.
Do zmiennej systemowej PATH dodałem C:\Program Files (x86)\CodeBlocks\MinGW\bin i zrestartowałem system.
Po wypakowaniu w konsoli wykonałem:
set PATH=C:\boost\boost-jam-3.1.18-1-ntx86;%PATH%
A nastepnie przeszedłem do kalatogu z boostem:
cd /D C:\boost\boost_1_47_0
I Wpisalem:
bjam --toolset=gcc "--prefix=C:\Program Files (x86)\CodeBlocks" install

I wypluło mi cos takiego:

Kopiuj
C:\boost\boost_1_47_0>bjam --toolset=gcc "--prefix=C:\Program Files (x86)\CodeBloc
ks" install
warning: mismatched versions of Boost.Build engine and core
warning: Boost.Build engine (bjam) is 03.1.17
warning: Boost.Build core (at C:/boost/boost_1_47_0/tools/build/v2) is 2011.04-svn

C:/boost/boost_1_47_0/tools/build/v2/util\path.jam:476: in path.makedirs
rule MAKEDIR unknown in module path.
C:/boost/boost_1_47_0/tools/build/v2/build\configure.jam:190: in configure.set-log
-file
C:/boost/boost_1_47_0/tools/build/v2\build-system.jam:725: in load
C:\boost\boost_1_47_0\tools\build\v2/kernel\modules.jam:283: in import
C:\boost\boost_1_47_0\tools\build\v2\kernel\bootstrap.jam:142: in boost-build
C:\boost\boost_1_47_0\boost-build.jam:17: in module scope

C:\boost\boost_1_47_0> 

W instrukcji napisane jest ze "This step will generally take 5-20 minutes, depending on the capabilities of your PC. " a u mnie trwało to moment. Wszystko jest ok? Co oznaczają te ostrzezenia?

Edit: Wykonalem najpierw "bootstrap.bat gcc" a nastepnie ponowilem powyzsze polecenie i "coś się dzieje".Zobaczymy ;)

edytowany 2x, ostatnio: mtm2
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 lat
1

Ja bym się raczej tym martwił:

rule MAKEDIR unknown in module path
Wklep w googla, coś podpowie.

M2
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:11
0

Dziękuje za pomoc :) Program działa, ale jedna rzecz mi się nie podoba:

W "Compiler and debugger settings", w zakładce "Search directories" dodałem C:\boost\boost_1_47_0 i wtedy jest ok bo w C:\boost\boost_1_47_0\boost siedzą wszystkie pliki nagłówkowe, więc dorzucanie #include<boost/regex.hpp> ma sens.
Dlaczego analogicznie dorzucenie katalogu C:\boost\boost_1_47_0\bin.v2\libs do linkera nie wystarczy?

Inaczej: W "linker settings" musiałem ręcznie dodać plik C:\boost\boost_1_47_0\bin.v2\libs\regex\build\gcc-mingw-4.4.1\debug\link-static\threading-multi\libboost_regex-mgw44-mt-d-1_47.a i dopiero wtedy program się skompilował.

Rozwiązanie mało wygodne, bo wychodzi że dla każdej podbiblioteki z boosta będę musiał pamiętać o dodaniu pliku *.a do linkera. Jak je dodać za jednym zamachem?

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 lat
1

Tak to działa.
Dodanie ścieżki include'ów nie powoduje automatycznego include'owania wszystkich plików nagłówkowych. Tak samo dodanie ścieżki lib'ów nie powinno powodować automatycznego linkowania ze wszystkimi lib'ami.

M2
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:11
0

Ok, dziekuję ;). Tylko jaki wtedy ma sens dodawanie folderu do Linkera? (folder z libami)

To teraz już ostatnie pytanie, z ciekawości: Jaka może być przyczyna tego, że pliki wykonywalne exe po przekompilowaniu kodu w Code:Blocks stają się dość większe? Z pliku exe ważącego ~600 KB i stworzonego w Devie zrobiło się ~900 KB.

edytowany 1x, ostatnio: mtm2

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.