BASIC kullanıcılarını C'ye alıştırma turları

Başlatan bunalmis, 28 Ekim 2011, 18:48:32

z

#75
Alıntı yapılan: muhittin_kaplan - 31 Ekim 2011, 22:18:01
Aslında Bir Kısıtlamadan Kaynaklı Bir Çözüm Yaratmış Pointer.
Fonksiyonun Sadece bir değer Döndürmesi bir kısıtlama. Bunu Pointer kullanarak Değişkeni değilde Değişken Adresini Kullanarak Aşıyoruz.
Peki Değişkenler RAM de belli bir yer tutar Tanımlanan Pointer ların böyle bir durumu varmı ?

Eğer pointeri aşağıdaki örnekteki gibi tanımlarsan pointerin kendisi de Ram'da yer kaplar.

int* pointer1;
char* pointer1;

Fakat pointer yada değişkeni aşağıdaki gibi fonksiyonun parametre kısmında tanımlarsan Ram'da yer kaplamaz.

void Fonksiyon(int* Adr1, char* Adr2, Var1, Var2) // Buradaki pointerler ve değişkenler doğrudan CPU registerlerimiz oluyor.

Pointer, yüksek düzeyli bir dilde aslında bir riskdir. Yanlış kullanımlarla tüm Ram içeriğini değiştirebilirsiniz.
Pointer, C daha icat edilmemişken de vardı. (ASM yazanlar zaten buna mecbur.)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

eistain_54

Alıntı yapılan: bunalmis - 01 Kasım 2011, 02:31:43

(ASM yazanlar zaten buna mecbur.)

Hocam biz okuldayken asm ile yazıyorduk pic için ama ben iç pointer kulanımı görmemiştim.Belkş mevzuyu çok uzattım ama ne olur anlayış gösterin.Şimdi bir örnekle açıklayım...
'1-)asm ile
Degisken  equ 0x20
degisken1 equ 0x21

'2-)basic ile
degisken var byte
degisken1 var byte

'3-)ccs c ile
int8 degisken,degisken1;


Şimdi hepsindeki temel mantık aynı değilmi?Yani sırayla gidersek
1-)"0x20 adresine degisken adını koydum.Programın her yerinde adresi kullanmak istemiyorum.Ben degisken deyince sen o adrese git gerekeni yap." demektir.Yani derleyiciye bunu söylüyoruz.Dimi?
2-)Benim için bir yer ayarla.Byte tipnde olacak.Uygun yeri sen bul.Ben oraya değer yazacam.Beni sürekli adreslerle uğraştırma.Sen ayarla.
3-)Benim için bir yer ayarla.8 bit olacak.Uygun yeri sen bul.Ben oraya değer yazacam.Beni sürekli adreslerle uğraştırma.Sen ayarla.
Burada hepsi için temel felsefe sanıyorum şu;Ben belirttiğim adresin giriş kapısına o ismi verdim.İçeriği o kapı numarasını verdiğim kişiye götür yaz.Yani değişken isimleri sadece kapı numarası oluyor.içerik değil.Değişkenin tipi ise o kapının içindeki aile doktor mu bürokratmı bunu belirliyor.Yanılıyormuyum?Peki durum buyken ben pointer kullanarak değişkenin olduğu adrese erişiyorum.Neden zaten değişkenin ismiyle ben o adrese rahatça işlem yapabiliyorum.Ha birde void Fon() yada int fonk() olayı var.Sanıyorum her şey burda değişiyor.
int fonk() ile içeride tanımladığım değişkenler kalıcı olurken void fonk() ile tanımladığım değişkenler sadece fonksiyon içindemi geçerli oluyor.Yani o fonksiyon çalışınca değişken olşuyo sonra yok.Pointer ile void () fonksiyonu içinde tanımladığım değişkenler geçici ama o fonksiyon sonucu elde ettiğim değerleri ben ram de bir alanda tutuyorum.Hem fonksiyon çin yer ayırmış olmak zorunda değilim.Bu mu?
Lütfen izah eden biri olsun.Anlamadım gerçekten...
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

z

Alıntı yapılan: eistain_54 - 01 Kasım 2011, 10:45:48
....Hocam biz okuldayken asm ile yazıyorduk pic için ama ben iç pointer kulanımı görmemiştim.Belki mevzuyu çok uzattım ama ne olur anlayış gösterin....

PIC'in 16 serisine işlemci gözüyle bakmamak lazım. Yanlış hatırlamıyorsam PIC'de Indx diye bir register vardı. Bu registeri hiç kullanmadınmı? Bunu kullanmadıysan Ram'a pointerle erişim işlemi de yapmamışsın demektir.

PIC'de RAM'ın tamamını silen kodu ASM ve C de ayrı ayrı yazarmısın?

Sorunun diğer kısmını anlamadım. Cevap gelmezse daha anlaşılır şekilde tekrar yazmayı dene.




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

eistain_54

Ram'in tamamını silen bir kod mu?İlk kez duyuyorum.silmek istediğiniz yerin adresini yazarsınız ve clrf komutu kullanılır.Ben böyle biliyorum.Ders notlarımda ve aldığım kitapta bölye yazıyor.
clrf 0x20 gibi bir komut kullandığımızı hatırlıyorum.
c içinde 0x20==0 gibi bir şey yazılabilir sanıyorum.yukarıda Anlaşılmayan kısmı alıntı yaparsanız orayı tekrar sormak isterim.
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

z

Abartayım, ASM programında diyelimki  1000 tane değişken tanımladın. Her birini silmek için her bir değişkeni silen satırın benzerini 1000 kez alt alta mi yazacaksın?

Alıntı YapDaha açık yazılmasını istediğim kısım ;

Kod: [Seç]
'1-)asm ile Degisken  equ 0x20 degisken1 equ 0x21 '2-)basic ile degisken var byte degisken1 var byte '3-)ccs c ile int8 degisken,degisken1; 

Şimdi hepsindeki temel mantık aynı değilmi?Yani sırayla gidersek
1-)"0x20 adresine degisken adını koydum.Programın her yerinde adresi kullanmak istemiyorum.Ben degisken deyince sen o adrese git gerekeni yap." demektir.Yani derleyiciye bunu söylüyoruz.Dimi?
2-)Benim için bir yer ayarla.Byte tipnde olacak.Uygun yeri sen bul.Ben oraya değer yazacam.Beni sürekli adreslerle uğraştırma.Sen ayarla.
3-)Benim için bir yer ayarla.8 bit olacak.Uygun yeri sen bul.Ben oraya değer yazacam.Beni sürekli adreslerle uğraştırma.Sen ayarla.
Burada hepsi için temel felsefe sanıyorum şu;Ben belirttiğim adresin giriş kapısına o ismi verdim.İçeriği o kapı numarasını verdiğim kişiye götür yaz.Yani değişken isimleri sadece kapı numarası oluyor.içerik değil.Değişkenin tipi ise o kapının içindeki aile doktor mu bürokratmı bunu belirliyor.Yanılıyormuyum?Peki durum buyken ben pointer kullanarak değişkenin olduğu adrese erişiyorum.Neden zaten değişkenin ismiyle ben o adrese rahatça işlem yapabiliyorum.Ha birde void Fon() yada int fonk() olayı var.Sanıyorum her şey burda değişiyor.
int fonk() ile içeride tanımladığım değişkenler kalıcı olurken void fonk() ile tanımladığım değişkenler sadece fonksiyon içindemi geçerli oluyor.Yani o fonksiyon çalışınca değişken olşuyo sonra yok.Pointer ile void () fonksiyonu içinde tanımladığım değişkenler geçici ama o fonksiyon sonucu elde ettiğim değerleri ben ram de bir alanda tutuyorum.Hem fonksiyon çin yer ayırmış olmak zorunda değilim.Bu mu?
Lütfen izah eden biri olsun.Anlamadım gerçekten...
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

asm öğrenenlerin FSR yazmacından pek haberleri yok malesef, PIC öğretiyoruz diyen kitaplarda da bu konuyu göstermiyorlar

z

Evet tam hatırlayamadığım dediğim registerin adı Indx değil FSR idi.

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

CLR

8085, 8051 ve Z80 tabanlı işlemcilerde index register olarak geçiyordu. 8085 ve Z80'de X ve Y index registerleri mevcuttu. Pic16 serisinde 1, pic18 serisinde 3 tane pointer gösterebilecek FSR register var. Zaten asm'nin yapamadığı işlemi C yapamaz. C sadece kolaylıktır, yüksek seviyeli dil tanımı buradan geliyor.
Knowledge and Experience are Power

eistain_54

Alıntı yapılan: bunalmis - 01 Kasım 2011, 13:03:01
Abartayım, ASM programında diyelimki  1000 tane değişken tanımladın. Her birini silmek için her bir değişkeni silen satırın benzerini 1000 kez alt alta mi yazacaksın?

Evet.Benim bildiğim başka bir yöntem yok.Ben galiba iyice bocalamaya başladım.Alıntı yapılan kısımda ise ben olayı karikatürize etmek için senaryo gibi yazmak istedim.yani değişken dediğimiz şey bellekteki adrese isim vermekten ibaret değilmi?Bunu açıklamak istedim sadece.

@ErsinErce evet kitabın giriş kısmında GPR'ı anlatırken kısaca değinmiş.GPR erişemebilmek için File Select Register yazmacı kullanılır demiş ve programda kullanılacak değişkenler bu GPR alanına atılabilir demiş.Bir banktaki yazmaca erişebilmek için bank değiştirmek gerek bunu da status yazmacıyla yaparız falan filan diye devam ediyo...


Ya galiba herkeze mani oluyorum.Affedin ne olur.Ama şimdi anladım ki bu işe girerken yanlış yerden başladım ve bireyler eksik...Ama ne olduğunu bilmiyorum..
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

Mujdat117

bunalmış hocam dolaylı adreslemeden bahsediyor sanırım
yani pic in fsr ve indf regestirilerini kullanarak. ram alanındaki istinlen bölegelrin değerleri okunabilir veya yazılablir.
asm olarak küçük bir örnekle açıklarsak. 0x20 adresinden başlayarak 5 adet pointer adresinin içeriğini sıfırlamak istediğimiz farzedelim
cblock 0x20
degısken1 ;silinmesini istediğimiz değişkenler 1-5 kadar
degısken2
degısken3
degısken4
degısken5
cnt           ;sayaç değişkenimiz. silinmesini istediğimiz adeti berlirtir.
endc

movlw      degısken1 ;degısken1 regestirisinin adresini wreg yükler
movwf      FSR ;degısken1 değişkenini adresi yüklenir ve degısken1 değişkenine ulaşmamızı sağlar.
clrf           INDF ;fili bir regestirir değildir. FSR ye yüklenen adresin içeriği INDF sanal adresinden okunur/yazılır.
incf FSR
decfsz    cnt;sayıyı bir azalt
goto     $-4;başa dön 
maın
goto maın

bu şekilde isterseniz 255 tane ram adresini okuyabilir veya yazablirsiniz.
Ayinesi iştir kişinin lâfa bakılmaz.Şahsın görünür rütbe-i aklı eserinde

muhittin_kaplan

ASM de (8051 olur PIC olur) adresleme modları vardır. Genel olarak yazarsam direk adresleme dolaylı adresleme, dolaylı indisli adresleme vs mikrodenetleyicinin gücüne göre bu sayı artar. şimdi adreslemedn kasıt olan olayı Kodlar üzerinde durmadan anlatayım.

0x08 adresine bilgi yazmak için
Yaz 0x08,AAh  ;
08 adresine AA yaz dedik bu doğrudan adreslemedir.

Yaz 0x01,08h  ;01 adresine 08 yaz buda doğrudan adreslemedir
Yaz @0x01,AAh ;dersek 01 e bak buradaki bilgiyi adres olarak (08) al ve o aldığın adresin içerisine AA yaz. bu
Dolaylı adreslemedir.

Pointer bu bağlamda dolaylı adresleme gibi çalışır.

ErsinErce

Alıntı yapılan: eistain_54 - 01 Kasım 2011, 10:45:48
Burada hepsi için temel felsefe sanıyorum şu;Ben belirttiğim adresin giriş kapısına o ismi verdim.İçeriği o kapı numarasını verdiğim kişiye götür yaz.Yani değişken isimleri sadece kapı numarası oluyor.içerik değil.Değişkenin tipi ise o kapının içindeki aile doktor mu bürokratmı bunu belirliyor.Yanılıyormuyum?Peki durum buyken ben pointer kullanarak değişkenin olduğu adrese erişiyorum.Neden zaten değişkenin ismiyle ben o adrese rahatça işlem yapabiliyorum.Ha birde void Fon() yada int fonk() olayı var.Sanıyorum her şey burda değişiyor.
int fonk() ile içeride tanımladığım değişkenler kalıcı olurken void fonk() ile tanımladığım değişkenler sadece fonksiyon içindemi geçerli oluyor.Yani o fonksiyon çalışınca değişken olşuyo sonra yok.Pointer ile void () fonksiyonu içinde tanımladığım değişkenler geçici ama o fonksiyon sonucu elde ettiğim değerleri ben ram de bir alanda tutuyorum.Hem fonksiyon çin yer ayırmış olmak zorunda değilim.Bu mu?

Hepsindeki temel felsefe elinde bir veri var ve bunu saklayacak bir yer lazım, bu veriyi koyacağın yere bir isim veriyorsun ve sığması için belirli bir boyut ayarlıyorsun
bütün dillerde adresi sen ayarlıyorsun aslında yazma sıran adres numarasını değiştiriyor
asm de -cblock-, C de -int char vs- ve Basic -var dim vs- ile direk belirtebiliyorsun

Bunalmis hocanın dediğini gibi veri bloklarıyla uğraşırken pointer kolaylık sağlıyor ve yazacağın kod miktarını düşürüyor

void terimini bariyer olarak düşünebilirsin, fonksiyon tanımının yapısı
çıkış_değişkeni Fonksiyon_ismi( giriş_değişkenleri )
şeklindedir. void koyarak çıkışı kapatırsan geri dönüş, girişe koyarsan giriş değerin olmaz.

Değişkenleri global konuma ( yani fonksiyonların dışına ) yazmazsan hepsi local (sadece fonksiyon içinde geçerli) değişkendir.

yani

int global_degisken;

int main(void){

int local_degisken;

}

eistain_54

Çok  teşekür ederim.Şimdi biraz daha iyi durumdayım.Yani taşlar yavaş yava oturuyor.Sanırım örnek programlar daha iyi kavramama yardımcı olacaktır.Bir ricada bulunsam?
Bu konuya dair örnek olabilecek uygulamalar nelerdir?Bi kaç satırla kodları paylaşsak?Gerçekten minnettarım.Kusuruma bakmayın lütfen biraz geç anlıyorum sanırım...
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

ErsinErce

Bunalmis çok güzel örneklerle tek tek anlatmış, aklına gelen herşeyi bu şekilde yapabilirsin, bundan sonrası senin algoritma kurgulamana bağlı
burada yazılmış yazıları tekrardan okursan şu an çok daha farklı algılacaksın, bir tekrar yaparsan senin için herşey yerine oturmuş olacak,
Kurgu yeteniğinde farklı program ihtiyaçlarına ihtiyaç duydukça gelişecektir zaten.

eistain_54

Anladım.Gerçi bugğn bile en az 10 kez okuduğum o satırları bir 10 kez daha okurum.Dediğiniz doğru ihtiyaçlara göre kendi programımı yazdıkça duru değişecektir zaten.Çok teşekkür ederim.Sanırım bu baaşlık altından yapılacak başka paylaşım kalmadı.Yani daha c konusu varmı anlatılacak?
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!