dziwne zachowanie wskaźnika

0

Witam!

Mam pewien problem ze wskażnikiem w funkcji wziętej z biblioteki netlink:

int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen) {
	int len = RTA_LENGTH(alen);
	struct rtattr *rta;

	if (NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len) > maxlen) {
		fprintf(stderr, "addattr_l ERROR: message exceeded bound of %d\n",maxlen);
		return -1;
	}
	rta = NLMSG_TAIL(n);
	rta->rta_type = type;
	rta->rta_len = len;
	memcpy(RTA_DATA(rta), data, alen);
	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len);
	return 0;
}

błąd generuje linijka:

rta = NLMSG_TAIL(n);

a brzmi on tak:

Warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]

Wygląda mi to na nieprawidłowy format przypisywanej wartości do wskaźnika, ale próby konwersji czy też wprowadzania dodatkowych wskaźników nic tutaj nie dają. Co ciekawe ta sama funkcja pod Windowsem działa prawidłowo, ale pod Linuxem już nie :( Może ktoś z was ma jakiś pomysł? Pilne!

0

Już jestem w stanie stwierdzić, że problem jest z wartością n, ale w dalszym ciągu nie wiem jak to rozwiązać! POMOCY!

0

Warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]

To jest ostrzeżenie i znaczy, że do pointera na typ void dodajesz jakąś wartość (int) i kompilator nie ma pewności o ile zwiększyć ten adres.
Z tego co doczytałem na temat netlink, to może być to wina makra NLMSG_TAIL. Rozwiązanie to wyłączenie tego ostrzeżenia (bo makra nie będziesz poprawiał).

0

wiem że jest to ostrzeżenie ale wywala mi to cały projekt, bo powoduje że się nie udaje go kompilować, doczytam o tym jak wyłączyć to ostrzeżenie i może coś sie zmieni

0

Nie, ostrzeżenia nie przerywają kompilacji. Kompilację przerywają błędy. Więc jaki błąd odstajesz (pierwsza linijka z napisem "error")?

0

Dajesz wynik:

make | grep error:
0

przez własną głupotę napisałem że mi to przerywa kompilację w trybie Relase, a problem tkwi całkowicie w czym innym bo po przekompilowaniu w trybie Debug wyświetliły się błędy - chodzi o podłączenie bibliotek, a mianowicie korzystam z dwóch bibliotek: log4cpp i cryptopp

wcześniej zainstalowałem jako składniki systemu te biblioteki bo miałem problemy z widzialnością ich podczas kiedy były dołączane lokalnie, teraz jest w sumie tak samo - całe drzewo błędów typu:

Error: undefined reference to `CryptoPP::BitCount() const'

i to zarówno w plikach bibliotek jak i samego projektu

ktoś z was ma jakiś pomysł jak to rozwiązać? tego typu błędów mam teraz 342 daltego nie wiem czy jest sens wklejać to wszystko tutaj

0

Brak biblioteki cryptopp, musisz ją dodać w swoim pliku makefile lub innym pliku, cokolwiek tam używasz zarządzania buildem.

0

zainstalowałem uzywane biblioteki bezpośrednio w systemie, i efekt tego jest taki że aplikacja się buduje ale podczas uruchamiania builder wywala błąd

kopia logu buildera w załączniku do tego posta (za długi żeby wkleić go tutaj)

biblioteki podłączam tak:

#include <log4cpp/SimpleConfigurator.hh>
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/OstreamAppender.hh>
#include <cryptopp/dsa.h>
#include <cryptopp/osrng.h>cv
#include <cryptopp/files.h>

z poziomu kodu wszystko wydaje się być ok, chyba że się myle, aczkolwiek dalej nie rozwiązuje to problemu - program się buduje, wszystkie pliki .o są ale .exe nie ma :/
pliku makefile nie tworzyłem, chyba że został utworzony automatycznie, dlatego też potrzebował bym małej podpowiedzi jak to zrobić - do tej pory nie miałem za bardzo do czynienia z programowaniem pod unixem, bo w windowsie chyba plik makefile jest tworzony automatycznie np. w VS

0

Biblioteki są dostarczane w postaci kodów źródłowych (pliki nagłówkowe zawierających deklaracje) oraz binarek zawierających skompilowane definicje (pliki .lib). Pliki nagłówkowe dołączyłeś do projektu (przez include), dzięki temu program "wie" jak korzystać z lib'a. Ale samego lib'a już nie dołączyłeś. Można to zrobić na kilka sposobów:

  • jeśli używasz jakiegoś IDE i masz skomponowany projekt, to wejdź do ustawień projektu i gdzieś w opcjach związanych z linkerem będzie można dodawać biblioteki ("input", "input librarites" itp.)
  • jeśli kompilujesz z konsoli czy też piszesz makefile trzeba te biblioteki przekazać w linii komend przy pomocy odpowiedniego parametru (w gcc jest to parametr -l)
  • niektóre kompilatory (w tym gcc) pozwalają na dołączanie bibliotek "w kodzie" przy pomocy makra #pragma comment
0

dzięki za obszerne opisanie problemu

Używam IDE o nazwie MonoDevelop i rzeczywiście w opcjach znalazłem sekcje dotyczącą bibliotek. Są w niej dwie zakładki Libraries oraz Paths. W pierwszej jest miejsce na załadowanie .dll (chyba), których nie ma w bibliotekach, których uzywam a w drugiej zakładce są 2 pola: library i include - gdzie wskazałem katalogi - w pierwszym polu ogólny katalog biblioteki ściągnięty za strony a w drugim katalog include z drzewa katalogów biblioteki o ile taki katalog był - w log4cpp tak ale w cryptopp już nie i wskazałem ponownie katalog główny bibliotek bo zawierał też pliki nagłówkowe.

Nawet wobec takiego stanu rzeczy projekt sie nie uruchamia :(
Załączam go w załączniku wraz z bibliotekami (w tej chwili ładowane są one z systemu a nie z katalogu projektu), gdyby ktoś z was miał za duzo wolnego czasu i spojrzał na to bo ja już powoli tracę nadzieję, że mi się go uda uruchomić, tym bardziej że jestem zielony w programowaniu pod linuxem :(

http://speedy.sh/DCwJy/projekt.zip

dodałem dyrektywe #pragma comment dla tych dwóch bibliotek przed włączaniem samych plików nagłówkowych, ale skutkuje to tylko tym że w trybie Debug wywala jeszcze więcej błędów a w Realse nis się nie zmienia - projektu nie można zbudować z błędem takim jak dołączony do postu powyżej

1 użytkowników online, w tym zalogowanych: 0, gości: 1