Jak skleić kilka zmiennych typu bool w jedną typu char albo dłuższą?
bool* bo = new bool[10]; bo[0] = false; bo[1] = true; bo[2] = true; bo[3] = true; bo[4] = true; bo[5] = true; bo[8] = true; Lub (lepiej) Zapisać te zmienne do pliku bit po bicie a nie jedną na bajt.
@KrzaQ2: chyba nie bardzo rozumiem - stwierdziles, ze lepiej jest alokować std::vector na stosie niz tworzyc tablicę typow, bo std::vector automatycznie dba o pozbycie sie jego bufora - i to jest okej, ale jesli chcesz zapisać stan, ktory nie jest zależny od funkcji, to - chcesz nie chcesz - musisz alokować na stercie, od tego właśnie przeto masz new. Chyba, że coś pominąłem? :D
@alex-fortune: Możesz zwrócić vector albo z unique_ptr z funkcji. Zwracanie nagiego wskaźnika odpowiedzialnego za zwolnienie pamięci jest nieakceptowalne.
@KrzaQ2: No ale unique_ptr nadal potrzebuje w środku typ T*, nie myle się? Jak tutaj pominiesz new? :P Jak dla mnie bardziej to brzmi jako ,,nie pracuj z nagimi wskaźnikami, bo bedziesz mial problemy z zarządzaniem pamięcią" ;)
@alex-fortune: Tak, wszystko to napisałem w poście, nie bardzo chce mi się powtarzać. Ale jeśli mowa o unique_ptr to w większości przypadków masz make_unique
@alex-fortune: Wut? Nie wiem skąd bierzesz informacje. make_unique ma problem właśnie z agregatami i gdy chcesz własny deleter. A co robi pod spodem nie ma znaczenia, istotne jest aby jawnie tego nie robić bez powodu.
@alex-fortune: od dłuższego czasu stosuję identyczne podejście jak @KrzaQ2 (a już myślałem, że tylko ja jestem taki mądry ;) ). Takie rozwiązanie niweluje naprawdę wiele problemów, szczególnie w dużych aplikacjach.
@KrzaQ2: Zarówno std::vector jak i std::bitset są niedorozwinięte.
@look997: Jeszcze możesz z boost::dynamic_bitset skorzystać: https://wandbox.org/permlink/FR3keanVBn2QdkAV Ale na jakąś sensowną kolejność bitów to nie licz. Jeżeli nie chcesz się bawić w boosta to zostaje ci napisanie tego recznie albo użycie std::bitset<8> i konwertowanie w locie przy użyciu to_ulong.
Jak skleić kilka zmiennych typu bool w jedną typu char albo dłuższą?
bool* bo = new bool[10];bo[0] = false;
bo[1] = true;
bo[2] = true;
bo[3] = true;
bo[4] = true;
bo[5] = true;
bo[8] = true;
Lub (lepiej)
Zapisać te zmienne do pliku bit po bicie a nie jedną na bajt.
Robiłem to pętlą i tak to wychodzi.
for(int x=0; x<3; x++) {ofs.write((char*)(&bo[x]), sizeof(*bo));
}
Boolextracted = (bool >> pozycja) & 1;
vectorlub, lepiej,bitset<10>. A o używaniunewmam tyle do powiedzeniaKomentarz usunięty przez autora
Komentarz usunięty przez autora
vectoralbo zunique_ptrz funkcji. Zwracanie nagiego wskaźnika odpowiedzialnego za zwolnienie pamięci jest nieakceptowalne.Jak dla mnie bardziej to brzmi jako ,,nie pracuj z nagimi wskaźnikami, bo bedziesz mial problemy z zarządzaniem pamięcią" ;)
unique_ptrto w większości przypadków maszmake_uniquemake_uniquema problem właśnie z agregatami i gdy chcesz własny deleter. A co robi pod spodem nie ma znaczenia, istotne jest aby jawnie tego nie robić bez powodu.@look997: Jeszcze możesz z
boost::dynamic_bitsetskorzystać:https://wandbox.org/permlink/FR3keanVBn2QdkAV
Ale na jakąś sensowną kolejność bitów to nie licz.
Jeżeli nie chcesz się bawić w boosta to zostaje ci napisanie tego recznie albo użycie std::bitset<8> i konwertowanie w locie przy użyciu
to_ulong.