C Programlama diliyle şamatalar

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

CoşkuN

#90
Alıntı yapılan: bunalmis - 26 Ekim 2011, 12:10:31
Soruda o isteniyor. C++ da bu öğrenilebilir mi?
C++'ta bu mümkün görünüyor: http://bytes.com/topic/c/insights/737451-case-against-global-variables

int data = 10;
 
int main()
{
    double data = 25.0;
    cout <<    data << endl;   //You see 25
    cout << ::data << endl;   //You see 10
}

Sanırım C de bunu ek bir işlem olmadan yapamıyoruz.

Zaten bu durumdan her zaman kaçınılmalı. Yani global ve lokalde kullanılan değişken adları farklı olarak verilmeli.
Ne kadar az global kullanırsak bu da o kadar iyidir ayrıca.

OptimusPrime

C++ da :: operatörü kullanılarak global değişkene ulaşılabilir fakat C de bunun bir karşılığı yok...
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 ||

OptimusPrime

#include <stdio.h>
main(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \
}'+}##(!!/")
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
  :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}


birde yukarıdaki gibi bir şamata var. anlayabilen bana da anlatsın. programı derlediğinizde

On the first day of Christmas, my true love gave to me...
A Partridge in a Pear Tree.

On the second day of Christmas, my true love gave to me...
2 Turtle Doves
And a Partridge in a Pear Tree.

On the third day of Christmas, my true love gave to me...
3 French Hens
2 Turtle Doves
And a Partridge in a Pear Tree.

On the twelfth day of Christmas, my true love gave to me...
12 Drummers Drumming
11 Pipers Piping
10 Lords-a-Leaping
9 Ladies Dancing
8 Maids-a-Milking
7 Swans-a-Swimming
6 Geese-a-Laying
5 Gold Rings
4 Colly Birds
3 French Hens[8]
2 Turtle Doves
And a Partridge in a Pear Tree.

şeklinde bişeyler yazıyor... :)
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 ||

z

#93
Pointerler üzerine konuşmaya devam edelim.

Çipinizin dokumanında, adresi atıyorum 0x42345678 olan bir register gördünüz.

Fakat #include ile programınıza dahil edilmiş olan çipin register tanımlamalarının bulunduğu dosyada her nedense bu 0x12345678 adresli register yer almamış.

Sizin de bu registeri kullanmanız gerekiyor. Ne yapacağız?

---------------------------------------------------------------

Programlarda int A yada char A vs bir tanım yaptığınızda, A değişkenin adresi derleme aşamasında C tarafından belirlenir.

Halbuki registerlerin adreslerini çip üreticisi belirler. Dolayısı ile bu gibi durumlarda adres belirleme işini derleyicinin inisiyatifinden almamız gerekir.

---------------------------------------------------------------

Şimdi daha önceki pointer anlatımımızı hatırlayın ve aşağıdaki satırları takip edin.

int A;           // Ben integer bir değişkenim
int *P;         // Ben integer değişkenin adresini saklayabilirim

      P=&A;    // Pointer'a A değişkeninin adresini yazdık
    *P=0x12;  // pointerin gösterdiği int alana  0x12 değerini yani 0x00000012 yükleyeceğiz demektir.

//    Yukarıdaki satırlar A=0x12 demekle aynı şeydir.

---------------------------------------------------------
     
Yukarıdaki örnekte pointera A değişkeni, hangi adresde ise o atandı ve kullanıldı. Şimdi yok kardeşim A nın adresini değil benim vereceğim sayısal adresi kullan diyelim.

Sonrada bu adrese örnek olarak 0x12345678 değerini yazalım.

int *P;

       P=(int*) 0x42345678; 
     *P=0x12345678;

----------------------------------------------------------------

Fakat ben P nin önüne her defasında * koymak istemiyorum.

#define P  (*((int*) 0x42345678)) tanımlarsak

        P=0x12345678;     

yazarız.

Eğer yakışıklı görünmesi şart değil derseniz

        (*((int*) 0x42345678))=0x12345678; de yazabilirsiniz.

Verilen örnekler 0x42345678 adresine 0x12345678 sayısını yazar.

----------------------------------------------------------------------------

Yukarıdaki örneklerde pointeri integer tanımladık.

Bir portu, bu şekilde pointer ile kullanmak için portu int tanımlamak sakıncalıdır. unsigned int tanımlanmalıdır. Neden?

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

NecroCapo

Alıntı yapılan: bunalmis - 25 Ekim 2011, 22:25:27
Kritik bir soru

int a;

void main()
{
    static int a;

    a=1;
//  Global a değişkeninin içeriğini nasıl öğrenirsiniz?
    ....
}

Eğer verdiğiniz kodun başına da birşeyler ekleyebiliyorsak { } içerisinde tanımlayarak yapılabilir. Aşağıdaki kodu gcc ile derleyip kontrol ettim :

#include <stdio.h>
int a=0;

void main()
{
   {
        static int a;
        a=1; 
        printf ("\nLocal a : %d", a);
   }
   printf ("\nGlobal a : %d\n", a);
}

Sonuç :

Local a : 1
Global a : 0

fatihinanc

Bu şekilde çalışması normal zaten.
Çünkü static değişkeni farklı bir blok içerisinde tanımlamışsınız.
Soruda main fonksiyonu içerisinde..

Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

fahri-

Alıntı yapılan: bunalmis - 26 Ekim 2011, 14:00:09
Bir portu, bu şekilde pointer ile kullanmak için portu int tanımlamak sakıncalıdır. unsigned int tanımlanmalıdır. Neden?

Hocam portlar fiziki olarak vardır. Adresleri signed olamaz. yani hiçbir zaman negatif olamaz. Daima pozitif olmalıdır.

z

#97
int tanımlarsak olur fakat sakıncası var. Bu sakıncayı söylemizi istiyorum.

#define P  (*((int*) 0x42345678))  Sakıncalı

#define P  (*((unsigned int*) 0x42345678))  Olması gereken

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

GreeN

sanırım bu işe yarar ?


int a=1; // global değiken
int *pt1,*pt2;

int main(){

pt1 = &a; //bu satırı static a değişkenini tanımlamadan önce yazdığım için global a değişkeninin adres değerini aldı

static int a=10;

pt2 = &a; //bu satırda da static a değişkeninin adres değerini aldım


printf("Global a = %d",*pt1);
printf("Static  a = %d",*pt2);
.....
}
Terörü Lanetliyoruz.

muhittin_kaplan

Pek C bilgim Yoktur Yalnız. Pointer ile çalışmanın nasıl bir sistem olduğunu ASM deki Dolaylı Adresleme olarak kavradığımı düşünüyorum.
ohalde Global değişkenin Pointer (Hazfıza Adresi) Değerini Bir değişkende Saklarım Main Fonksiyonu içerisinde Bu adresdeki değeri okurum. Statik değere zaten ulaşıyoruz. Problen Her ikisininde "A" olarak tanımlanması idi.
Olurmu ?

Baktımda green de dediğimi yazmış

jeopardy

#define P  (*((int*) 0x42345678))  Sakıncalı

#define P  (*((unsigned int*) 0x42345678))  Olması gereken


şimdi 0xffffffff adresini düşünürsek bu int olamaz, unsigned olur. Sakıncalı olma sebebi bu mudur?

z

Statik tanımı kodlar arasına sıkıştığı için Green'in örneğini Keil derlemiyor.

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

CoşkuN

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.
Bildirimlerin atamalardan önce gelmesi gerekiyor.

z

Alıntı yapılan: jeopardy - 26 Ekim 2011, 14:54:48
#define P  (*((int*) 0x42345678))  Sakıncalı

#define P  (*((unsigned int*) 0x42345678))  Olması gereken


şimdi 0xffffffff adresini düşünürsek bu int olamaz, unsigned olur. Sakıncalı olma sebebi bu mudur?

0xFFFFFFFF, integerda da unsigned integerda da tanımlı dır.

Dolayısı ile sakınca bu değil. Başka bir şey.

Öyle bir örnek verin ki, integer pointer üzerinden tanımlanmış porta eriştiğimizde sorunu tüm çıplaklığı ile görelim.

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

NecroCapo

Alıntı yapılan: fatihinanc - 26 Ekim 2011, 14:06:05
Bu şekilde çalışması normal zaten.
Çünkü static değişkeni farklı bir blok içerisinde tanımlamışsınız.
Soruda main fonksiyonu içerisinde..

Değişkeni main fonksiyonunda tanımlarsak da olur, bu şekilde de aynı çıktıyı veriyor,  ama bu sefer de "extern" kısmını farklı blokta tanımlamış oldum  :P

#include <stdio.h>
int a = 0;

void main() 
{ 
static int a = 1; 

{ 
extern int a;
printf("Global a %d\n", a);
} 

printf("Local a %d\n", a);
}