Wskaźniki do pól bitowych są niedozwolone !?

0

Czemu nie można utworzyć wskaźnika do pola bitowego ? Powstają pewne ograniczenie , bo z tego wynika , że nie można utworzyć tablicy pól bitowych . A pola bitowe mogą być fajną alternatywa dla zmiennych bool , które nie wszystkie kompialtory obsługują . Akurat sie złożyło , że potrzebowałem tablice zmiennych bool w kompilatorze gdzie nie ma tych zmiennych , pomyślałem , że zrobie tablice pól bitowych jednobitowych a tu sie nie da :(

0

Dlaczego nie można utworzyć wskaźnika? Przyczyna leży w budowie pól bitowych. Jak można zrobić wskaźnik do np. połowy komórki? Wskaźniki musiałbyby być chyba liczbami zmiennoprzecinkowymi (a przynajmniej musiałyby być 8 razy większe).
Załóżmy, że mamy taką strukturę:
struct Przyklad
{
unsigned a: 4;
unsigned b : 4;
};
Łącznie zajmuje ona 8 bitów czyli jeden bajt.
Możemy zrobić wskaźnik do a, bo to będzie zwykły wskaźnik do struktury. Ale żeby mieć wskaźnik do b musielibyśmy mieć wskaźnik typu &a+0.5 bo jest w połowie struktury :)

0

No oczywiście masz racje . Wynika to z tego , że wskaźniki przechowują liczby całkowite które są adresami , gdzie bajt jest najmniejszą jednostką . Rzeczywiście nie można odwołać sie przez wskaźnik do połowy bajtu , a do takiej sytuacji mogłoby dojść , choć nie zawsze , ale widocznie kompilator z góry zabrania tego typu operacji . A do tego jeszcze najmniejszą jednostką jaką przyjmuą funkcje malloc i new jest bajt . Dzięki , już jasne , ale głupi byłem że o tym nie pomyślałem .
A to tak dla ciekawostki :
zrobiłem w klasie klasa pole bitowe pole
mam taki kod :
void *test=&(klasa.pole);
a kompilator wywala taki błąd :
'&' on bit field ignored
:)

0

nazwa struktury jest juz wskaznikiem :-)
zeby dobrac sie do 1 i 2 elementu wystarczy przesunac o 4
wartosc wskazywana przez wskaznik i po problemie

ps.

[code]operator przesuniecia bitowego to

0

nazwa struktury jest juz wskaznikiem :-)
zeby dobrac sie do 1 i 2 elementu wystarczy przesunac o 4
wartosc wskazywana przez wskaznik i po problemie

nie kazdej struktury , jak zrobisz cos takiego :
struktura *x=new struktura ;
to rzeczywiscie x to wsk
a jesli jest cos takiego :
struktura x;
to x jest tylko nazwa ( referencja )
a co do tego dobierania sie do pola , to tak , adres struktury to w tym przypadku adres bajtu w ktorym przechowywane sa 2 te pola bitowe . Problem teraz tylko z odpowidnim odczytaniem ich wartosci . Trzeba zastosowac koniunkcje bitowa zeby odpowiednio przeczytac , co tam jest , w przypadku 1 pola , mozna przeniesc jego wart do innej zmiennej zastosowac koniunkcje bitowa &240 , a nastepnie przesuniecie bitowe >>4 i po klopocie , mozna teraz normalnie czytac ta zmienna jako liczbe calkowita . Ale to wszystko i tak mi nic nie daje bo nie zmienia to faktu ze tablicy pol bitowych sie nie zrobi :(

0

nie kazdej struktury , jak zrobisz cos takiego :
struktura *x=new struktura ;
to rzeczywiscie x to wsk
a jesli jest cos takiego :
struktura x;
to x jest tylko nazwa ( referencja )

hmmm ...

x to tylko nazwa ale &x to juz wskaznik :-)

a ze swojego doswiadczenia wiem tzn zetknalem sie tylko z polami bitowymi w strukturach a jesli interesujesz sie optymalnym przechowywaniem danych moze analiza kodowania huffmana w czym by ci pomoogla tzn przechowywanie jakis wartosci w kilku bitach i uzupelnianie do pelnego bajta kolejnymi wartosciami :-)

pozdrawiam
wojta$

0

... a co do konkretnej odpowiedzi to wskaznik do pola bitowego jest bez sensu gdyz pojedyncze pole bitowe i tak zajmuje w pamieci odpowiednia wielokrotnosc bajta :-( i tylko zastosowanie w strukturach ma sens np.

[code]struct test{
char x:4;
};[/code]

zajmie w pamieci tyle samo miejsca co

[code]struct test2{
char x1:4;
char x2:4;
};[/code]

z powyzszego wynika iz wskaznik do pojedynczego pola bitowego i tak bylby wskaznikiem do [code]char[/code]

pozdrawiam
wojta$

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