jezyk C w C++ - czy mozna mieszac?

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
marconi
Piegowaty Guziec
Piegowaty Guziec
Posty: 18
Rejestracja: 08 sty 2007, 15:11
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

jezyk C w C++ - czy mozna mieszac?

Post autor: marconi »

Witam, pisze program w qt4 i w pewnym momencie chcialem wykorzystac stary program w C. Dokladnie chodzi o wysylanie wiadomosci po broadcast-cie. Moglem wykorzystac QUdpSocket(), ale w tym kodzie w C napisalem juz troche kodu i niechce mi sie wszystkiego zmieniac. Generalnie to kompiluje mi sie narazie wszystko dobrze, tylko musialem wywalic close(Deskrypto), bo program sie wysypywal.
Pytanie-> Czy takim mieszaniem nie sprawie, ze program bedzie mniej stabilny lub mial jakies inne problemy? :?:
bedzie co ma byc...
Awatar użytkownika
Hauleth
Wytworny Kaczor
Wytworny Kaczor
Posty: 382
Rejestracja: 18 sie 2008, 17:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: Hauleth »

W nagłówkowym daj extern "C" [deklaracja twojej funkcji]; i będzie działać
Jeśli problem rozwiązany dodaj na początku tematu [SOLVED].

Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: DDAroo »

C++ jest takie pogmatwane właśnie po to, żeby można go było mieszać z C.
Awatar użytkownika
marconi
Piegowaty Guziec
Piegowaty Guziec
Posty: 18
Rejestracja: 08 sty 2007, 15:11
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: marconi »

Fajnie to ujales.
W orginalnym programie w C mialem petle nieskonczona while(1) {}, ktora konczyla sie np. po 5 sekundach, dziekie uzyciu signal(SIGALRM,koniec() ). Jednak w qt4 chce zrobic tak, zeby dana metoda konczyla sie po 5 sekundach, niezalezenie od tego co sie dzieje w tym while (1) {}. Jak to napisac?

Czyli jak zrobic, zeby w qt4 nacisnac przycisk,pod ktorym chodzilaby sobie jakas petla while(1) {}, konczaca sie po 5 sekundach? Tez uzyć system call?
bedzie co ma byc...
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: kabanek »

Kod: Zaznacz cały

while(1) {}
nie ma prawa Ci się nigdy skończyć. Chyba, że przyciśniesz magiczny krzyżyk w prawym górnym rogu ;P
a tak btw chyba nie ten wątek
Awatar użytkownika
marconi
Piegowaty Guziec
Piegowaty Guziec
Posty: 18
Rejestracja: 08 sty 2007, 15:11
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: marconi »

Moze troche nie w temacie, ale tez nie odbiega zupelnie - mam program napisany w C i przenosze go do QT4. Przy okazji rozszerzam jego mozliwości.

Jak to nie mozna zakonczyc while(1) ? Czyli jak to ma byc? Jesli ktos napisze serwer jak poniższy pseudokod, i nie dostanie odpowiedzi, bo kabelek wypad to programu nie da sie przerwac while i wrocic do innej czesci programu?

Kod: Zaznacz cały

while(!czasPrzekroczony) { 
           recvfrom(socket,.....);
           [...]
}
Probowalem uzyc jeszcze setjmp i longjmp wywolywane przez sigalrm i alarm ustawiony na 5 sekund (alarm(5)). Ale to powodowalo segmentation fault. Pewnie dlategoze wchodzac do recvfrom czeka na sygnal, a ja go brutalnie przerywam. 

Jak przerwac po 5 sekundach tego recvfrom? Moze w QT jest jakies narzedzie, ktore daje taka możliwość?
bedzie co ma byc...
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: DDAroo »

Najprościej byłoby zmodyfikować kod tej metody, aby kończyła się po 5 sek. Jeśli nie chcesz / nie możesz tego zrobić to możesz wykorzystać nowy wątek (QThread). Umieścić w nim tą metodę, a potem wywołaj quit / zabij wątek po 5 sek.
Razi
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 150
Rejestracja: 20 paź 2007, 16:23
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Kontakt:

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: Razi »

Ja zawsze mieszam C z C++, tzn. używam C++, ale biblioteki głównie z C, bo są na niższym poziomie. Nie ma żadnego kłopotu, poza uzywaniem funkci malloc, realloc i takie tam.
Awatar użytkownika
marconi
Piegowaty Guziec
Piegowaty Guziec
Posty: 18
Rejestracja: 08 sty 2007, 15:11
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

[solved]Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: marconi »

Faktycznie, pomieszałem i mi nie zaszkodziło... ;)
Do zakonczenia tej petli while(1) znalazłem rozwiązanie typowe dla C, czyli:

Kod: Zaznacz cały

pid = fork();
if (pid == 0) { 
while(1) { ...pracuje... }
}
sleep(5);
kill (pid,SIGSTOP);
kill (pid,SIGINT);
W QT natomiast mógłbym to zastąpić:

Kod: Zaznacz cały

threadPracuje.start();
sleep(5);
threadPracuje.terminate();
Widać gołym okiem, że w C++ to jest takie bliższe człowiekowi :D Tylko ile się naszukałem tego terminate?! :wall: Nie działało quit, exit, wait...
bedzie co ma byc...
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [solved]Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: beluosus »

marconi pisze: Widać gołym okiem, że w C++ to jest takie bliższe człowiekowi :D Tylko ile się naszukałem tego terminate?! :wall: Nie działało quit, exit, wait...
To raczej nie kwestia języka tylko biblioteki, a co do terminate() to widać na pierwszy rzut oka w dokumentacji. Jak widać RTFM nie boli. ;)
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
marconi
Piegowaty Guziec
Piegowaty Guziec
Posty: 18
Rejestracja: 08 sty 2007, 15:11
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: marconi »

No tak! Teraz to wszyscy wiedzą ze terminate! :P

Mam jeszcze jeden problem. W tym forku używam zmiennej counter, która liczy ilość wykonanych pętli, i chce to przekazać dalej do programu. Ale niestety nie umiem tak zdefiniować zmiennej int counter, żeby była globalna. Szukałem po googlach, ale ciężko mi coś znaleźć. Probowałem z extern między innymi, definiowałem ją w private, w public. Ale nie działa i :wall:

Może ktoś wie jak zrobić zmienną w moim programie w C++, która bedzie globalna dla forka? W C to wszystko fajnie działa.
bedzie co ma byc...
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: beluosus »

marconi pisze:Może ktoś wie jak zrobić zmienną w moim programie w C++, która bedzie globalna dla forka? W C to wszystko fajnie działa.
Wydaje mi się, że jedynym wyjściem jest pamięć współdzielona. Zobacz ten kod:

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>
#include <signal.h>
#include <sys/mman.h>
#include <fcntl.h>

using namespace std;

int main()
{
    int fd = open("/dev/zero", O_RDWR);
    if(fd < -1)
    {
        cerr << "Failed to open" << endl;
        exit(1);
    }

    int *sharedi = (int*) mmap(0, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (sharedi < (int*) 0)
    {
        cerr << "Failed to mmap" << endl;
        exit(1);
    }

    int i = 0;
    *sharedi = 0;

    pid_t pid = fork();
    if (pid == 0)
    {
        while (1)
        {
            cout << "child" << endl;
            i++;
            (*sharedi)++;
            sleep(1);
        }
    }
    else if (pid < 0)
    {
        cerr << "Failed to fork" << endl;
        exit(1);
    }

    cout << "parent" << endl;
    sleep(3);
    kill(pid, SIGKILL);

    cout << "      i = " << i << endl;
    cout << "sharedi = "  << *sharedi << endl;

    return 0;
}
Mam nadzieję, że o to Ci chodzi i że nie popełniłem jakichś błędów. :)
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: jezyk C w C++ - czy mozna mieszac?

Post autor: el.pescado »

Używając pamięci współdzielonej trzeba pamiętać o synchronizacji dostępu do niej - chociażby za pomocą semaforów POSIX (bądź semaforów SysV, ale te pierwsze są nowsze i bardziej standardowe)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości