C hakkında ilginç bir problem

Başlatan yamak, 24 Ekim 2014, 13:43:57

JKramer

Değişkenlerin yerlerinin değişmesinin yanında sekize de tamamlamışsınız, ilk structure'da yedi adet değişken var.

yamak

Hocam onlar buraya yazarken oldu.Normalde 7 değişken var.Hocam sebebi kesinlikle pointer ı initialize etmemiş olmam.Yerlerini değiştirdiğimde çalışıyor olması bence tesadüf.Mesela şöyle bişey olabilir.İlk durumda initialize etmediğim için belleğin güvenli olmayan bi yerini değiştiriyorum.Yerlerini değiştirdikten sonra compiler tesadüfi olarak pointerın gösterdiği adres güvenli biyer olmuş bu durumda da hiç bir sorun olmamış olabilir.

mir_as82

Ben olayı anlamadım :). Sorun sizin derleyicinizde mi? Sorun runtime hatası olacak şekilde kod yazılmasında mı? Kodunuzda runtime hatası varsa bazen doğru çalışır bazen doğru çalışmaz. Yani istediğiniz sonucu almanız kodunuzun doğru olduğu manasına gelmez hocam. Aman dikkat.

CLR

Compiler derlerken pointer point etmiyor diye uyarmıştır sizi ama açıkçası ben çalıştığınız proje üzerinden yazdığınızı düşünmüştüm.
Knowledge and Experience are Power

yamak

Alıntı yapılan: mir_as82 - 24 Ekim 2014, 16:12:19
Ben olayı anlamadım :). Sorun sizin derleyicinizde mi? Sorun runtime hatası olacak şekilde kod yazılmasında mı? Kodunuzda runtime hatası varsa bazen doğru çalışır bazen doğru çalışmaz. Yani istediğiniz sonucu almanız kodunuzun doğru olduğu manasına gelmez hocam. Aman dikkat.
Hocam derleyicide falan sorun yok.Bahsettiğim problem derleme esnasında ortaya çıkacak bi problem değil.Olay şu pointer ı tanımladım ama initialize etmedim.Yani local pointer tanımladığım için nereyi gösteriği belli değildi.Bu durumdada run time esnasında ne olacağı belli değildi.Tesadüfi olarak değişkenlerin yerini değiştirdiğimde kod çalıştı
Alıntı yapılan: CLR - 24 Ekim 2014, 16:21:26
Compiler derlerken pointer point etmiyor diye uyarmıştır sizi ama açıkçası ben çalıştığınız proje üzerinden yazdığınızı düşünmüştüm.
Tamam çalıştığım proje üzerinden yazdım ama tamamını kopyalayıp yapıştırmadım.Bi de öyle bi uyarı vermedi çünkü pointer gösterdiği bir yer vardı ama güvenli bi yer değildi.

CLR

Tamda bundan bahsediyordum önceki mesajımda, şimdi aslında uygulamalı oldu, Kendisi bir adres gösterdiyse, neden 8bitide aynı yere atmadı. 6 tanesi doğru değişirken 2 tanesi yanlış değişiyor, muhtemelen onlar 16bit içinde bir yerde. Pointer aynı anda iki adres göstemiyeceğine göre.
Knowledge and Experience are Power

yamak

#21
Alıntı yapılan: CLR - 24 Ekim 2014, 17:30:07
Tamda bundan bahsediyordum önceki mesajımda, şimdi aslında uygulamalı oldu, Kendisi bir adres gösterdiyse, neden 8bitide aynı yere atmadı. 6 tanesi doğru değişirken 2 tanesi yanlış değişiyor, muhtemelen onlar 16bit içinde bir yerde. Pointer aynı anda iki adres göstemiyeceğine göre.
"muhtemelen onlar 16bit içinde bir yerde" bu cümle ile ne demek istediğini anlamadım.Bellek zaten 16 bitlik.
Pointer ı initialize edince her şey gayet güzel çalıştı.Ayrıca ben bu şekilde defalarca kullandım hem pc de hem embedded da (8 16 32 bitlik sistemlerin hepsinde) hiç birinde sorun olmadı.İstersen aşağıdaki kodu gcc'de bi derleyip çalıştır.
#include <stdio.h>
typedef union
{
    unsigned char all;
    struct
    {
    unsigned char bit1:1;
    unsigned char bit2:1;
    unsigned char bit3:1;
    unsigned char bit4:1;
    unsigned char bit5:1;
    unsigned char bit6:1;
    unsigned char bit7:1;
    unsigned char bit8:1;
    }bit;
}Byte;

int main(void)
{
    Byte byte1;
    byte1.bit.bit1=1;
    byte1.bit.bit5=1;
    byte1.bit.bit8=1;
    printf("%d\n",byte1.all);
}

Bi ara gerbay MMIO'da belleğe byte byte erişilemez gibi bişey söylemişti ama konuyu bi türlü bulamıyorum.Eğer bu tarz bi olayı kastediyosan bilmiyorum.Ama o bahsedilen şey tam olarak bu değildi galiba çünkü o şekilde erişmeye çalışacan arkadaş sorun yaşadığı için öyle bi konu açmıştı.Dediğim gibi ben bunu allignment etmeden bi çok kez kullandım hiç bi sorun olmadı.Zaten burda alligment a gerek olduğunu düşünmüyorum.

hasankara

#22
bayağı gerek yok. stuct dışında da bit tipinde değişken tanımlayabilirsin (unsigned deneme;)bu şekilde. alt alta bit tanımladığında derleyici onları aynı bytedan ayarlıyor zaten. yani struct içinde bit tanımlarken de sonuna :1 diyerek bir bit olduğunu ekstradan belirtmene gerek kalmıyor.

edit sebebi: yanlış bilgi paylaşımı.

yamak

#23
Alıntı yapılan: hasankara - 24 Ekim 2014, 18:48:54
bayağı gerek yok. stuct dışında da bit tipinde değişken tanımlayabilirsin (unsigned deneme;)bu şekilde. alt alta bit tanımladığında derleyici onları aynı bytedan ayarlıyor zaten. yani struct içinde bit tanımlarken de sonuna :1 diyerek bir bit olduğunu ekstradan belirtmene gerek kalmıyor.
Bi örnek verir misin?Mesela benim yaptığım gibi 7 adet 1 bitlik değişken tanımlar mısın?

hasankara

union {
    unsigned char byte;
    struct {
        unsigned bit0;
        unsigned bit1;
        unsigned bit2;
        unsigned bit3;
        unsigned bit4;
        unsigned bit5;
        unsigned bit6;
        unsigned bit7;
    } bitler;
} deneme;

mufitsozen

Alıntı yapılan: hasankara - 24 Ekim 2014, 20:38:56
union {
    unsigned char byte;
    struct {
        unsigned bit0;
        unsigned bit1;
        unsigned bit2;
        unsigned bit3;
        unsigned bit4;
        unsigned bit5;
        unsigned bit6;
        unsigned bit7;
    } bitler;
} deneme;


Alıntı Yap#include <stdio.h>

union {
    unsigned char byte;
    struct {
        unsigned bit0;
        unsigned bit1;
        unsigned bit2;
        unsigned bit3;
        unsigned bit4;
        unsigned bit5;
        unsigned bit6;
        unsigned bit7;
    } bitler;
} deneme;

int main(){

    printf("size %d", sizeof(deneme));

    return 0;

}

sonucunu bizimle paylasirmisiniz?
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yamak

#26
Bu union'ın kaç byte kapladığını biliyo musun?
Edit:Ben yazarken mufitsozen benim soracağım soruyu sormuş.

Tagli

Ben bir tahminde bulunayım: 2 (yani 16 bit).
Gökçe Tağlıoğlu

hasankara



:( hatalıysam lütfen bu şekilde uyarın.