C Programlama diliyle şamatalar

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

GreeN

Alıntı yapılan: bunalmis - 26 Ekim 2011, 14:55:15
Statik tanımı kodlar arasına sıkıştığı için Green'in örneğini Keil derlemiyor.

Aynı isimli değişkenler için her değişken kendi tanımlandığı alanda çalışıyor , birlikte kullanılamazlar , bende bir hile yapayım dedim  (@CoşkuN'nun dediği gibi değişkenlerin önce deklare edilmesi şartı problem olabilirdi) ama c++ da çalıştı.

örneğin c++ 'da ;

for(int a;a<10;a++) {.......} // a' değişkenini hemen kullanacağım yerde tanımlayabilirken
c'de bunu yapamıyorum . (mplap c30 'da ansi c standartlarına uygun değil şeklinde hata veriyordu.)

bunun gibi farklar mevcut.
Terörü Lanetliyoruz.

z

Peki ozaman;

integer verilere erişen pointer kullanarak adı Reg olan registere, aşağıdaki satırdaki komutu uygularsam ne olurdu? Nasıl bir sakınca olur?

#define Reg  (*((int*) 0x42345678))

      Reg=Reg>>1;

Şimdi anladınızmı?

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

tuggy

Sanırım bellek işlemlerinde (özellikle bellek bölümleriyle uğraşırken) bellek adres numarasıyla oynamamız gereken (shift mesela) durumlar olabilir. Böyle durumlarda int olarak tanımlayıp ardından işaret bitini işleme dahil etmek işleri arap saçına dönüştürebilirdi. Bu yüzden bellek adreslerindeunsigned int i tek geçmeli ;)

z

Hayır. Belleğin adres değeriyle işim yok. Adresi kaydırmıyorum. Belleğin içeriği ile işim var. Soruyu bir daha kontrol edin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

#109
#include <stdio.h>

int a=10;

const int *ap=&a;

void main(void){

    static int a=20;

    const int *sap=&a;
    char c;

    printf("\n global %d, static %d \n", *ap, *sap);

    {
      int a;


      a=30;
      printf("\n global %d, static %d  auto %d\n", *ap, *sap, a);
    }

    c=getchar();

}

==================================

program ciktisi:


global 10, static 20

global 10, static 20  auto 30


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

yamak

#110
@Bunalmis
hocam sorunuz cevabı int in negatif değerler alması değil mi?Mesela biz bi registera 0xfffff000 değerini verecez eğer bu değeri int tipli bi değişken aracılığı ile register a yüklmeye çalışırsak bu sayının değer -4096 olacaktı ama unsigned int tipli bi değişken ile yüklemeye çalışırsak istediğimiz değeri yüklemiş oluruz.
siz de "Reg  (*((int*) 0x42345678))" işlemiyle belleğin  0x42345678 numaralı adresini int tipli olarak belirliyosunuz.

GreeN

Alıntı yapılan: mufitsozen - 26 Ekim 2011, 18:43:07
#include <stdio.h>

int a=10;

const int *ap=&a;

void main(void){

.....

Bunu derleyebildinizmi?
const int *ap=&a;
bu satırda c++ hata vermişti bende.
Terörü Lanetliyoruz.

taneryilmaz

#112
Alıntı yapılan: M_B - 25 Ekim 2011, 08:06:09

0x80>>1  bir kere sağa kaydırmak demek o sayıyı ikiye bölmek demektir. 
0x80<<1 bir kere sola kaydırmak demek o sayıyı ikiyle carpmak demektir.

0x80 desimel olarak 128 eder
128/2=64
64 desimel sayısıda hex olarak 0x40 eder.




hocam bence bu mantık yeni başlayan birisi için anlaşılması zor olabilir bunun yerine olayı derinine açarak;

(a=0x80>>1  a ya 0x40 yukle demek. 0x80 degerini 1 kere saga kaydirdi. )

yani 80hexemal sayısını binary e çevirip ( 80h = 1000 0000 demektir)
bu rakamların hepsini birer satır sağa kardırırsak 0100 0000 = 40hexemal  olur.

Not hex - decimal - binary translateyi bilgisayarlarımızdaki hesap makinesini görünmden programcı olarak seçerek yapabiliriz

muhittin_kaplan

Ben Soruyuda Kaçırdırdım Cevabıda
Konuşulmak İstenen işaretli sayılar ile İşaretsiz sayılar mı ?

z

Alıntı yapılan: yamak - 26 Ekim 2011, 19:02:42
@Bunalmis
hocam sorunuz cevabı int in negatif değerler alması değil mi?Mesela biz bi registera 0xfffff000 değerini verecez eğer bu değeri int tipli bi değişken aracılığı ile register a yüklmeye çalışırsak bu sayının değer -4096 olacaktı ama unsigned int tipli bi değişken ile yüklemeye çalışırsak istediğimiz değeri yüklemiş oluruz.
siz de "Reg  (*((int*) 0x42345678))" işlemiyle belleğin  0x42345678 numaralı adresini int tipli olarak belirliyosunuz.

pointeri isaretli de tanimlasaniz isaretsiz de tamislasaniz 0xFFFFF000 yazdinizmi porttan 0xFFFFF000 cikar. Sorun okumada.

Asağıdaki proğram parçacıgı porttaki 0x80000000 verisini okuyup sağa kaydırıp tekrar porttan çıktığında porta yazilan veri 0xC0000000 olacaktır.

Halbuki pointeri unsigned int tanımlasaydık porttaki 0x80000000 verisini okuyup sağa kaydırıp tekrar porttan çıktığında porta yazılan veri 0x40000000 olacaktı.

#define Reg  (*((int*) 0x42345678))

      Reg=Reg>>1;

Aksi takdirde her defasinda type casting yapmak gerekirdi.

Peki aşagıdaki satirda neden volatile ön eki getirme ihtiyacı duyarız?

#define Reg  (*((volatile unsigned int*) 0x42345678))


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

yamak

Hocam volatile eğer kesme içinde bir değişken değer alıp sonra o değişkeni main içinde kullanacaksak kullanırız.Yani derleyiciye kod optimizasyonu yapma diyoruz.Eğer volatile kullanmazsak o değişkenin eski değerini okuyabiliriz.

yamak

Bu arada hocam bir önceki soruda benim kastettiğim farklı birşeydi.Tamam unsigned da tanımlasak signed ta tanımlasak adres yine yazdığımız adres olur fakat daha sonra okuyacağımız zaman eğer register ın değeri 0xFFFFF000 gibi bi değerse bunu -4096 olarak okumaz mıyız?Ya da bu değeri o register a yazarken sorun oluşmaz mı ?

z

Optimizasyon sonucunda uretilen kodlarda, registeri okuyan kod parcasinin neden koda dahil edilmeyip kaldirilip atildigini aciklamak lazim. En azindan bir ornekle.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Alıntı yapılan: yamak - 27 Ekim 2011, 01:26:42
Bu arada hocam bir önceki soruda benim kastettiğim farklı birşeydi.Tamam unsigned da tanımlasak signed ta tanımlasak adres yine yazdığımız adres olur fakat daha sonra okuyacağımız zaman eğer register ın değeri 0xFFFFF000 gibi bi değerse bunu -4096 olarak okumaz mıyız?Ya da bu değeri o register a yazarken sorun oluşmaz mı ?

(integer uzunluk icin) -4096 ile 0xFFFFF000 in farki varmiki?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Bir sonraki konumuz ARM registerlerini structure yapısında tanımlama hakkında.

Ön hazırlık yapmak isterseniz Rehber'de örneğin GPIOx port adreslerine bir göz atın.



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