Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

GMP - instalacja pod windows

a2d2a2m 09 Feb 2013 11:18 3273 25
  • #1
    a2d2a2m
    Level 15  
    Czy ktoś z Kolegów używa biblioteki GMP pod windows. Ja próbowałem skompilować ale poległem. Interesuje mnie skompilowana wersja lub pomoc w kompilacji.
  • #3
    a2d2a2m
    Level 15  
    A z którego Ty korzystałeś, bo rozumiem, że kompilowałeś. Powiem tak, jak korzystać z google, to wiem ale jak już wspomniałem robiłem wg opisów i nie działa. Dlatego oczekuję pomocy od osób, które to robiły z powodzeniem. Obawiałem się takiej odpowiedzi.
  • #4
    a2d2a2m
    Level 15  
    Ok. Teraz mam trochę inne pytanie. Dałem sobie spokój z kompilowaniem. Zainstalowałem Dev c++ i GMP devpack. Następnie :
    1. Narzędzia->Opcje kompilatora->Katalogi->Biblioteki (tutaj wskazałem katalog, w którym są pliki o rozszerzeniu .a utworzone przez devpack)
    2. Narzędzia->Opcje kompilatora->Katalogi->Pliki nagłówkowe(tutaj wskazałem katalog, w którym są pliki o rozszerzeniu .h utworzone przez devpack)
    Po tych czynnościach kompilator już nie "czepia" się #include<gmp.h>.
    Do tego momentu myślę, że wszystko jest dobrze. Problemem jest [Linker error] F:/BezNazwy1.cpp:6: undefined reference to `___gmpf_init' . Pewnie muszę coś jeszcze dopisać dla Linker-a. Jeżeli, ktoś może podać, co mam wpisać i w które miejsce, to bardzo proszę o pomoc.
  • #5
    mickpr
    Level 39  
    a2d2a2m wrote:
    Biblioteki (tutaj wskazałem katalog, w którym są pliki o rozszerzeniu .o utworzone przez devpack)
    To są te biblioteki?
    Zawsze myślałem, że bibliteki są z rozszerzeniem albo '.lib', '.dll', '.so', '.a', .la
    W twoim wypadku będzie to najprawdopodobniej: .a + .la

    Nie wiem czy DEV CPP działa z MinGW -- czy Cygwin'em (pewnie MinGW).
    Nie pamiętam też, gdzie się w projekcie dodawało do konfiguracji biblioteki.
    Może tutaj o tym piszą: http://cpp0x.pl/artykuly/?id=49

    Działanie kompilatora i jednocześnie błąd linkera -informuje cię, że kod masz w porządku, ale nie dołączyłeś po prostu odpowiednich bibliotek do projektu.
  • #6
    a2d2a2m
    Level 15  
    mickpr wrote:
    a2d2a2m wrote:
    Biblioteki (tutaj wskazałem katalog, w którym są pliki o rozszerzeniu .o utworzone przez devpack)
    To są te biblioteki?
    Zawsze myślałem, że bibliteki są z rozszerzeniem albo '.lib', '.dll', '.so', '.a', .la
    W twoim wypadku będzie to najprawdopodobniej: .a + .la

    Nie wiem czy DEV CPP działa z MinGW -- czy Cygwin'em (pewnie MinGW).
    Nie pamiętam też, gdzie się w projekcie dodawało do konfiguracji biblioteki.
    Może tutaj o tym piszą: http://cpp0x.pl/artykuly/?id=49

    Działanie kompilatora i jednocześnie błąd linkera -informuje cię, że kod masz w porządku, ale nie dołączyłeś po prostu odpowiednich bibliotek do projektu.

    Dev działa z MinGW. W miejscu-polecenia wiersza poleceń konsolidatora dodałem wpis -lgmp
    i program się skompilował. Przy próbie uruchomienia woła o biblioteki - dołączę i zobaczymy.
  • #7
    mickpr
    Level 39  
    a2d2a2m wrote:
    Dev działa z MinGW. Niestety dalej nie działa.
    A jaki masz błąd?
    Czy podczas kompilacji linker jest wywoływany z opcją:
    Code: bash
    Log in, to see the code

    gdzie:
    '-l' oznacza komendę "linkuj bibliotekę"
    'gmp' po '-l' to nazwa biblioteki (pełna nazwa pliku biblioteki zaczyna się prefixem lib i kończy roszerzeniem (.a/.la)).
    W związku z tym dołączenie przykładowe biblioteki "biblioteka" jest realizowane komendą:
    Code: bash
    Log in, to see the code

    zaś sam plik biblioteki powinien się nazywać:
    'lib'+'bibliteka'+'.a' czyli libbiblioteka.a
    Mam nadzieję, że będziesz teraz wiedział co powinno być dołączone podczas linkowania programu.
  • #8
    a2d2a2m
    Level 15  
    Dzięki Kolego za pomoc.
    Mój błąd polegał, że myślałem, że Package Manager już umieści w odpowiednich katalogach. Trochę szukałem w google i znalazłem -lgmp ale nie miałem podlinkowane pliki go gmp, jak miałem podlikowane pliki, to nie dodałem wpisu - lgmp. Teraz już jest ok. kompiluje się i już problem z Dev c++ i gmp rozwiązany. Mam teraz jeszcze jedno pytanie związane z gmp.W wikipedii znalazłem przykład użycia gmp:
    Code: c
    Log in, to see the code

    wartość do obliczeń jest w taki sposób mpz_set_str ( x , "7612058254738945" , 10 ) ; 10 oznacza liczbę w systemie dziesiętnym, u mnie będzie hex, czyli 16. Teraz , jak przekazać wartość do zmiennej zapisaną w tablicy. Wartości do obliczeń przechowuję w tablicy (char).
  • #9
    mickpr
    Level 39  
    a2d2a2m wrote:
    jak przekazać wartość do zmiennej zapisaną w tablicy. Wartości do obliczeń przechowuję w tablicy (char).
    Czy twoja tablica to :

    1. tablica wskaźników do typu char
    Przykład tablicy:
    Code: c
    Log in, to see the code

    2. tablica char-ów (tylko pojedyncze znaki)
    Przykład tablicy:
    Code: c
    Log in, to see the code
  • #10
    a2d2a2m
    Level 15  
    Ta druga wersja. Czyli 0xAF01 ->> tab[0]=A,tab[1]=F itd.
  • #11
    mickpr
    Level 39  
    a2d2a2m wrote:
    jak przekazać wartość do zmiennej zapisaną w tablicy. Wartości do obliczeń przechowuję w tablicy (char)

    Z tego co widzę w pliku nagłówkowym masz oprócz;
    Code: c
    Log in, to see the code

    również
    Code: c
    Log in, to see the code

    Więc twój char z tabeli możesz rzutować na 'long int'
    Code: c
    Log in, to see the code
    Jeśli twój char jest "signed" - czyli 'F' oznacza wartość -7 (zamiast 15), to użyjesz drugiej funkcji.
  • #12
    a2d2a2m
    Level 15  
    Niestety, ten zapis jest błędny.
    Zapis : mpz_set_si(x,(unsigned long int)tabn1[0]); w tablicy mam B, jako x otrzymuję 66 czyli kod znaku w ASCII, a nie wartość hex.
    Natomiast zapis: mpz_set_si(x,(unsigned long int)tabn1[0]),16) powoduje błąd(zbyt duża ilość argumentów).
  • #13
    mickpr
    Level 39  
    Masz rację - trochę się pomyliłem.
    a2d2a2m wrote:
    jako x otrzymuję 66 czyli kod znaku w ASCII, a nie wartość hex.
    I to jest prawidłowe. Bowiem 'B' to inaczej wartość (liczba 1 bajtowa) 66.
    Jeśli chcesz pojedynczy znak (HEX, a nie ASCII) zamieniać na wartość - musisz w tym celu dopisać sobie funkcję to robiącą.
    Code: c
    Log in, to see the code

    Mimo, iż tu nie widać słowa int to typ znakowy jest również typem liczbowym (jednobajtowym). Można go dodawać, odejmować... i rzutować jak potrzeba.
    Zamiast kodu który podałem wstaw coś takiego:
    Code: c
    Log in, to see the code

    I oczywiście dołącz tą funkcję do programu.
  • #14
    a2d2a2m
    Level 15  
    Dzięki Kolego,
    Przy zapisie mpz_set_ui(x,(unsigned int)(HexCharToInt(tabn1[u]))); pokazuje już prowidłową wartość. Tylko w zapisie nie może być mpz_set_ui(x,(unsigned int)(HexCharToInt(tabn1[u][tex][,10/tex])));
    Teraz kolejny dylemat, jak zrobić, żeby przypisać całą tabelę do tej zmiennej.
    Przykładowo mamy liczbę zapisaną w tabeli 100 elementowej. Nie wiem, czy nie lepiej cały string wpisać do jednej komórki tabeli.
    I jeszcze jedno. Wynik obliczeń w poprzednim poście jest wyświetlany w systemie dziesiętnym, a mi zależy na hex, a potem zapisaniu tego do pliku.
  • #15
    mickpr
    Level 39  
    a2d2a2m wrote:
    Wynik obliczeń w poprzednim poście jest wyświetlany w systemie dziesiętnym, a mi zależy na hex

    Zamiast
    Code: c
    Log in, to see the code

    wstaw
    Code: c
    Log in, to see the code

    ewentualnie
    Code: c
    Log in, to see the code

    (opis 'specifierów': http://www.cplusplus.com/reference/cstdio/printf/ )

    a2d2a2m wrote:
    Przykładowo mamy liczbę zapisaną w tabeli 100 elementowej. Nie wiem, czy nie lepiej cały string wpisać do jednej komórki tabeli.

    Zbuduj string z elementów tej tabeli, a następnie przekaż go do funkcji mpz_set_str jako parametr.
  • #16
    a2d2a2m
    Level 15  
    mickpr wrote:
    a2d2a2m wrote:
    Wynik obliczeń w poprzednim poście jest wyświetlany w systemie dziesiętnym, a mi zależy na hex

    Zamiast
    Code: c
    Log in, to see the code

    wstaw
    Code: c
    Log in, to see the code

    ewentualnie
    Code: c
    Log in, to see the code

    (opis 'specifierów': http://www.cplusplus.com/reference/cstdio/printf/ )

    a2d2a2m wrote:
    Przykładowo mamy liczbę zapisaną w tabeli 100 elementowej. Nie wiem, czy nie lepiej cały string wpisać do jednej komórki tabeli.

    Zbuduj string z elementów tej tabeli, a następnie przekaż go do funkcji mpz_set_str jako parametr.

    Tutaj to nie działa prowidłowo:
    Code:

     mpz_set_str ( x , "FA" , 16 ) ;
      mpz_set_str ( y , "19" , 16 ) ;
      mpz_gcd( result , x , y ) ;
    gmp_printf ( " \n %X \n * \n %X \n -------------------- \n %X \n \n " , x , y , result ) ;

    Daje taki rezultat:
    x=22FE94
    y=22FE88
    result=22FE7C
    Ok. już wiem, ma być:
    gmp_printf ( " \n %Zx \n * \n %Zx \n -------------------- \n %Zx \n \n " , x , y , result ) ;
  • #17
    mickpr
    Level 39  
    Musisz doczytać w opisie biblioteki, co powinno być.
    Specyfikator 'Z' określa, że rozmiar parametru jest brany z jego typu.
    Typ zmiennej x, y czy result - jak wiemy nie jest typem prostym, tylko wymyślonym na potrzeby biblioteki.
    Najprościej spróbował bym rzutować typ na jakiś typ prosty (choćby unsigned long).
    Jednak dalej - to jest wróżenie z fusów (czy ktoś zaimplementował rzutowanie ?).

    Z pobierznego "rzutu okiem" na plik nagłówkowy - widzę, że biblioteka ma zaimplementowane własne funkcje do wydruku takiego typu liczb.
    Sprawdź ten trop.
  • #18
    a2d2a2m
    Level 15  
    Dodałem:
    std::string test;
    test.append(&tabz2[0]);
    i po komendzie
    cout<<test;
    wyświetlana jest zawartość,taką, jak w tabeli.
    Teraz podpowiedz, jak powinno wyglądać przekazanie do funkcji mpz_set_str jako parametr.
  • Helpful post
    #19
    beluosus
    Level 25  
    Zakładam, że tabz2 to char* więc po prostu:
    Code: cpp
    Log in, to see the code


    Funkcja HexCharToInt napisana przez @mickpr jest trochę koślawa pomijając już zwracany typ, który powinien być int (ze względu na czytelność, konieczność rzutowania w niektórych przypadkach). Funkcja zwraca zero dla '0' i dla każdej wartości spoza zakresów, tak być nie może.

    Z tego co widze to inkludujesz c++owe biblioteki więc chciałbym zauważyć, że gmp posiada wrappera dla c++ z którego korzysta się o wiele wygodniej (nie trzeba initować - konstruktor, nie trzeba setować - operator przypisania, zamiast gmp_printf wystarczy cout itd).

    Dodatkowo szczerze odradzam korzystanie z dev c++ (stary kompilator w którym jest wiele błędów i mało ficzerów), jeśli nadal Cię interesuje gmp pod mingw to mogę zaprezentować taką instalację.
  • #20
    mickpr
    Level 39  
    beluosus wrote:
    Funkcja HexCharToInt napisana przez @mickpr jest trochę koślawa pomijając już zwracany typ, który powinien być int (ze względu na czytelność, konieczność rzutowania w niektórych przypadkach). Funkcja zwraca zero dla '0' i dla każdej wartości spoza zakresów, tak być nie może.
    Nie w sposób się nie zgodzić, tyle, że ja tej funkcji nie napisałem, tylko skopiowałem z pierwszej lepszej strony znalezionej na Google.

    Co do dalszej wypowiedzi - również się zgodzę. Stosowanie w tym miejscu C mija się z celem i od razu lepiej przejść na C++.

    Gdy podasz - na jakim systemie ma chodzić ten program - zaproponuję środowisko.
  • #21
    a2d2a2m
    Level 15  
    beluosus wrote:
    Zakładam, że tabz2 to char* więc po prostu:
    Code: cpp
    Log in, to see the code


    Funkcja HexCharToInt napisana przez @mickpr jest trochę koślawa pomijając już zwracany typ, który powinien być int (ze względu na czytelność, konieczność rzutowania w niektórych przypadkach). Funkcja zwraca zero dla '0' i dla każdej wartości spoza zakresów, tak być nie może.

    Z tego co widze to inkludujesz c++owe biblioteki więc chciałbym zauważyć, że gmp posiada wrappera dla c++ z którego korzysta się o wiele wygodniej (nie trzeba initować - konstruktor, nie trzeba setować - operator przypisania, zamiast gmp_printf wystarczy cout itd).

    Dodatkowo szczerze odradzam korzystanie z dev c++ (stary kompilator w którym jest wiele błędów i mało ficzerów), jeśli nadal Cię interesuje gmp pod mingw to mogę zaprezentować taką instalację.

    Dzięki Kolego
    Faktycznie działa ale byłem pewny, że tak próbowałem robić i sypało błędami.Co do funkcji Kolegi @mickpr nie będzie mi już potrzebna ale i tak mi dużo pomógł. Przy tym programie pozostanę przy Dev c++, bo tutaj udało mi się odpalić GMP. Próbowałem kompilować GMP ale po odpaleniu MSYS przestała działać u mnie przeglądarka (IE). Jednak oczywiście jestem zainteresowany instalacją pod minGW.Tyle czasu straciłem nad tym tematem; najpierw napisałem w programie wykonywanie potęgowania na dużych liczbach ale zrobiłem, to jak się mnoży pod kreską i wieki to trwało, potem próbowałem wygenerować kod z Mathematica(ona też korzysta z GMP), szukałem opisu, jak szybciej można wykonać mnożenie, instalacja Code::block itd. Jak się później okazało, to robiłem proste błędy, żeby odpalić GMP pod Dev c++.

    Dodano po 5 [minuty]:

    mickpr wrote:
    beluosus wrote:
    Funkcja HexCharToInt napisana przez @mickpr jest trochę koślawa pomijając już zwracany typ, który powinien być int (ze względu na czytelność, konieczność rzutowania w niektórych przypadkach). Funkcja zwraca zero dla '0' i dla każdej wartości spoza zakresów, tak być nie może.
    Nie w sposób się nie zgodzić, tyle, że ja tej funkcji nie napisałem, tylko skopiowałem z pierwszej lepszej strony znalezionej na Google.

    Co do dalszej wypowiedzi - również się zgodzę. Stosowanie w tym miejscu C mija się z celem i od razu lepiej przejść na C++.

    Gdy podasz - na jakim systemie ma chodzić ten program - zaproponuję środowisko.

    Kolego program ma się uruchamiać pod Windows. Jednak program dzięki Waszej pomocy mam już prawie gotowy. Jeżeli nie wynikną w trakcie korzystania z GMP przy obliczeniach, to pozostanie tylko wyświetlenie wyniku obliczeń i zapisanie go do pliku.Resztę mam już napisaną tylko brkowało mi fragmentu do wykonywania obliczeń na dużych liczbach. Myślę, że obliczenia nie będą trwały dłużej niż robi to program Mathematica, korzystająca z tej samej bibilioteki. Ten fragment, który podałem w poście, bo był zaczerpnięty z wikipedii o GMP, bo nie wiedziałem jak deklarować zmienne.
  • Helpful post
    #22
    mickpr
    Level 39  
    a2d2a2m wrote:
    Kolego program ma się uruchamiać pod Windows.
    A czemu nie zrobić tego w Visual Studio Express... całkiem niezłe C++.
    Pod MinGW będziesz miał trochę ustawiania (ścieżki do include itd.)
    Visual Studio Express jest darmowe, proste, łatwe i praktycznie bezproblemowe .

    p.s.
    Nie przepadam za Ms, co jednak nie zmienia faktu, że VS to bardzo dobre środowisko.
    Dodatkowo (jeśli chcesz GUI) - to masz ... za darmo.
    Pod MinGW musiałbyś się męczyć z dodatkowymi bibliotekami (np. wxWindows).
  • #23
    a2d2a2m
    Level 15  
    mickpr wrote:
    a2d2a2m wrote:
    Kolego program ma się uruchamiać pod Windows.
    A czemu nie zrobić tego w Visual Studio Express... całkiem niezłe C++.
    Pod MinGW będziesz miał trochę ustawiania (ścieżki do include itd.)
    Visual Studio Express jest darmowe, proste, łatwe i praktycznie bezproblemowe .

    p.s.
    Nie przepadam za Ms, co jednak nie zmienia faktu, że VS to bardzo dobre środowisko.
    Dodatkowo (jeśli chcesz GUI) - to masz ... za darmo.
    Pod MinGW musiałbyś się męczyć z dodatkowymi bibliotekami (np. wxWindows).

    Może i zrobię. Mam nawet program na CD. Tutaj akurat sprawił przypadek. W wolnym czasie piszę programy na procki atmela i korzystam z AVRstudio i Winavr. Teraz zaszła trochę inna potrzeba i oczywiście google i szukanie środowiska, chociaż kiedyś pisało się w notatniku i uruchamiało kompilator z lini poleceń. Jednym z pierwszych linków w google był właśnie Dev c++, a że kiedyś już korzystałem, to wybór był prosty. Problem zaczął się z obliczeniami na dużych liczbach i wiele straconego czasu.W VS chyba też będzie trzeba kompilować GMP i może być ponownie ten sam problem. Tutaj już działa z Dev c++, to ta wersja programu zostanie ukończona. Sam program nie jest skompliokowany, taki "specyficzny" kalkulator.
  • #24
    a2d2a2m
    Level 15  
    Chyba trochę za szybko się cieszyłem. Potęgowanie ładnie działa, odejmowanie również ale NWD już przy większych liczbach się "sypie".
    Oczywiście program się kompiluje ale po uruchomieniu, gdy dochodzi do wyliczeń:
    mpz_gcd ( wynik , a1 , b1 ) ;
    otrzymuję komunikat
    --------------------------------
    Process exited with return value 3221225725
    Press any key to continue . . .
    Czyli następuje przepełnienie stosu.
    Oczywiście gdy a1 i b1 są mniejsze, to jest wyliczany wspólny dzielnik.
    Na liczbach , dla których nie da się wyliczyć NWD można wykonywać inne działania np. potęgowanie, a tym samym zwiększać ich wielkość.

    Jakieś pomysły, jak poradzić sobie z przepełnieniem stosu w tym przypadku?
  • #25
    beluosus
    Level 25  
    Przepełnienie stosu często jest skutkiem rekurencyjnego wywołania funkcji (gdzie pamięć stosu kończy się zanim dojdzie do warunku kończącego rekurencję). Zakładam, że korzystasz z rekurencyjnego algorytmu do liczenia NWD. Zastosuj inny.
  • #26
    a2d2a2m
    Level 15  
    Korzystam z gotowej funkcji z GMP, bo tylko tu mogę wykonać operacje na dużych liczbach.
    Problem rozwiązany. Wpis w linker : -Wl,--stack,16777216 załatwił sprawę ze stosem. Jednak program długo liczy. Korzystam z Dev c++ i biblioteki GMP. Ustawienia mam standardowe, po instalacji Dev c++, jedynie w linker wspomniany wpis i odwołania do bibliotek.
    Wszysko już jest ok. nowszy GMP załatwił sprawę.