C Programlama diliyle şamatalar

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

ilhan_mkp

bu olayı catpat asm ile alakalı bir durumda görmüştüm şimdi osc ayarlarını biraz çalışırsam anlaşıldı

z

#46
type casting

Gene örneklerle açıklayacağım.

int a;
short b;

              a=0x12345678;    //  olsun; 
              b=(short)a;         // dersek b, 0x5678 değerini  alır

              (short)a demek, biliyorum sen short değilsin fakat kendini şu an için short'dan say demek
             
-----------------------------------

int a;
short b;

              a=0x12345678;    //  olsun; 
              b=(short)a>>16;  // dersek b, 0x1234 değerini  alır

-----------------------------------

int a;
short b;

              b=0x1234;    //  olsun; 
              a=(int) b;     // dersek a, 0x00001234 değerini  alır


-----------------------------------

char a;
short b;

              b=0x1234;    //  olsun; 
              a=(char) b;   // dersek a, 0x34 değerini  alır

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

GreeN

#47
Alıntı yapılan: papsukkal - 25 Ekim 2011, 05:24:55

birinci sorum..
a=1<<4  ile diyelim ki "a" registerinin 4'üncü bitini set ettik. bu işlemi önce 0 biti set edip sonra 4 defa sola mı kaydırıyor?

eğer böyle ise "a" registerinin 0,1,2,3'üncü bitlerinin önceden barındırdıkları durumlar ne oldu? eğer siliniyor ise bu işlemi belirli bir sıra ve usule göre mi yapmamız gerekiyor?


ikinci sorum..
bir fonksiyondan birden fazla değer ile dönebilirmiyiz?

üçümcü sorum..
işaretli sayı olarak tanımladığımız bir sayıda içerik hangi noktadan sonra (-) değer alır? yada bunun bir kuralı mı var?

dördüncü sorum..
adresiniz nedir? (24 Kasımda size çiçek göndericem  :) )

1.Cevap : Soruyu sorarken yaptığın yorumun kısmen yanlış olduğunu görebilirsin.
a=1<<4;
a =00000001 ; //a=1
a =00010000 ; //a=16

a=3<<1;
a=00000011; //a=3
a=00000110;//a=6

edit: Sağa kaydırma
a=3>>1;
a=00000011; //a=3
a=00000001;//a=1

2.cevap: Aslında 1 değer döner. Ama fonksiyon içinde global olarak tanımladığın değişkenlerin içeriğini değiştirebilirsin. Yada STRUCT yapı oluşturabilir bu sayede geriye döndürdüğün bir STRUCT altında birden fazla değer döndürebilirsin.

Örneğin kompleks bir sayının imajinel ve reel bileşenlerini fonksiyondan birini geri döndürebilirsin. Ama COMPLEX.reel ve COMPLEX.imag şeklinde oluşturacağın yapıyı direk COPMLEX olarak fonsiyondan geri döndürebilirsin.

3.cevap : bunu sayıların binary gösterimi için mi sordunuz anlamadım? Yoksa kaydırma işlemi için mi anlamadım ?



Terörü Lanetliyoruz.

z

#48
if karşılaştırması

Karşılaştırma amacıyla if komutunu kullanıyoruz.

if den sonra parantez içinde karşılaştırma ifadesini yazıyoruz.

if (a==1)     // a, 1 mi

if (a!=1)     // a, 1 den farklımı

if (a>0)      // a, sıfırdan büyükmü

if den sonra gelen parantez içindeki ifade ya yanlıştır (0) yada doğru (0 dan farklı)

if (a&2)     // a AND 2 sonucu 0 dan farklımı

if karşılaştırmasından sonra ; konmaz. Eğer koyarsanız bu komut öylesine zaman kaybetmek adına çalışır 

if karşılaştırmasından sonra sadece 1 komut yazarak bu komutun karşılaştırma sonucuna göre çalışıp çalışmamasını sağlarsınız.

    if (a==1)  b=2;     // eğer a, 1 ise b'ye 2 yükle

if karşılaştırmasının sonucuna göre birden fazla komut işletmek istiyorsanız

bu durumda komutları blok (dantelli parantez) içine alırız.

     if (a==1) 
        {
           b=2; 
           c=0;
        }

Yukaridaki komut; eğer a, 1 ise b'ye 2, c'ye de 0 yukle demek

-----------------

else komutu

if karşılaştırmasında karşılaştırma sonucu beklenenin aksi olması durumunda kod çalıştırmak istersek else komutundan yararlanırız.

     if (a==1) 
        {
           b=2; 
           c=0;
        }
     else
        {
           b=5; 
           c=7;
        }

Yukarıdaki komut, a=1 ise, b=2, c=0 yapar.

a 1'e eşit değilse, b=5, C=7 yapar.

----------------------------

A=1 ise ve B=5 ise Ledyak fonksiyonunu cağırmak
      if ((A==1) && (B==5)) Ledyak();

Yada

      if (A==1) if (B==5) Ledyak();

Yada

      if (A==1)
        {
           if (B==5)
              {
                 Ledyak();
               }
        }

A=1 ise veya B=5 ise Ledyak fonksiyonunu cağırmak

      if ((A==1) || (B==5)) Ledyak();

Yada

      if (A==1) Ledyak();
      else if (B==5) Ledyak(); 

A 1 degilse ve B=5 ise Ledyak fonksiyonunu cağırmak

      if ((A!=1) && (B==5)) Ledyak();


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

z

for döngüsü

Döngü kurmak için kullandığımız komutlardan birisi for komutudur.

for komutunu () takip etmelidir.

Parantez içine yazabileceğimiz ifadeleri örnekler vererek açıklayacağım.

for (a=0; a<10; a++)
{
}
a=0 ile başla,

eğer a<10 ise dantelli parantez içindeki komutları işlet, a yı 1 artır. (a++ a=a+1 demek) kırmızı renkli satıra git

------------------------

for (a=10; a!=0; a--)
{
}

a=10 ile başla,

eğer a 0 değilse ise dantelli parantez içindeki komutları işlet, a yı 1 artır. (a-- a=a-1 demek) kırmızı renkli satıra git


-----------

for (a=0; a<10; a++)
{
}

a=0;

for (; a<10;)
{
  a++;
}

Yukarıdaki yazım şekilleri aynı işi yapar.

for komutu ile sadece tek komut işletecekseniz aşağıdaki örnekteki gibi dantelli parantezlere ihtiyaç kalmaz.

for (a=0; a<10; a++) Komut

Yukarıdaki kodu aşağıdaki gibi de yazabilirsiniz

for (a=0; a<10; a++) { Komut }

Yukarıdaki kodu aşağıdaki gibi de yazabilirsiniz

for (a=0; a<10; a++)
    {
       Komut
    }
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#50
while döngüsü

Döngü kurmak için kullandığımız komutlardan birisi while komutudur.

while komutunu () takip etmelidir. () içine koyacağımız şart doğru olduğu sürece while döngüsü çalışır. Şart sağlanmadığında while dan çıkılır.

while(1) yazdığımızda sonsuz bir döngü kurmuş oluruz ve asla while döngüsünden çıkılmaz.

Parantez içine yazabileceğimiz ifadeleri örnekler vererek açıklayacağım.

a=0;
while (a<10)
{
}
eğer a<10 ise dantelli parantez içindeki komutları işlet
------------------------

a=0;
while (a<10)
{     
    a=a+1;  gibi bir komut yazmazsak sonsuz döngü olur.


goto komutu

Tanımladığınız bir etikete goto komutu ile zıplayabilirsiniz.

Örneğin;

             n=0;
Dongu:    ....... 
             .......
             if (k>50) goto Cik;
             n++;
             if (n<10) goto Dongu;
Cik:        ........
             ........
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#51
&   |   ^   ~    (Bitwise)

&   AND  operatoru
|   OR  operatoru

^   XOR  operatoru

~   NOT operatoru

A = 0x0A &  0x03;   A nin sonucu 0x02
A = 0x0A |  0x03;   A nin sonucu 0x0B
A = 0x0A ^  0x03;   A nin sonucu 0x09
A = ~0x0A;   A nin sonucu 0x05

Array    Dizi

Örneğin A adında bir değişkenimiz olsun. Fakat bu değişkenimizin bireyleri olsun.

Yani A0, A1, A2..... şeklinde.

Bu tip değişkenler için hafızada yer açmamız gerekir.

Örneklere bakınız.

int A[10]; // 11 tane integer elamani olan A dizisi

int B[2]={4,5,6} // B[0]=4, B[1]=5, B[2]=6 demek

char Mesaj[128]={"Merhaba",0};

char Msg[128]={'M','e','r','h','a','b','a',0};

-----------------
int B[2]={4,5,6} // B[0]=4, B[1]=5, B[2]=6 demek

     if (B[1]==5)  LedYak();   // Eger Bnin 1.elemaninin degeri 0x00000005 ise LedYak fonksiyonunu cagir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#52
pointer kavramina bakalim.

pointere neden ihtiyac varla baslayalim.

Asagidaki gibi bir fonksiyon dusunelim.

void hesapla(int a, int b)
{
int x,y,z,w;
    x=a+b;
    y=a-b;
    z=a*b;
    w=a/b;     
}

peki hesaplanan x,y,z,w degerlerini cagiran fonksiyona nasil iletebiliriz?  (malesef int int int int hesapla(int a, int b) yazamiyoruz)

Cozum 1. Global degisken kullanmak

int x,y,z,w;

void Hesapla(int a,b)
{
    x=a+b;
    y=a-b;
    z=a*b;
    w=a/b;     
}

Cozum 2

void Hesapla(int a, int b, int* x, int* y, int* z, int* w)
{
    *x=a+b;
    *y=a-b;
    *z=a*b;
    *w=a/b;     
}

Burada int *x,  gelen veri, x degiskeninin degeri değil adresidir demek.

*X = a+b; demek a+b islemini yap ve sonucu adresi verilen alana yaz demek.

Peki bu fonksiyonu cagirirken nasil adres verecegiz?

main void()  // burada parantez icine void yazacaksak yazmayabilme serbestligimiz var
{
int a,b,c,d;

        Hesapla (4, 5, &a, &b, &c, &d);) // Buradaki &a, a degiskeninin adresinin sayisal degeri demektir.
}


-------------------------------------------------------------------------------

pointeri anlamak icin bir baska ornek

void main()
{
int a,b;        //  a ve b integer iki degisken
int* p          //  p,  integer degiskenlerin adresini saklayabilen bir degisken, yani bir pointer

       p=&a    //   a degiskeninin adresini p ye yukledik
       a=1;     //   a=1 yaptik
       b=*p;   //  p degiskenindeki adresdeki veriyi b ye yazdik. (b=a oldu)
}

Pointer denen sey de bundan ibaret.

O halde bir fonksiyondan istedigimiz kadar sonuc geri dondurebiliriz. Daha dogrusu, bir fonksiyondan, istedigimiz kadar degiskenin icine deger yazmasini isteyebiliriz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#53
structure ve union 

Standart veri tiplerinin disinda veri tipleri olusturmak icin struct deyimiden yarlaniyoruz.

Mesela A degiskeninin bir integer bir de karakter bileseni olsun.
A nin integer bilesenine 1234 hex degeri aktaralim, karakter bilesenine de 'Z' olsun diyebiliriz.

Bunun icin tanimlanmasi gereken structure;

struct Ozel
{
   int IntBileseni;
   char CharBileseni;
};

Boyle bir tanim ardindan mesela A degiskenine bu ozelligi atayalim.

struct Ozel A;

Artik A degiskenimizin icine deger atayabiliriz.

void main()
{
   A.IntBileseni=0x1234;
    A.CharBileseni='Z'

//  A nin CharBileseni  'Z' mi diye bakmak istersek

   if (A.CharBileseni=='Z')
      {
         // Anin Char bileseni Z imis
    }
}


Simdi de union tanimlamasina bakalim.

Bunun icin bir ornek yapacagim.

struct Ozel_Integer{
   char H;
   char L;
};

// Burada yaptigim, adlari H ve L olan char tipinde 2 tane bilesenden olusan, Ozel_Integer adini verdigim  char bir degisken tanimlamak oldu.


union Ister16_Ister8_8 {
   int Bir_Kerede_16_Bit_Yukle;
   struct Ozel_Integer Sekiz_Bit_Yukle;
};

// Burada yaptigim ise Bir kerede 16 bit deger yuklenebilen integer tipinde ve adini Bir_Kerede_16_Bit_Yukle koydugum degisken ile;
// Daha once tanimladigim Ozel_Integer adindaki structurla ayni yapidaki  Sekiz_Bit_Yukle degiskenimi ayni adrese oturtmak oldu.
// Bu ozellige de Ister16_Ister8_8 adini verdim.

union Ister16_Ister8_8 Ozel_Degiskenime;

// Burada ise adini Ozel_Degiskenime koydugum bir degisken tanimlamak ve buna da Ister16_Ister8_8 adini koydugum union ozelligi vermek oldu.

void main (void)
{
   Ozel_Degiskenime.Bir_Kerede_16_Bit_Yukle=0x7890;
   Ozel_Degiskenime.Sekiz_Bit_Yukle.H=0x12;
   Ozel_Degiskenime.Sekiz_Bit_Yukle.L=0x34;
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gambit1244

#54
Alıntı yapılan: fatihinanc - 25 Ekim 2011, 00:51:37
Eğer bir fonksiyon f1(int i); şeklinde tanımlanmışsa başına otomatik olarak int belirleyicisi eklenir ve şu anlama gelir;

int f1 (int i);
Dışarıdan int türünde bir parametre al ve geriye de int türünde bir değer döndür.

void f1 (int i);
Dışarıdan int türünde bir parametre al ve geriye değer döndürme


int ile void arasındaki temel farkı hala anlayamadım
hep void kullanırım
dondürmek istedigim değeri global bi değişkene atarım
sonra istediğim heryerde kullanırım
peki int kullanmanın avantajı nedir siz hangisini daha cok kullanıyorsunuz
iyi bilen arkadaşlar tabikide ikisininde yeri ayrı diyecektir fakat neden oldugunu soylerlerse cok makbule geçer
teşekkürler
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

fatihinanc

Alıntı yapılan: gambit1244 - 25 Ekim 2011, 16:27:20
peki int kullanmanın avantajı nedir siz hangisini daha cok kullanıyorsunuz

Global değişkenler programın başından sonuna kadar hafızada tutulurlar. Bu sebeple programın başından sonuna kadar -hafızada- bulundukları bölgeyi işgal ederler.
Fakat bir fonksiyon içerisinde tanımlanan değişkenler( Örn : int f1(int i) fonksiyonu) stack alanını kullanırlar. Bu değişkenlerin ömürleri fonksiyonun başından sonuna kadar tanımlıdır.
Yani fonksiyon bitince stack alanında işgal ettikleri o bölge başka amaçlar için de kullanılabilir durumda olur.

Bu sebeple genellikle local değişkenler üzerinden işlem yapmak programı daha efektif çalışır hale getirir.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

AST

Global değişkenler kullanılarak void tipinde tanımlanabilir.
İllaki  int olması gerekmiyor.Float f1() de olabilirdi.
Bu geri döndürülen verinin tipi ile alakalı.

Eğer geri dönecek değer int tipinde ise;
int f1();

float tipinde ise;
float f1();

geri dönüş değeri yoksa void olur.


z

C nin bu kadarcık özeti ile https://www.picproje.org/index.php/topic,35896.0.html de verdiğimiz örnek programları çok rahat anlamanız gerekiyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fatihinanc

Alıntı yapılan: bunalmis - 25 Ekim 2011, 16:56:21
C nin bu kadarcık özeti ile https://www.picproje.org/index.php/topic,35896.0.html de verdiğimiz örnek programları çok rahat anlamanız gerekiyor.

Hocam elinize sağlık. Ben baştan sona kadar okudum. Anlatımınız ve renklendirmeler bence çok yerinde.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

gambit1244

arkadaşlar degerli bilgiler için cok teşekkür ederim
sormak istedigim bişey daha var
mesela
RCC->AHB1ENR
boyle bir register kayıt işlemi var

buradaki ->  işlemini c kitabında hiç gormedim
gordüysemde hatırlayamadım

bu işlem asm komutumu yoksa sadece register için kullanılan bi komutmu
eğer oyleyse  bunun gibi c de olmayan komutlar nelerdir  yada bilmemize gerek varmı sizce
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.