Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

pointer ne işe yarar???

Başlatan mech, 13 Haziran 2008, 00:09:28

mech

Mrb. arkadaşlar. Ben Proton Picbasic kullanıcısıyım. Üstünlüklerinden dolayı CCS öğrenmeye başladım. Gayet kolay. Ancak hemen aklıma bir soru takıldı.
Mesela;

char *s;
s=(char *) 0x2A03;
*s='b';

şeklindeki programla adrese veri yazıyoruz, ya da farklı bir kodla bir değişkenin bulunduğu adresi öğreniyoruz. Ama bu adres bulma adrese yazma olayının bize sağladığı fayda nedir. Ne işimize yarar, bunun üstünlüğü nedir? Tşk.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

mikromuh

Bir ornek vereyim. Pc ile emko marka bir sayicidan bilgi toplamaya calsitik.Uretici ile baglantiya gectigimde bana cihazin adres bilgilerini yolladilar.Surda su bilgi burda bu bilgi var gibi.Modbus destekle o cihazin adreslerine erisip bilgi almistik.Sayici degerini,resetleme icin emir gibi islermler yapilmasi icin guzel bir yontem.

F493

Alıntı yapılan: "mech"Mrb. arkadaşlar. Ben Proton Picbasic kullanıcısıyım. Üstünlüklerinden dolayı CCS öğrenmeye başladım. Gayet kolay. Ancak hemen aklıma bir soru takıldı.
Mesela;

char *s;
s=(char *) 0x2A03;
*s='b';

şeklindeki programla adrese veri yazıyoruz, ya da farklı bir kodla bir değişkenin bulunduğu adresi öğreniyoruz. Ama bu adres bulma adrese yazma olayının bize sağladığı fayda nedir. Ne işimize yarar, bunun üstünlüğü nedir? Tşk.


selam;

         char *s; dediginizde pointer ( işaretçi ) tanımlamış olursunuz..

     *   işaretcinin içerigini almak veya oraya veri yazmak içindir

ancak işaretci olarak tanımlanmış bir degişken  * sız kullanılırsa ona veri yazma için değil  ( s=(char *) 0x2A03; ) yeni bir adres
vermek için kullanılır..

s=(char *) 0x2A03; burada s degişkeni ram memory de 2A03 nolu bölgeye konumlandırıldı demek.

(char *) ise s işaretcisi bu türden oldugu için ona atanacak degerde aynı türden olmak zorundadır.

ve artık oraya  *s='b';   b degişkenini yazıyoruz..
*s ile o adrese veri yazdık

bu olaylar C 'yi C yapan olaylar işte ..

KAAN ARSLAN      A'dan  Z'ye C klavuzu..

mutlaka edinin ve okuyun


esen kalın

mech

hiç bir şey anlamadım. Neyse bu konu üzerinde daha çok düşünmem gerek. Sağolun.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

Klein

Pointer ile çalışmanın sağladığı şey hız. Eğer tek seğişken ile çalışıyorsan pointer ile çalışmanın pek bi avantajı olmaz.  Ama bir dizi değişkenin varsa  orada pointer operasyonu sana çok büyük bir hız kazandırır. Çünkü pointer işlemleri donanım desteklidir.

F493

Alıntı yapılan: "mech"hiç bir şey anlamadım. Neyse bu konu üzerinde daha çok düşünmem gerek. Sağolun.

selam;


   Genel anlamda işler bu noktaya geldiginde ben biraz çekilmez oluyorum.
 
sevgili mech , bu konuyla kaçtane kitap okudunuz,neler yaptınız, yani okumayan bir millet oldugumuz için bunu sorma geregi duyuyorum,

pic basic pro ,ccs c vb dillerle ugraşanlar bu konuda eminimki yok denecek kadar az kaynak okumuşlardır.

size okadar basit olarak anlattımki azıcık ama azıcık c bilginiz olsa  hiçbirşey anlamadım yazmazdınız..

BENCE FAZLA DÜŞÜNMEYİN OKUYUN...

bakın ben oraya kitabın ismini bile yazdım kaan aslan  c klavuzu diye..

ben asm bilirken c den bi haberken ccs c ile 900 satır kod yazdım ve piyasada ciddi anlamda çalışan bir cihaz çıktı ortaya yani  ccs c de kod yazmak c yi bilmek anlamına gelmiyor..

   bu konuda egitim şart daha öncede söyledim benim kanaatim c kitaplardan ögrenilmez ,kitaplarla geliştirilir..


kusura bakmayın arada biraz çıkışmış olabilirim ama artık kendimize gelelim kopyala yapıştır ile yüksek seviyeli diller ile biyere varılmaz..

esen kalın.


mech

sevgili t495 ben anlatmak istediğini anladım ki aynı şeyi ben yazdım zaten başlık açarken. ben ne işe yarar diye sormuştum...

bu arada; bir siteden alıntı(!)(http://www.cs.cf.ac.uk/Dave/C/node10.html) NOTE: Pointers are perhaps the most difficult part of C to understand. C's implementation is slightly different DIFFERENT from other languages.
Yani suç  bende değil:) bu arada sitede baya bişey anlatıyor.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

mech

ben bu pointerin ne işe yaradığını sanırım anladım. Yanlışım varsa bilenler düzeltsin.

Program içinde kullanılan fonksiyon gibi altprogramlarda  ana programdan belirttiğimiz bir a değişkeni değiştirldiğinde, yansıması kullanıldığı için, ilk belirttiğimiz a değeri hiç değişmiyor, üstüne üstlük fazladan yer işgal ediyor ki bu bütün programlama dillerinde böyle.
Eğer biz direkt bu değişkenin bulunduğu adresi önceden tanımlayıp ya da öğrenip o adresteki veriyi değiştirirsek ve kullanırsak hep aynı değişken üzerinde oynamış oluyoruz. Böylece kararlı bir program ortaya çıkıyor...
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

Analyzer

Selam,

Değişken kullanımı ile pointer kullanımı arasındaki temel fark hızdır. Örneğin bir sıralama işlemi esnasında; rastgele n adet sayıyı büyükten küçüğe doğru dizdiğinizde sürekli olarak karşılaştırma yapıp değişkenleri taşırsınız. n sayısı ve basamak sayısı ne kadar artarsa değişkenleri taşıma işi o kadar vakit alır. Ancak siz değişkenin kendisi yerine sadece adreslerini sıralarsanız, sadece adres bilgisini dizmiş olursunuz. Adreslerine göre bilgileri kullanırsınız. Misal 1000 basamaklı 1000 adet sayıyı "bubble sorting" olarak sıralıyorsunuz. Bildiğiniz üzere bubble sorting bir dizi içerir ve her değeri bir sonraki ile karşılaştırır ve gerekirse yer değiştirir. Takdir edersiniz ki 2 adet 1000 basamaklı sayının yer değiştirmesi, 3 basamaklı adres bilgisinin yer değiştirmesine oranla çok uzun zaman alır. Bu diziyi pointer olarak tanımlayıp, adreslerini sıralayıp, değerleri adres bilgilerine göre kullanırsanız önemli oranda performans artışı gerçekleşir.

Analyzer
Üşeniyorum, öyleyse yarın!

M_B

Merhaba kendi çalışmalarımdan cıkarmış oldugum özet.
yararlanman umudiyle.
Kolay gelsin.



Zaman zaman bir değişkenin depolandığı bellek bölgesinin adresini elde etmek gerekebilir. Bunu yapmak için adres alma ( & ) işlecini kullanırız.
& işleci işlenenin adresini ( daha doğrusu işlenen tarafından tutulan belleğin ilk baytının adresini ) verir. Her değişken ana bellekte bir yerde saklanır.
ornek: &M[0] adresi 150 ise   &M[1] adresi 152 ye eşittir.

Adres elimizde olduğu zaman bu seferde o adreste saklanmış olan değeri elde etmek için bir yönteme gerek duyarız. Bu temelde & işlecinin aksi olan * dir.
* işleci işlenen olarak gecerli bir adres bekler ve bu adreste saklanmış bulunan değeri verir. Bunu yapması için veri tipleri aynı olmak zorunda.

ornek:
int z[N] , i ;
......
.....
for(i=0;i<N;i++)
   z[N]=0;
bu klasik olan yontem şimdide göstericili si

int z[N] , *g;
.......
........
for(g=&z[0]; g<&z[N]; g++)
   *g=0;
bu kod daha verimli ve hızlı.

z ile &z[0] aynı şey demektir.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

F493

selam;

  POINTER kullanımı tam HIZ manasına gelmez, pointer  kullanarakta program yavaş olabilir.  O kısım kodu yazanın profesyönelligine baglıdır..


  Pointer'ın en büyük avantajlarından biride bellek tasarrufudur.


    bit EEPROMWrite(int DEviceadres ,int PAGEadr, byte len );

  yukarıdaki fonsiyona örnegin içerisinde 64 byte olan bir dizinin içindeki verileri aktaracagız.

 işte burada bellekte ,veri transferi için sanal bir alan oluşturulur  , hem yavaş hemde bellekte gereksiz israf.
Yani transfer edeceginiz veri türü long türdense bellekte 32bitlik alan bu için ayrılır ,

bit EEPROMWrite(int DEviceadres ,int PAGEadr, byte* len );


burada ise eeprom fonksiyonunun len parametresine  dizinin adresi geçilir ve sonrası ,   len  ilgili adresten veriyi  NULL karakterini görene kadar çeker ve hem bellekten hemde hızdan kazanır.

picusta

F493 arkadasim, anlatirken biraz daha açik ve ayrintili ol.
Pointer'in 2 ana "avantaji" var :
1.  Referanslama ve dolayisi ile Analyzer'in bahsettigi endeksleme kabiliyeti. Böylece büyük bir veri yiginin içinde aradigimizi (endekse göre) neredeyse "aninda" buluyoruz ve ulasiyoruz. C'de struct'leri gördügünde anlarsin.
2. Bellek yönetimi. C'de bellek kabaca 2'ye ayrilmistir : heap ve stack (yigin ve ...).
Program bir fonksyon çagirdiginda öncelikle programin kalmis oldugu program adresi ve sonrada programin argumanlari (parametreleri) stack alanina kopyalanir. Fonksyon stack'den bu parametreleri çikartir. Fonksyon bittiginde ise program adresine döner. F493'ün sanal alan dedigi stackdir.
örnegin 512 harfi bir diziyi fonksyona aktarmak istiyoruz. Eger diziyi dogrudan fonksyona verirsek, stack'da 512 byte büyücektir. bunun yerine dizinin baslangiç adresini verirsek fazladan kopyalanmis veri olmaz.
heap bellegi kullanabilmek için malloc fonksyonunu kullanarak hafizayi ayirmalisin, isin bittiginde ise free fonksyonunu çagirmalisin.
C'yi hafizayi neredeyse ASM kadar kontrol edebildigin için gömülü sistemlerde en çok tercih edilen dildir.
VB'de degiskenlerin adresini almak için Adressof fonksyonunu kullanabilirsin.

z

Kullanilan islemcinin index registerleri yoksa,
Index registerleri var fakat bunlar uzerinde aritmetik islem yapamiyorsa

Pointer kullanmanin espirisi yok.

Hatta ve hatta basit islemci yada denetleyicilerde pointer kullanmak aslinda program alanindan ve hizdan kaybetmek demektir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

OptimusPrime

z

hocam bu konuya örnek verebilir misiniz?

mesela PIC16F84 için pointer kavramı lux olsa gerek.

peki birer örnekte pointer işlemlerini yapabilen bir mikroya ve bir örnekte index i olmasına rağmen pointer işlemi yapamayan bir mikroya örnek verebilir misiniz?

bu mikroların datalarını incelemek istiyorum.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||