C Programlama diliyle şamatalar

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

XX_CİHAN_XX

Yanlış olabilir uzman hocalarım daha doğru cevabı verecektir ama benim bildiğim kadarını söyleyeyim.
g_pHF isimli (struct)yapının içinde tanımlı SetAndCheckMotorOutputs() fonksiyonuna ulaşmış.
Büyük harfle yazılanlarda bu fonksiyona aktarılan parametreler.
Peki fonksiyon bir struct içindeyse neden
g_pHF.SetAndCheckMotorOutputs(......);
şeklinde yazmadık ta nokta yerine -> işarti kullandık diye soracak olursan bu da bildiğim kadarıyla başka bir dosya da tanımlanmış olan yapılara erişmek için kullanılan bir C ifadesi.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

jackal183

-> işareti struct'ın pointerı değil mi?

fatih6761

Hocam C++ ta sınıf(class) lara ait pointerlar var. Bu sınıfların fonksiyonlarına da pointer'la ulaşabiliyorsunuz. (Tabi struct için de aynısı geçerli)

arslan74

#513
Alıntı yapılan: z - 17 Haziran 2013, 20:23:33
Örneğin 24 bitlik i değişken tanımlayabileyim ve i++; şeklinde kullanabileyim isterim. (32 Bit tanımla gitsin cevap olmayacak)

Böyle bir kurguyu ancak C++ da veya daha üst versiyon dillerde yapabilirsiniz.

Örneğin C++ da bununla ilgi bir sınıf(class) yazarsınız sonrada bu sınıflara operator overloading fonksiyonlarını yazarsanız istediğiniz olur. Ama bunu sınıf içinde 3 byte veri bile tutsa sınıfın kendi boyutu 3 byte fazla olur.

mesaj birleştirme:: 05 Temmuz 2013, 06:46:09

Alıntı yapılan: teknikelektronikci - 04 Temmuz 2013, 17:29:51
benimde bir sorum olsun :)
ilkin c++ ile programlama yapan arkadaslar visual (görsel) kismi naasil hallediyorsunuz ? qt ilemi?

ikincisi asagidaki program parcasi tam ollarak ne yapar ?

g_pHF->SetAndCheckMotorOutputs(DF_MIN_MOT_CURRENT_TEST1, DF_MAX_MOT_CURRENT_TEST1, DF_TOLERANCE_MOT_CURRENT_TO_REAL_TEST1);


DF ile baslayanalr include da tanimlanmis sabit degerler ama benim anlamadiigm nokta bu basdaki g_pHF -> parcasi ne yapar ? sanirim bu OOP ile ilgili olsa gerek (OOP: objekt oriented programing)


q_pHF isimli değişken bir yapı veya union olan bir pointer(yapının adresini tutan değişken). Nokta operatörü yapının içinde ki bir değişkene erişmek için kullanılır. Ama q_pHF bir yapı değil, sadece yapının adresini tutuyor. Dolaysıyla q_pHF içinde bir yapı yok ki, yapının içindeki elemana ulaşın. yapının içindeki elemana ulaşmak için bir kaç yöntem var.
örneğin * operatörü pointerin içindeki değere ulaşır.
O zaman :
(*g_pHF).SetAndCheckMotorOutputs(DF_MIN_MOT_CURRENT_TEST1, DF_MAX_MOT_CURRENT_TEST1, DF_TOLERANCE_MOT_CURRENT_TO_REAL_TEST1);


yada doğrudan pointer üzerinden işlem yapılacaksa o zaman -> operatörünü kullanılması gerekiyor. O zaman gösterdiği adresin kendisine erişiyoruz. yazılımı daha dolay oluyor. Örneğini yukarıda vermişsiniz.

Bu yapının içinde de parametreli bir fonksiyon adresi var. fonksiyonları çağırma işlemi aslında fonksiyon adresi ve parametresi şeklinde olduğundan. doğrudan fonksiyon adresini alıp sonra bu adresi yazdığımızda fonksiyon çağırmış oluyoruz.

teknikelektronikci

cevaplar icin tesekür ederim, kod cok karmasik bir kod, rtos icinde kosan test programi, bende önce struct union yapilarini düsündüm ve gözüm aradi ama bulamadim.
anlamak istedigim bu yapi baska bir class icinde tanimlandigi icinmi? -> ile ulasiyoruz? sanirim  . olursa pointer olmuyor -> olunca pointer oluyor. sonuc ollarak proje icinde ama baska bir class ve cpp dosyasinda SetAndCheckMotorOutputs adli fonksiyonu buldum ama niye bunu union veya struct ile yapioruz onu cözmüs degilim, :/ beni c de de en cok bu union struct yapilari zorlamisdi simdi tekrar burda var=)
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

yldzelektronik

Selamlar.

Anlamsız bir şekilde kodda hata alıyorum.

Ecpect ; diyor ancak eksik söz konusu değil.



2 hata bir uyarı var.İlk hata

i2c_write(adress);

satırında. İkinci de for döngüsünde ve saçma bir şekilde.İlgili kısım aşağıdaki gibi;


   for (i=0;i<HYT271_BUFFER_LEN;i++)
   {
      buffer = i2c_read();
   }

Burada da i2c_read(); satırında aynı hatayı veriyor.O warningi zaten hiç anlamadım.Hatanın sebebi ne olabilir?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

JKramer

#DEVICE parametresi varsayılan olarak ANSI değil, bu yüzden büyük-küçük harf ayrımı yapılmıyor. Ya ANSI yapın ya da #define ile yaptığınız tanımlamaları yeniden adlandırın. (Bence ANSI yapsanız da yeniden adlandırın.)

Klein

Alıntı yapılan: teknikelektronikci - 05 Temmuz 2013, 11:11:10
cevaplar icin tesekür ederim, kod cok karmasik bir kod, rtos icinde kosan test programi, bende önce struct union yapilarini düsündüm ve gözüm aradi ama bulamadim.
anlamak istedigim bu yapi baska bir class icinde tanimlandigi icinmi? -> ile ulasiyoruz? sanirim  . olursa pointer olmuyor -> olunca pointer oluyor. sonuc ollarak proje icinde ama baska bir class ve cpp dosyasinda SetAndCheckMotorOutputs adli fonksiyonu buldum ama niye bunu union veya struct ile yapioruz onu cözmüs değilim, :/ beni c de de en cok bu union struct yapilari zorlamisdi simdi tekrar burda var=)

başka bir class veya struct içinde tanımlandığı için değil. Pointer lduğu için "->" ile ulaşıyoruz.

typedef struct
{
   int x;
   int y;
}DenemeTipi;

Deneme tipi  a;
Deneme tipi *b = a;


Burada DenemeTipi isimli bir tip tanımladık. Bu tipten a isimli değişken  ve aynı tipten b isimli işaretçi tanımladık. 

eğer a değişkeninin x isimli üyesine ulaşmak istersek  a.x = 5 diyebiliriz.
ama a değişkeninin x isimli üyesine b işaretçisi ile ulaşmak istersek   b->x = 5 dememiz gerekir.
İki durumda da aynı işi yaptık. birinde doğrudan diğerinde işaretçi üzerinden.

Struct neden kullanılır? 
Asıl amaç verilerimizi derli toplu hale getirip organize olabilmek.  Bir çeşit veri tabanı gibi.
diyelim ki bir fonksiyonun var bu fonksiyon 5 tane parametre alıyor ve bu parametreler üzerinde çeşitli işlemler yapıp bazı global değişkenlere de bu değerleriyazıyor.

örn:
int a;
int b;
int c;
int d;
int e;

fonk ( int *a, int *b, int *c, int *d, int *e)
{
    *a = (*d) * (*e);
     *d = *b;
 ....
...
}

fonksiyon ( &a, &b, &c, &d, &e);


bu tip bir fonksiyonu çağırırken 5 tane parametre geçmen gerek.  a,b,c,d,e değişkenlerinin adresini geçtin.
1- Çağırıren 5 tane parametre geçtiğin için  yığında 5 adres için yer açıldı.
2- Çağırırken 5 tane parametreyi ayrı ayrı geçmek zorunda kaldın.

bu kod şöyle olsaydı.

typedef struct
{
int a;
int b;
int c;
int d;
int e;
}StructType;

StructType test;

fonksiyon( StructType *x)
{
    x->a = x->d  *  x->e;
     x->d =  x->b;
 ....
 ...
} 

fonksiyon( & test)


1-Bu durumda yığında sadece 1 adres için yer açıldı.
2- fonksiyonu çağırırken sadece 1 parametre ile çağırdığın için hem daha kolay hatırladın. hem de kodun daha derli toplu durdu.

Bu verdiğim örnek neden struct kullanırız sorusuna basit bir cevap veriyor. Çok daha kompleks nedenler de var. ama başka bir başlıkta ele alınabilir.



teknikelektronikci

hocam cok tesekürler örnek ile daha güzel oldu, sanirim birincide fonk, fonksiyon olacak :)  Saygilar

fonk ( int *a, int *b, int *c, int *d, int *e) 
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

armsistem

Arkadaşlar merhaba aşağıdaki soruyu daha öncede sordum açıklayıcı bir cevapta aldım sadece bir satır aklıma takıldı.
#define IAP_ADDRESS            0x7FFFFFF1
typedef unsigned int (*IAP)(unsigned int[], unsigned int[]);
static const IAP iap_entry = (IAP) 0x7FFFFFF1;


IAP ile flash memory veri yazdım okudumda lakin aşağıdaki satırda özellikle  "(IAP) 0x7FFFFFF1;" kısmını anlamıyorum.

IAP iap_entry = (IAP) 0x7FFFFFF1;

yardımlarınız için şimdiden teşekkür ederim.

yamak

Sadece tür dönüşümü amacıyla yapılımış bişey.Yani derleyici 0x7FFFFFF1 adresini IAP türünde bir adrese dönüştürme yapıyo.IAP da geri dönüş değeri unsigned int olan ve parametreleri unsigned int türünden adres olan bir fonksiyon göstericisi.

Mr.Java

Arkadaşlar merhaba.Benim sorum şu şekilde.

atıyorum delay_ms fonksyonu yazdık.Ben üst limit olarak 12ms belirledim.Üstünde girildiğinde derleyici hata mesajı versin istiyorum.Kullandığım derleyici MPLAB X sizce nasıl yapabilirim ?

muhittin_kaplan

#if derleyici ön bildirimi yaparsın sanırım.

Tagli

Fonksiyon argümanı çalışma anında belirleniyorsa, yapılabilecek birşey olduğunu sanmıyorum.
Gökçe Tağlıoğlu

yldzelektronik

xc8 ile ;

if(!WriteI2C(HYT271_ADDR+I2CREAD) == 0 )

şeklindeki kullanımda hata alıyorum.Amacım;

i2c write dan ack dışında bişey gelirse if i işle.Onu;

if(WriteI2C(HYT271_ADDR+I2CREAD) !== 0 )

şeklinde yapmaya kalktığımda da hata alıyorum.Sorun nedir?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.