C Programlama diliyle şamatalar

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

z

#240
Alıntı yapılan: muhittin_kaplan - 23 Aralık 2011, 21:29:06
Hocam Bir Karışıklılık yaşıyorum.
P aslında integer bir değişken. Biz bunu Adress saklaması için Tanımlıyoruz (Pointer)
Adres 32 bitlik olabilir. Ama o adresin değeri Char,Short,Int olabilir.
int olarak tanımladığımızda P nin içereceği adres bilgisimi yoksa içeriğindeki adrese kaydedilecek bilgiyimi tanımlamış oluyoruz.
Sizin Yukarda Yazdığınıza Göre Pointer tanımı Adrese yüklenecek Değerdir.

Short *P yazacak olsaydım. yine 32 bitlik adress değerini alırmıydı ?

Her zaman icin adres 32 bittir.  int de olsa short da olsa char da olsa adres 32bit.

Eger pointerimiz int* P tanimlandiysa *P=blabla yazilirsa blabla herzaman 32 bit demektir.
Eger pointerimiz short* P tanimlandiysa *P=blabla yazilirsa blabla herzaman 16 bit demektir.
Eger pointerimiz char* P tanimlandiysa *P=blabla yazilirsa blabla herzaman 8 bit demektir.

Siz

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

tanimini bosverin. short B tanimi B nin 16 bit oldugunu soyler. Fakat int* P bir sekilde B nin adresini gosteriyorsa P, B nin short tanimini dinlemez B nin ne olduguna bakmaz bile. Cunku P integer veri pointeridir. Point ettigi yere 32 bit yazar yada point ettigi yerden 32 bit okur.  Popint edilen yerdeki verinin tipi hic mi hic onemli degildir.

Zaten taa en basindan bu ornegi ozellikle verdim. Kafalar karissin gercek gorunsun diye.


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

Sepiroth

konuyu cok ortadan bolmeden bir soru sormak isterim:)
Diyelim ki bir struct tanimliyoruz, bu struct'un icinde bir buffer var. buffer'in veri tipi duruma gore unsigned char da olabilir, unsigned short da. struct'u typedef ile tanimlarken run time bir deklarasyon yapamiyoruz diye biliyorum, her iki durum icinde gecerli bir struct nasil olusturulur, veya nedir bunun cozumu? ayni sekilde bu buffer'in boyutu (buffer dedigim array yani) da run time da gelecek bir degiskene gore ayarlanmali. bu arada, bu bufferi kullanacak fonksiyonlarin arguman ve return degiskenleri da gayri ihtiyari ile unsigned char veya unsigned short olacak. Siz nasil bir yontem izlerdiniz?
Either you feel it, or not...

z

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

EMG81

#243
Ben tüm gün şehir dışındaydım. Yeni geldim ve 1 solukta tüm yazılanları okudum.

Üzülerek söylüyorum ki ben halen pointer ı anlıyamadım. Nedeni şu

Asm kısmında neler oluyor bilmiyorum ama

int a;

A=0x01;

Dediğimizde a nın içerisine 0x01 değeri yerleşmiyormu ? (Tabiki şu şekilde 0x00000001 )

Derleyici bizim yerimize A nın adresini bulup yeni değeri A nın içerisine yüklemiyormu ? Derleyiciye pointer vasıtası ile değişkenin saklandığı adresi neden hatırlatmak zorunda kalıyoruz ?

Aslında minik bir makro oluşturuyoruz. Öyle değilmi ?

int* p; // diyerek adres saklayıcı pointer tanımlayıp
int x;

*p=&x // makro oluştu.


@Bunalmis
Bana ARM assembly öğrenebileceğim E kitap önerebilirmisin ? Arka Planda neler oluyor bilmek lazım.


tuggy

Assembly ye ARM ile dalmak yüzmeyi bilmeden okyanusa atlamaya benzer. 8 bit bir işlemci (Bülent hocamın dediği gibi  index registerli) ile ASM öğrenmek iyi bir başlangıç olur. Böyle bir MCU da Memory Map, ROM,RAM alanı, Stack alanı vs gibi kavramların çabuk oturmasına yarayacaktır. Uygulama geliştirme aşamasına geçerken C ile hızlı ve mantığa dayalı yol almak kolaylaşacaktır.

ARM ve assembly ikilisi bana ürkütücü geliyor gerçekten:S

z

#245
Sordugun soruyu pointerin canina okuyalim kisminda cevaplamistim.

Evet A=0x01 dediginde derleyici, dogrudan A nin adresini buluyor ve koda gomuyor. Islemci bu satiri isletirken Anin adresi ne diye arayışa girmiyor ekstradan kod işletmiyor çünkü o satirda ornegin R0 registerine zaten A nin adresini atayan kodlar derleme + link asamasinda yazilmisti.

William Hohl'un ARM Assembly Language kitabini oneririm.  (CRC Press.) Malesef e-kitap değil.

Bu arada  "CM3 islemciler icin Assembly" diye bir kitap denemem var ve yarisini bitirmis durumdayim. Icerik olarak bu haliyle bile (84 sayfa) yeterli ve baskiya verilebilecek durumda ancak,  kitaba  ornek kodlar diye bir bolum ekleyerek sayfa sayisini 150 yapmak istiyorum.

Gel gelelim yurt disinda oldugum icin baski ve satis isleri ile ugrasmam kolay değil. 2010 yazinda bir iki matbaa ile gorustugumde gayet makul fiyatlar verildi.

Kendi kitabimin baskisi bitmis olsaydi onerirdim.



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

tuggy

Alıntı yapılan: EMG81 - 23 Aralık 2011, 22:48:27
*p=&x // makro oluştu.

Bu arada anlatamamışsınız derdinizi...

p=&x; diyecektiniz sanırım :)

Sepiroth

Hocam simdi sorun soyle vuku bulmakta, stm32 ailesinden bir cm3 icin driver yaziyorum. Spi portu data registeri 8 bit de olabiliyor, 16 bit de. Tum yazilimi katmanlar halinde yaziyorum. HAL/Driver/API/ en sonunda kullanici uygulamasi seklinde katmanlar var.
biraz kulagi tersten tutmus gibi olduk, ama misal ben usart icin soyle bir sey yazdim:

typedef struct
{
	unsigned char portNumber;
	unsigned char *usartTransmitBuffer;
	unsigned char *usartReceiveBuffer;
	unsigned char usartTransmitStatus;
	unsigned char usartReceiveStatus;
	unsigned short int usartTransmitBufferIndex;
	unsigned short int usartReceiveBufferIndex;
} UsartPort, *ptrUsartPort;

typedef struct
{
	unsigned char portNumber;
	unsigned char usartBaudrate;
	unsigned char usartStopBit;
	unsigned char usartWordLength;
	unsigned char usartHwFlowControl;
	unsigned char usartParity;
	unsigned short int usartTransmitBufferLength;
	unsigned short int usartReceiveBufferLength;
	unsigned char (*ptrUsartReceiveCallback) ( unsigned char *ptrBufferPointer, unsigned short int bufferLength );
	unsigned char (*ptrUsartTransmitCallback) ( void ); /* does it really needed? think again*/
} UsartPortConfiguration, *ptrUsartPortConfiguration;

typedef struct
{
	unsigned char (*initUsart) ( ptrUsartPortConfiguration usartConfig );
	unsigned char (*writeUsartFIFO) ( unsigned char *data, unsigned short int dataLength );
	unsigned char* (*readUsartFIFO) ( unsigned short int dataLength );
	unsigned char (*openUsart) ( unsigned char portNumber );
	unsigned char (*closeUsart) ( unsigned char portNumber );
	ptrUsartPortConfiguration config;
} UsartDriver, *ptrUsartDriver;


ust katmanda api'yi yazan amca, bu UsartDriver'dan olusturacak bir tane. icindeki config structunu da doldurup initUsart(); fonksiyonunu cagiriyor. bu fonksiyonda gidip constructor cagiriyor, ve bir usartPort olusturuyor. driver structu icindeki open/close/read/write benim driver katmaninda tanimladigim fonksiyonlar, init kisminda bunlarin adreslerini yukluyorum. kullanici sadece tanimladigi driver icinden bunlari cagiriyor, istedigini yapiyor. config struct'inda 1-2 callback fonksiyonu var, bunu ust katmanda driveri kullanan eleman yaziyor. ben gerektiginde cagiriyorum (orn. arkadasim bufferin doldu, al sen bu bufferin pointerini yaz bi kenara seklinde).

bir nevi cakma object oriented (javadan c#dan kalma aliskanlik iste)
simdi 2 sorun var (ilk mesaji yazdigimda birdi, simdi kodlari tekrar okuyunca 2 oldugunu farktim:P )
1.soru: usart driverin icindeki writeFIFO fonksiyonunu cagirdi eleman. hangi usart'a yazmam gerektigini nasil ogrenebilirim? (parametre olarak usart_no gecmeden).
ornegin javada/c#da super diye bisi var. C de boyle bisi olsa, super.portNumber dedigim an kut diye run time da parametresiz alirdim. sizce bu yapida bunu parametre kullanmadan saglamanin yolu varmidir? yada siz nasil yapardiniz?

2.sorum: SPI da hem 16 hemde 8 bit data kullanilabiliyor demistim, yukardaki yapiyi aynen SPI'a da tasimak istiyorum, fakat donen degerler ve parametreler degisiyor (unsigned shor ve unsigned char gibi). bunu void* pointerla asarim, ancak islem yaparken typecast yapmam lazim. yukardaki sorunda oldugu gibi, hangi type oldugunu bilmeden (portConfiguration icinde SpiType diye bir degisken oldugunu dusunun) nasil type cast yaparim ki?

sanirim zorla parametre olarak gececem bu type olayini, ama onu da istemiyorum sahsen.
bunun yaninda birde soyle bisi var;
UsartPort structundan aynisi olarak SpiPort olarak da var. ancak 8/16bit hadisesi yuzunden iki tane var, Spi8bit Spi16bit gibi. amacim, tek bir struct olsun, ben bu struct icindeki bufferin tipini ve size'ini run time ayarlayabileyim. (sanirim mumkun degil gerci de) siz olsaniz nasil yapardiniz?
Either you feel it, or not...

Sepiroth

evet hocam, C ile object oriented ancak bu kadar oluyor iste:) yardimlariniz icin cok tesekkur ederim, gayet aciklayici oldu:)
yalniz kafama takilan bisi oldu, su UsartDriver struct'unda fonksiyonlarin argumanlarina struct'in pointerini gecmissiniz, tam olarak orayi kacirdim sanirim. Ben ilk dusundugum yapida misal init fonksiyonu, icerden bir constructor cagiriyordu, o da bana bir port aciyordu. o portun write/read/open/close gibi islemlerini de tanimlanan driver'a geciyordum, ana 1sn.. salak ben, arguman olarak driverin kendisini gecmezsem zaten nasil set edecem degerlerini offf.. insan yazarken anliyor bazen hatalarini :)

Ama write/read vb. seylere illaki bir port number argumani gececez, baska cikis yolu yok gibi. gerci ben sizden yanit beklerkene inanilmaz amele bir sey yaptim, ama calisti :) object collection vari birsey yaptim, kesinlikle inefficient bir yapi ama merak iste.. sanirim ben bu kaybettigim vakti yarin dum duz kodlar yazarak telafi edecem :')
Either you feel it, or not...

Sepiroth

incelemek isterdim de iste zaman kisiti oldugu icin abuk sabuk yaziyoruz boyle.. gonul bir yandan cok katmanli guzel mimari oturt, sonra rahat et der, ote yandan proje yetismeyecek yusuf yusuf der..
Either you feel it, or not...

ErsinErce

@gerbay hocam benimde bir sorum olacak fonksiyonlarda dizi geri döndürme imkanımız var mı? bu tarz birşey istersek illa union ve structure ile mi yapmak zorundayız?

ErsinErce

#251
hocam zahmet verdim size, gerçekten çok faydalı oldu, çok teşekkür ederim
Pointer dan sapmamak her zaman en iyisi, iyice netleşti =)

malesef CPP konusuna biraz korkak bakıyorum şu an için, ama okul bitince üzerine eğilmek istiyorum
notlarımı aldım hocam  :)

yamak

#252
Daha önce böyle bişey ile uğraşmıştım. Bir değişkenin değerini fonksiyon içinde değiştirmeye çalıştığımda hi-tech hata vermişti. O zaman sorup soruşturduğumda eğer böyle bişey yapılmak isteniyosa ve  eğer C kullanılıyosa fonksiyonun parametresinin pointer olması,  C# da ise referans tipli olması  zorunlu diye söylenmişti bana.Acaba sizin yazdığınız fonksiyonda hata vermemesinin nedeni girilen parametrenin struct olmasından mı kaynaklanıyo?

mufitsozen

#253
Alıntı Yapvoid func(cont int a)

@gerbay hocam, cont yerine duk yada sansolye filan gibi unvanlarda olabilirmi?  :P :-[

saka bir yana @gerbay hocam, ben C gibi dillerde pass by value diye bilirdim, dolayisi ile a degiskenine bir deger verilse bile bunun fonksiyon disinda bir hukmu yoktur. yani const yazarak aslinda bildigimizi bir kere daha teyid ediyoruz. bunada malumun ilami denirki geregi yoktur.
----edit --- @gerbay zaten a degiskenin degismeyecegini ornekde yazmissiniz, benim gozumden kacmis, ozur. Fakat yinede Demirelin deyimiyle malumun ilami abesle istigaldir, "pass by value" gectigini bildigmiz parametreler fonksiyon icinde degisirse haberim olsun diye kod yazilmasida buna ornek teskil edermi acaba? Tabiiki  "int a" yerine "int *a" denmis olsa (yada struct x *a) ve bu pointer degerinin gosterdigi yerin degistilmemesi gerekiyorsa o zaman const ifaesinin kullanilmasi guzel bir ornek olur. Ama soruda cevapda bu olmadigindan ben daha fazla yazmadan ufak ufak gideym  :-[


yani sui misal emsal olmaz arkadaslar.  ;)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

sevgili gerbay "nereden girdim bu konulara?" demissin, ben soyliyeyim. Program yaziyorum derken degisken tanimla, pointer nedir, syntax hatasi vs almadan program yazmak bu isin ilk adimi. daha bunun ikinci seviyesi, sonra ucuncu, sonra dorduncu sonra...

boylece hitech mi ccs mi diyen arkadaslarda aslinda ne kadar anlamsiz bir soru sorduklarinida anlarlar. :-)

yani bu detayli aciklamalarinla aslinda bir farkindalikta yaratiyorsun okuyucularda.

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