C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

Burak B

#210
char <= short <= int <= long

Unutmadan chardan küçük nibble dediğimiz 4 bitlik veri vardır ancak bunu derleyiciler BCD dışında pek irdelemez. Semioctet diyede geçer.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

Alıntı yapılan: sayment - 23 Aralık 2011, 15:02:17
void SystemInit()
{
}

typedef struct
{
   int x;
   short y;  
} MyStruct;           // MyStructure adinda structure tanimi yaptik

MyStruct A;           // A, MyStructure yapisinda olsun.

int main()
{

    MyStruct* Z;     // Z bir pointer olsun ve MyStructure tipindeki verilere ulasmaya yarasin
 
    A.x=1;           // A structurunda x elemanina 1 degerini yukle
    A.y=2;           // A structurunda y elemanina 2 degerini yukle 
   
    Z=&A;            // Z pointerimize A structure'inin adresini yukleyelim
    Z->x=3;          // Z pointerinin, point ettigi structure'in x elemanina 3 degerini yukle
    Z->y=4;          // Z pointerinin, point ettigi structure'in y elemanina 4 degerini yukle
     
    while(1);
}

Anladım "A.x=y" ile "Z->x=y" aynı anlama geliyor. Ama neden "A.x=y" yazmak yerine "Z->x=y" yazıyoruz?
Bunun avantajı ne bize ne sağlıyor?

Mystructure tipinde A, B, C, D, ..... structurelar tanimlamis olalim.

Tek bir fonksiyon yazarak istedigim structurla veri alisverisinde bulunmak isteyelim.

Iste burada siradan degiskenlerde pointer ne avantaj sagliyorsa structure pointer de structure yapisindaki degiskenlerde ayni avantaji saglar.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

GreeN

int    A;
short B;
char  C;
char  D;
int    E;
int* P;
      A=0x02; 
      P=&A;    
      P++; 
      *P=0x01;


Sorularım var ,
1- bunalmis hocam peşisıra yapılan tanımlamalarda , tanımladığımız değişkenlere ram'de ardı ardınamı yer alırlar. bu istisnasız değişmez öylemi ?
2- A 32 bit , ve B 16 bit ise bunların ram'de tuttukları yerler ;



Böylemidir ? (Adres misal vermek için yazıldı ) böyle ise  P=&A;  satırında A'nın bulunduğu adres olarak P hangi değeri alır ?

3- P++; satırında adres değeri bir mi artırılır ? Yoksa int *P; ile 32 bit tanımlandığı için 32 eklenerek mi artırılır?

4- Eğer değer 32 artıyorsa *P=0x01; ile değer D'ye mi yazılır yani D=0x01 mi olur? (B 16 bit C 8 bit D 8 bit)





Terörü Lanetliyoruz.

z

Green

1 nolu soruya  cevap vermistik.

Veriler ardisil adreslere yerlesmez. İstisnai olarak aşağıdaki örnekte ardışıl çünkü veri tiplerine özenle seçtim.
Diğer sorularına gelmeden önce ilk soruma tekrar gözatmanızı istiyorum.

int    A;
short B;
char  C;
char  D;

int* P;

      A=0x02;
      P=&A;
      P++;
      *P=0x01;
       
Bu soruya cevaplar geldi. Fakat sonradan farkettim. Henüz doğru cevap gelmedi.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

burada da 0x01 değerini B ye yükler

muhittin_kaplan

#215

z

#216
Pointerin dikkatsiz kullanımı kazalara yol açar.

Birşeyler eziliyor. Pointerle uğraşmanın tehlikesi de bu. Hangi değişkene ne oluyor?

Big endian ve little endian durumu için aynı soruya bir daha kafa yorun.


@Muhittin kaplan  Verdiğin resim yanlış.

ARM işlemcilerde ram adresleri 1 bir artarken sadece 8 bit ilerlersin.

0 adresinde int değer varsa adresi 4 artırırsan bu int değişkeni takip eden değişkene ulaşırsın.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

GreeN


Alıntı yapılan: bunalmis - 23 Aralık 2011, 18:13:25
Green

1 nolu soruya  cevap vermistik.

Veriler ardisil adreslere yerlesmez. İstisnai olarak aşağıdaki örnekte ardışıl çünkü veri tiplerine özenle seçtim.
Diğer sorularına gelmeden önce ilk soruma tekrar gözatmanızı istiyorum.

int    A;
short B;
char  C;
char  D;

int* P;

      A=0x02;
      P=&A;
      P++;
      *P=0x01;
       
Bu soruya cevaplar geldi. Fakat sonradan farkettim. Henüz doğru cevap gelmedi.

Eğer ram adresimiz 0x20000000'den başlıyorsa
A'nın adresi 0x20000020 olur. A =0x02  değerini alır (32 bit)
P=&A; //A'nın adresi 0x20000020 olur. P A 'nın adresini alır.
P++; //P 32 bit artırılır , 0x20000040  olur buda D nin adresidir.
*P=0x01; //pointer tuttuğu adrese 0x01 değerini yazar. Yani D ye 0x01 değeri atılır.




Terörü Lanetliyoruz.

GreeN

Alıntı yapılan: muhittin_kaplan - 23 Aralık 2011, 18:28:37
(Resim gizlendi görmek için tıklayın.)

Muhittin hocam o zaman senin gösterdiğin ram yapısında pointeri öyle artır ki D'yi yada C'yi işaret etsin ?
Terörü Lanetliyoruz.

z

Alıntı YapEğer ram adresimiz 0x20000000'den başlıyorsa
A'nın adresi 0x20000020 olur. A =0x02  değerini alır (32 bit)
P=&A; //A'nın adresi 0x20000020 olur. P A 'nın adresini alır.
P++; //P 32 bit artırılır , 0x20000040  olur buda D nin adresidir.
*P=0x01; //pointer tuttuğu adrese 0x01 değerini yazar. Yani D ye 0x01 değeri atılır.

Anlaşıldı. Bu böyle olmayacak.

Adres hesaplaması bu şekilde değil. Yanlış yapıyorsunuz.

Arm işlemcilerde memory kullanımı, değişkenlerin ramda tanımlanması konusuna bakmanız gerekecek.

Tabiki big ve little endian yapısına da.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

#220
Alıntı yapılan: bunalmis - 23 Aralık 2011, 18:13:25
Veriler ardisil adreslere yerlesmez. İstisnai olarak aşağıdaki örnekte ardışıl çünkü veri tiplerine özenle seçtim.
Diğer sorularına gelmeden önce ilk soruma tekrar gözatmanızı istiyorum.

int    A;
short B;
char  C;
char  D;

int* P;

      A=0x02;
      P=&A;
      P++;
      *P=0x01;
Bu soruya cevaplar geldi. Fakat sonradan farkettim. Henüz doğru cevap gelmedi.
C D 0 olurken B 1 değerini alması gerekiyor (little endian)
B C 0 olurken D 1 değerini alması gerekiyor (big endian)

hocam Cortex-M3 M4 serisinde adresler ardışıl yerleşiyor diye biliyorum  ???
sf:10-11 ben mi yanlış anladım acaba?
http://www.arm.com/files/pdf/IntroToCortex-M3.pdf

arada yazılanları sonradan gördüğümden edit fazla oldu kusura bakmayın

GreeN

Alıntı yapılan: bunalmis - 23 Aralık 2011, 18:30:47

ARM işlemcilerde ram adresleri 1 bir artarken sadece 8 bit ilerlersin.

0 adresinde int değer varsa adresi 4 artırırsan bu int değişkeni takip eden değişkene ulaşırsın.

8 bit ilerlersek B = 0x0100 olur sanırım (bu sefer doğru olsun .... :)  )
Terörü Lanetliyoruz.

ErsinErce

Alıntı yapılan: GreeN - 23 Aralık 2011, 18:51:27
8 bit ilerlersek B = 0x0100 olur sanırım (bu sefer doğru olsun .... :)  )

Adres ile değer kavramlarını karıştırıyorsun hocam
biri evin kapı numarası diğeri içindeki kişi sayısı

bocek

windows olsaydı çoktan mavi ekran vermişti   :D
1 ya da 0. işte 'bit'ün mesele..

muhittin_kaplan

Peki M4 chip Big mi little mi?
Little ve big olursa ne olur ?