Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Bit Array

Başlatan baran123, 26 Kasım 2016, 22:29:16

baran123

Şu kodda ki hatayı anlamadım.
Amacım bir değişkenin bitlerine "Dizi"ymiş gibi erişebilmek.

Ben nerede hata yapıyorum acaba ?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct {
    unsigned bit:1;
}BIT_t;

typedef union {
    struct {
        BIT_t bits[8];
    };
    struct {
        uint8_t Data;
    };
}BitArray_t;

int main(void) 
{
    BitArray_t myBitArray;
    
    for (int i = 0; i < 8; i++)
        myBitArray.bits[i] = 1;
    
    printf("Data = %d", myBitArray.Data);
    
    return (0);
}


NetBeans, C99

Hata Çıktısı
cd 'C:\Users\Baran\Desktop\CppApplication_1'
C:\MinGW\msys\1.0\bin\make.exe -f Makefile CONF=Debug
"/C/MinGW/msys/1.0/bin/make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make.exe[1]: Entering directory `/c/Users/Baran/Desktop/CppApplication_1'
"/C/MinGW/msys/1.0/bin/make.exe"  -f nbproject/Makefile-Debug.mk dist/Debug/MinGW-Windows/cppapplication_1.exe
make.exe[2]: Entering directory `/c/Users/Baran/Desktop/CppApplication_1'
mkdir -p build/Debug/MinGW-Windows
rm -f "build/Debug/MinGW-Windows/main.o.d"
gcc    -c -g -std=c99 -MMD -MP -MF "build/Debug/MinGW-Windows/main.o.d" -o build/Debug/MinGW-Windows/main.o main.c
main.c: In function 'main':
main.c:23:30: error: incompatible types when assigning to type 'BIT_t {aka struct <anonymous>}' from type 'int'
         myBitArray.b.bits[i] = 1;
                              ^
make.exe[2]: *** [build/Debug/MinGW-Windows/main.o] Error 1
make.exe[2]: Leaving directory `/c/Users/Baran/Desktop/CppApplication_1'
make.exe[1]: *** [.build-conf] Error 2
make.exe[1]: Leaving directory `/c/Users/Baran/Desktop/CppApplication_1'
make.exe": *** [.build-impl] Error 2

BUİLD FAILED (exit value 2, total time: 1s)

baran123

#1
Hatayı buldum fakat çıktı olarak 59 alıyorum.

myBitArray.bits[i] = 1;

yerine
myBitArray.bits[i].bit = 1;

yapılırsa hata vermiyor ama çıktı :(

Bütün bitlere 1 veriyorum 8 tane olduğuna göre 255 çıktısını almam gerekmiyor mu ?

baran123

#2
sizeof(myBitArray)

yaptığımda çıktının 32 byte olduğunu gördüm.
aynı zaman
typedef struct 
{
    unsigned bit:1;
}BIT_t;

bu structure ın uzunluğu 4 byte yani 32 bit bunu direk int olarak kabul etmiş
Bu yüzden
sizeof(BitArray_t);

8*4 byte tan 32 byte çıkıyor
tabi oradaki uint8_t yi +1 byte olarak eklemiyoruz çünkü bu union :)
yani bu şekilde bitlere erişmek mümkün değilmiş.

to be continued...

kantirici

struct'ın hafızada içine tanımlanan değişkenler kadar yer tutması için "packed" yapılması gerekir.

Burada detyalı anlatılmış http://codingfox.com/16-9-struct-padding-in-c/

Netbeans de böyle tanımlanıyormuş;

struct num
{
 short a;
 char ch;
 double b;
}__attrubute__((packed)); 

muhittin_kaplan

Buna nerede ihtiyacim olur ?
Bitleri yan yana bur int de toplar istedigimde bitwise islemlerle alirim. Olmaz mi?

baran123

Alıntı yapılan: muhittin_kaplan - 27 Kasım 2016, 23:41:13
Buna nerede ihtiyacim olur ?
Bitleri yan yana bur int de toplar istedigimde bitwise islemlerle alirim. Olmaz mi?
Hocam benim amacım dizi gibi erişmekti. (bitArray)Tabi sizin böyle bir ihtiyacınız yoksa direk dediğiniz yöntemle yapabilirsiniz.
Sağ olsun Coder hocam örnek vermiş anca zaman buldum deneyeceğim. :)

bocek

C++ kullanacaksanız std::bitset<> tam size göre:

http://en.cppreference.com/w/cpp/utility/bitset/operator_at
Example penceresindeki kodu değiştirip online denemeler yapabilirsiniz.

#include <iostream>
#include <bitset>
 
int main()
{
    std::bitset<8> b1(42);
    for (std::size_t i = 0; i < b1.size(); ++i) {
        std::cout << "b1[" << i << "]: " << b1[i] << '\n';
    }
    b1[0] = true; // modifies the first bit through bitset::reference
    std::cout << "After setting bit 0, the bitset holds " << b1 << '\n';
}


Output:

b1[0]: 0
b1[1]: 1
b1[2]: 0
b1[3]: 1
b1[4]: 0
b1[5]: 1
b1[6]: 0
b1[7]: 0
After setting bit 0, the bitset holds 00101011
1 ya da 0. işte 'bit'ün mesele..

baran123

Hocam bu olayı C de yapmak mümkün mü peki.

Zoroaster

İşlemcin ARM mı?
Seytan deliginden kacti.

baran123

Ortada bir işlemci yok hocam :)
Yazılımsal olarak düşünüyorum.
Ama ARM olsa ne yapardık ki ?

bocek

Bu şekilde, yani std::bitset<> gibi C'de olmuyor bildiğim kadarıyla. Çeşitli yöntemler var ama astarı yüzünden pahalıya geliyor. Yani hem bellek hem de işlem israfı oluyor.

Aslında muhittin_kaplan'ın dediği kapıya çıkıyoruz sonuçta. Bitlerle tek tek oynayacaksak bit kaydırma ile hallediyoruz en pratik olarak.
"Dizi olarak erişsen n'olacak erişmesen n'olacak?" noktasına geliyoruz.
1 ya da 0. işte 'bit'ün mesele..

baran123

Anladım hocam ben sadece yöntemi merak etmiştim. Tabi haklısınız kaydırma vs yöntemler çok daha tasarruflu.

Zoroaster

Alıntı yapılan: baran123 - 30 Kasım 2016, 00:06:30
Ortada bir işlemci yok hocam :)
Yazılımsal olarak düşünüyorum.
Ama ARM olsa ne yapardık ki ?

BitBanding adresleme ile memorye bit bit erişiyorsun. Bu da demektir ki memory'nin tamamı bit array.
Seytan deliginden kacti.

baran123

CoDer Hocam anladım örneğinizi teşekkür ederim.
Zoroaster Hocam bitbanding adreslemeyi bilmiyorum onu bir öğreneyim önce :)