Tam Sürümünü Görmek İçin : casting
Volkan Uzun
05/05/2006, 01:44
bu casting tam olarka nedir, nasil okunur
char (*(*abc( )[ ]))
acehreli
05/05/2006, 02:13
Linux altinda cdecl programini kullanarak her tur ifadeyi Ingilizce'ye cevirebilirsin.
Bence sanki sag tarafi eksik gibi duruyor. char'dan sonra gelen parantezli kisim, bunun bir islev gostergesi oldugunu soyluyor ama ne tur parametre aldigini belirten kismi yok. Ben senin aldigin kaynakta sanki sonunda bir de (double) varmis gibi varsayacagim:
char (*(*abc( )[ ]))(double);
Yok, uydurmam dogru cikmadi. Benim ekledigim (double) olsa da olmasa da VC++7 soyle diyor:
error C2090: function returns array
Dogru yazidigindan emin misin?
Ayrica, biz (yani insanlar) anlayamiyorsak, boyle karmasik tanimlar kullanmamak gerekir. Tanimin her adiminda typedef'ler kullaninca hersey acilir. :)
Ali
Volkan Uzun
05/05/2006, 02:15
interviewda bir arkadasima sorulan soruymus
acehreli
05/05/2006, 02:21
Oyle soru sorulur mu! :) Isin icinde diziler ve islev gostergeleri filan var ama nasil anlayalim yani?
Bence arkadasinin en iyi yaniti "ben boyle kod yazmam" olmaliymis. Dedigim gibi, once typedef'lerle anlasilir hale getirilmesi gerek.
Ali
yesilvadi
05/05/2006, 21:49
Linux altinda cdecl programini kullanarak her tur ifadeyi Ingilizce'ye cevirebilirsin.
pardon? nasıl ingilizceye çevirmek, pek anlayamadım.
eğer casting bir sefer yapılacaksa typedef yapmak çok mantıklı değil bence
acehreli
05/05/2006, 23:56
Yani cdecl bir insanin okuyacagi sekilde ama Ingilizce dilinde soyler. Ornegin,
cdecl explain 'char *(*dizi[])()'
yazildiginda sunu gibi bir sey soyler:
fptab is array of pointer to function returning pointer to char
(Su anda cdecl'i olan bir bilgisayarim yok; onun icin tahmin ettim.)
Bunun tersini (declare) de yapar. Su sayfanin sonunda bol ornek var:
http://www.die.net/doc/linux/man/man1/cdecl.1.html
typedef icin tanimin birden fazla kullaniliyor olmasini dusunmuyorum. Basit bir ornek olarak, ayni tUrde iki islev dizisi tanimlayalim:
typedef char (*Islev)(long);
Islev dizi_kolay[] = { islev0, islev1 };
char (*dizi_zor[])(long) = { islev0, islev1 };
Bence bunlardan Islev typedef'ini kullanan dizi_kolay tamamen acik. Ayrica bir int dizisinin tanimina da cok benziyor. Eleman tUrleri ve koseli parantezler ikisinde de ayni yerdeler:
int dizi[] = { /* ... */ };
Bunun yaninda dizi_zor'u gordugumde mutlaka durup dusunmem gerekiyor. Koseli parantezler neden ortadaki parantezin icinde? Sondaki (long) bunun sanki bir islev oldugunu dusunduruyor ama oyle degil.
typedef kullanmanin tek zarari, typedef'in az bilinen iki kullanimi olabilir. Eger bir diziye veya isleve yeni bir ad veriyorsak; yeni ad, dizi veya islev adinin normalde bulundugu yere koyulur.
typedef char (*Islev)(long); // long alan char dOndUren isleve yeni ad: Islev
typedef Islev IslevDizisi[]; // Islev dizisine yeni ad: IslevDizisi
Okunmasi zor bir kod yazmaya calistim. Asagida zor_islev icindeki dizi_alan_islev degiskeninin tanimina bakin! :) Ayni isi yapan kolay_islev bana cok daha anlasilir geliyor.
#include <stdio.h>
char islev0(long sayi)
{
return 'a';
}
char islev1(long sayi)
{
return 'b';
}
typedef char (*Islev)(long);
typedef Islev IslevDizisi[];
double dizi_alan(IslevDizisi dizi)
{
// Kisa olsun diye, dizide iki nesne bulundugunu kabul ediyorum
printf("%c %c\n", dizi[0](7), dizi[1](42));
return 0.0;
}
void zor_islev()
{
char (*dizi[])(long) = { islev0, islev1 };
double(*dizi_alan_islev)(char (*[])(long)) = dizi_alan;
dizi_alan_islev(dizi);
}
void kolay_islev()
{
typedef double (*DiziAlanIslev)(IslevDizisi);
Islev dizi[] = { islev0, islev1 };
DiziAlanIslev dizi_alan_islev = dizi_alan;
dizi_alan_islev(dizi);
}
int main()
{
zor_islev();
kolay_islev();
}
Ali
char (*(*abc( )[ ])) :
abc is a function ,taking no parameters and returning pointer to array of pointer to char.
SOAC: Spiral outwards anti clockwise.
abcden sonra saat yönünün tersine dönerseniz istediğiniz ifadeye ulaşırsınız.
Bu yöntemle çok daha zorlarını da okuduğumu bilirim(destan kıvamındaydılar) ;)
Kolay gelsin...
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.