C++ i Glib - jak używać.

C++ i Glib - jak używać.
H1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Witam

Próbuję napisać pierwszy sensowny program w C++ pod Ubuntu. Interesuje mnie komunikacja po portach COM. Polecono mi skorzystanie z bibliotek Glib jednak nie mogę znaleźć przykładu użycia który by działał i który bym rozumiał. Biblioteki Glib są dobre bo pozwalają na łatwe przeniesienie programu na np ARM (co jest moim głównym celem nauki programowania).

Na początek próbowałem napisać prosty program wykorzystujący Timer.
Kojarzę coś programowania obiektowego z poziomu Delphi.

Kopiuj
Procedure TimerCreate();
var
  sTimer : TTimer;
begin
  sTimer := TTimer.Create();
  sTimer.Interval := 200; //ms
  sTimer.OnTimer := MojaFunkcja;
  sTimer.Enabled := True;
end;

A teraz jak to wykonać z poziomu C++ w Linux?
Nie bardzo wiem jak zdefiniować czas oraz jak przypisać moją procedure do zdarzenia.

Kopiuj
#include <glib.h>

typedef struct _GTimer GTimer;


int main ()
{
    GTimer * g_timer_new;  // Tu jak rozumiem tworze mój Timer o nazwie GTimer
    // Automatycznie wywołało się g_timer_start();
    
    
    
    // Na koniec sprzątam:
    g_timer_destroy(GTimer);
  return 0;
}

Będę wdzięczny za pomoc

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
0
Kopiuj
int main ()
{
    GTimer *my_timer;
    my_timer = g_timer_new();
    
    int i = 1000;
    while(--i) {}
    
    cout << g_timer_elapsed(my_timer, 0);
    
    g_timer_destroy(GTimer);
  return 0;
}

Sproboj cos takiego.

H1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Niestety przy wykonaniu programu:

Kopiuj
 
#include <glib.h>
#include <iostream>

typedef struct _GTimer GTimer;

using namespace std;

int main ()
{
    GTimer *my_timer;
    my_timer = g_timer_new();

    int i = 1000;
    while(--i) {}

    cout << g_timer_elapsed(my_timer, 0);

    g_timer_destroy(GTimer);   // Zwraca błąd: error: expected primary-expression before ‘)’ token|

  return 0;
}

Zostaje zwrócony błąd.
Co ciekawe jeśli usunę tą linijkę (wiem tak się nie robi). To otrzymuję błąd:

|undefined reference to `g_timer_new'|
dla lini:

Kopiuj
   my_timer = g_timer_new(); 
n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
0

Ale faila nie zauwazylem ;<

Kopiuj
#include <glib.h>
#include <iostream>
  
using namespace std;
 
int main ()
{
    GTimer *my_timer;
    my_timer = g_timer_new();
 
    int i = 1000;
    while(--i) {}
 
    cout << g_timer_elapsed(my_timer, NULL);
 
    g_timer_destroy(my_timer);
 
  return 0;
}

kompilacja:
g++ NAZWA.cpp -o NAZWA -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -L/usr/lib -lm -lglib-2.0

H1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Witam

Mam dalej problem z przypisaniem mojej funkcji do zdarzenia.

Kopiuj
#include <iostream>

//typedef struct _GTimer GTimer;

using namespace std;

void takie_Tam(gdouble nic_waznego)
{
        cout << 'Wywolano moja funckje';
}

int main ()
{
    GTimer *my_timer;
    my_timer = g_timer_new();

    int i = 1000;
    while(--i) {}

    takie_Tam << g_timer_elapsed(my_timer, 0);
    g_timer_destroy(GTimer);
  return 0;
} 

Zwraca błąd:

main.cpp|21|error: invalid operands of types ‘void(gdouble) {aka void(double)}’ and ‘gdouble {aka double}’ to binary ‘operator<<’|

Moja procedura przyjmuje gdouble wiec powinno działać..

Dodatkowo nie wiem z jakiego powodu nie mogę skompilować poprzedniego projektu w code block.
Jeśli odpalę z terminala:

Kopiuj
 g++ main.cpp -o main -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -L/usr/local/lib -lm -lglib-2.0  

Wszystko przechodzi poprawnie. Jednak jak odpalę kompilację w code block niestety już nie:

Kopiuj
 main.cpp|22|error: expected primary-expression before ‘)’ token|

Winą prawdopodobnie jest brak ścieżki do którejś z części biblioteki Glib.
Jednak w programie Code Block mam ustawione "Serch directories" >> Compiler >>

/usr/local/include/glib-2.0/
/usr/local/lib/glib-2.0/inlcude
/usr/local/lib
/usr/local/include/glib-2.0/glib
/usr/local/include/glib-2.0/gio
/usr/local/include/glib-2.0/gobject
/usr/lib

Nie bardzo wiem jaką jeszcze ścieżkę powinienem dodać skoro komenda w terminalu działa

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
0

Przecież to: g_timer_destroy(GTimer); jest błąd. Kompilator mówi o dokładnie tej linijce i nie ma to niczego wspólnego ze ścieżkami. Raczej miało być g_timer_destroy(my_timer);.

H1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Po poprawce kompilator zwraca błędy:

main.cpp|16|undefined reference to g_timer_new'| main.cpp|21|undefined reference to g_timer_elapsed'|
main.cpp|22|undefined reference to `g_timer_destroy'|

Jeśli kliknę prawym > "Find declatarion" zanjduje wiec raczej nie błąd w ścieżkach.
Najważniejszy "objaw" jest taki że ten sam kod nawet z błędem w destroy wykonywał się w terminalu

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
0

-L/usr/local/lib -lm -lglib-2.0
To odpowiada za "poinformowanie" linkera, gdzie znajduje sie ta biblioteka. W C::B tego nie zrobiles, wiec nie moze znalezc definicji tych funkcji.

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.