Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => C/C++ => Konuyu başlatan: baran123 - 26 Kasım 2016, 22:29:16

Başlık: Bit Array
Gönderen: baran123 - 26 Kasım 2016, 22:29:16
Ş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)
Başlık: Ynt: Bit Array
Gönderen: baran123 - 26 Kasım 2016, 22:53:58
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 ?
Başlık: Ynt: Bit Array
Gönderen: baran123 - 26 Kasım 2016, 23:56:41
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...
Başlık: Ynt: Bit Array
Gönderen: kantirici - 27 Kasım 2016, 12:14:04
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)); 
Başlık: Ynt: Bit Array
Gönderen: 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?
Başlık: Ynt: Bit Array
Gönderen: baran123 - 29 Kasım 2016, 22:02:14
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. :)
Başlık: Ynt: Bit Array
Gönderen: bocek - 29 Kasım 2016, 23:38:28
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
Başlık: Ynt: Bit Array
Gönderen: baran123 - 29 Kasım 2016, 23:51:41
Hocam bu olayı C de yapmak mümkün mü peki.
Başlık: Ynt: Bit Array
Gönderen: Zoroaster - 29 Kasım 2016, 23:56:32
İşlemcin ARM mı?
Başlık: Ynt: Bit Array
Gönderen: 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 ?
Başlık: Ynt: Bit Array
Gönderen: bocek - 30 Kasım 2016, 00:18:01
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.
Başlık: Ynt: Bit Array
Gönderen: baran123 - 30 Kasım 2016, 00:19:59
Anladım hocam ben sadece yöntemi merak etmiştim. Tabi haklısınız kaydırma vs yöntemler çok daha tasarruflu.
Başlık: Ynt: Bit Array
Gönderen: Zoroaster - 30 Kasım 2016, 00:56:30
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.
Başlık: Ynt: Bit Array
Gönderen: baran123 - 30 Kasım 2016, 18:41:37
CoDer Hocam anladım örneğinizi teşekkür ederim.
Zoroaster Hocam bitbanding adreslemeyi bilmiyorum onu bir öğreneyim önce :)