C Programlama diliyle şamatalar

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

muhittin_kaplan

     A=0x02;     // A değişkenine 2 sayısını yükle(A=2)
      P=&A;        // A değişkeninin adresini pointere kaydet
      P++;          //Adres bilgisini bir arttır
      *P=0x01;  // A adresinden Sonraki adrese 0x01 degerini yaz

Sanırım

sayment

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?


bocek

Alıntı Yapint    A;
short B;
char  C;
char  D;

int* P;

      A=0x02;
      P=&A;
      P++;
      *P=0x01;
       
Bu soruya kafa yorunuz. Sorum bu program ne yapar?

Bu soruyu çözen pointeri anladı demektir.

öncelikle: int ve short aynı anlama gelir,
hatta
int A;
short A;
short int A;


bu üçü aynı anlamdadır.

soruya gelince:
      A=0x02; // A'nın değerini 2 yap
      P=&A;    // A'nın adresini P pointerine ata
      P++;      // P pointerinin gösterdiği adresi 1 arttır. yani P, önceden A'nın adresini gösterirken, şimdi A'dan 1 sonraki adresi göstersin.  P artık bellekte A'nın değil, A'dan sonraki bellek adresini göstermektedir. bu da (muhtemelen) B'nin adresidir.
      *P=0x01; // B'nin değerini 1 yap
1 ya da 0. işte 'bit'ün mesele..

muhittin_kaplan

Nasıl Aynı Anlama Geliyor.
Alıntı Yap
Type                      Bytes  Bits                Range
short int                    2      16               -32,768 -> +32,767
unsigned short int    2      16                0 -> +65,535
unsigned int             4      16                0 -> +4,294,967,295
int                           4      32               -2,147,483,648 -> +2,147,483,647
long int                    4      32                -2,147,483,648 -> +2,147,483,647
signed char             1       8             -128 -> +127
unsigned char         1       8                0 -> +255
float                        4      32
double                    8      64
long double           12      96

z

#199
C dilinde şamata yapıyoruz desek de aslında CM4 işlemcimiz için Keil kullanarak C dilinde şamata yapıyoruz.

Bu şartlarda

int 32 bit
short 16
char da 8 bit değişken anlamına geliyor.

@Bocek  pointer sorusuna verdiğin cevabın doğru değil.

@Muhittin Kaplan

Sakla8 Reg2,[Reg1]

Reg2 registerindeki değeri Reg1 registerinde adresi saklı alana yaz anlamına geliyor.

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

int* P;

      A=0x02;
      P=&A;
      P++;
      P++;
      *P=0x01;
       
Birde bu soruya kafa yorunuz. Sorum bu program ne yapar?

Bu soruyu çözen pointeri tam anladı demektir.


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

muhittin_kaplan

MOV A,30h mu yani (30h adresinde bulunan bilgiyi A ya Taşı) 8051

muhittin_kaplan

int    A;
short B;
char  C;
char  D;
int    E;
 
int* P;
 
      A=0x02;	//A=0x02
      P=&A;	//P=A nın Adresi	
      P++;	//P=P+1
      P++;	//P=P+1
      *P=0x01;	//P nin gösterdiği adrese 0x01 yaz

Yani E ye

SERRO EFE

#202
Hocam E yemi C yemi :) ben C diye hesapladım ama..

z

Alıntı yapılan: muhittin_kaplan - 23 Aralık 2011, 17:18:10
MOV A,30h mu yani (30h adresinde bulunan bilgiyi A ya Taşı) 8051

MOV tarzi komutlarda işlem yönü firmadan firmaya değişir. Örneğin İntel ve TI da zıtdır.

Fakat benim örneğimde  Sakla8 Reg1,[Reg2] yazinca fazla kafa yormaya degmez.

Cunku Bir onceki komutta Yukle8 diye hayali bir komut yazmisim. Bununla register icine 0x01 gibi deger atamisim.
Hemen ardindan da Sakla8 di'ye hayali komut kullanmisim.

Bu durumda Yukle8 MOVE,  Sakla8 de STORE anlamina geliyor.

STORE komutunda STORE Reg1,[Reg2] ye bahsettigimden daha farkli anlam veremezsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan


justice_for_all

#205
char *a;

char b;

b= *a++;


ile

b=*a;
a++;


ayni mi calisir ?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

z

@Muhittin Kaplan

Evet aynen dedigin gibi E ye 0x01 yukler.

Yalniz bu soruda derleyicinin alt alta tanimladigimiz degiskenleri RAM'da da ardisil adreslere yerlestirdigini varsaydik.

Bu soru icin ardisil adresler olsa da daha farkli sorular icin durum degisir.

Neden degisir sorusunun cevabini merak edenler varsa kafa yorun biraz. Neden degisir?



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

bocek

#207
Alıntı yapılan: muhittin_kaplan - 23 Aralık 2011, 17:12:46
Nasıl Aynı Anlama Geliyor.
@muhittin hocam öyle diyorsun da bunca yıldır (epey bi yıl;) ben int ve short'u aynı bilirdim. şurdaki kaynaklar beni destekliyor:
http://s2.hubimg.com/u/978945_f496.jpg
http://www.exforsys.com/tutorials/c-language/c-programming-language-data-types.html

senin verdiğin tabloda int ve long int aynı uzunlukta.
benimkinde int ve short int aynı uzunlukta.

şurda da demiş ki öyle de olur böyle de:) sistemine göre değişir.
http://cprogramminglanguage.net/c-data-types.aspx
1 ya da 0. işte 'bit'ün mesele..

muhittin_kaplan

Aslında ben "Hangi derleyiciye Göre" Diyecektim (Ansi C data types -Google)ama bakınca Bunu gördüm.

z

@Bocek

32 Bit islemci ile calisiyoruz. Bu durumda short 16 bit anlama geliyor.

Senin verdigin tablo belliki 16 bit islemciler icin duzenlenmis.




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