C Programlama diliyle şamatalar

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

Burak B

Alıntı yapılan: atioky_216 - 12 Aralık 2013, 17:22:00
O zaman yazdığım eğer define edilmemiş ise define edilmesi için bu. Bu proproc. kısmında pek bilgim yoktu bu zmana kadar sadece #define a b
vs... Detay gördüğüm şeyleri yeniden karıştırmam gerekiyor.



Donanım bağımlı/bağımsız bir kod yazdığınızı düşünün PIC18, PIC24, dsPIC30/33, PIC32, LPC17xx, STM32xx gibi tüm MCU lar ve bunlar için kod geliştirilen tüm derleyicilerle sorunsuzca derlenebilsin. Ne güzel olurdu değil mi ? :) İşte C deki "preprocessor/predefined macro" dediğimiz yapılar bu gibi sorunların çözümüne hizmet ediyor.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

atioky_216

@ByteMaster
Bunların o işe yaradığını biliyorum. Benim sorum bunu açıkçası yukarıdaki verdiğim örnek ile nasıl gerçekleştirdiği....
Örneğin herhangi bir şekilde
#define x_API herhangibirdataturu
tür dönüşümü yapılmadan

x_API void birfonksiyon(int a, char* b vs); deklerasyonundan ne anlamamiz gerekiyor? Bu idi benim sorumun temeli.

Şimdilik @gerbay 'ın yorumunu araştırıyorum.

Burak B

#692
   Aslında @gerbay gayet açık anlatmış ama ben  biraz daha eklemeye çalışayım. Bir projeniz var bu projede iki uygulama var bu uygulamaların biri DLL(API) diğeri ise API için Test GUI programı.

   GUI' niz kodladığınız DLL' den bir fonksiyonu import ediyor. Fakat DLL bu fonksiyonu barındırıyor. Bu projelerin kodları ortak. Derleme esnasında derleyiciye "Bak kardeşim bu kodlar sadece DLL' in içinde olsun ama aynı zamanda GUI uygulaması da bu DLL in bu fonksiyonlarını import ederek kullanıyor." diye bir bildirim yapabilmemiz için @gerbay' in bahsettiği yöntem kullanılıyor.

   GUI projesinin ayarlarında ADD_EXPORTS bildirimini yapmıyorsunuz. Ama DLL proje ayarlarında yapıyorsunuz. Derleyici her iki projede de aynı kodu derlerken biri için sadece oluşacak EXE dosyanın IAT(Import Address Table) kısmına şu DLL in içindeki(aslındaki içinde değilde sistem tarafından RAM' de haritalanmış bir bölge.) şu adresdeki fonksiyon olduğuna dair bir pointer yazıyor.(Windows Internals ile alakalı bir konu) Ancak DLL için aynı kodu derliyorken gidip tüm fonksiyonu oluşacak DLL dosyasına gömüyor. Yani kodun aslı DLL in içine gömülmüş oluyor. GUI programına ise sadece bu DLL' i çağırması gerektiğine dair referans veriliyor.

   Oradaki x_API void birfonksiyon(int a, char* b vs); makrosu derleyiciye x_API gördüğü yere __declspec(dllexport) veya __declspec(dllimport) koyacağını bildirmekten başka bir görev üstlenmiyor. Bu kullanım şekilleri (__declspec(dllexport) ve __declspec(dllimport) ) zaten windows programlama ve DLL kodlama ile alakalı şeyler. Yani başka yerde pek karşınıza çıkmaz.

  Ayrıca şunu gözardı etmemek gerekli bir fonksiyonun tanımlanması demek derleyiciye fonksiyonu derlerken oluşturulacak stack hakkında ve fonksiyonun nasıl çağrılacağı hakkında fikir verir. Siz derleyiciyi bu konuda aldatabilme lüksüne sahipsiniz.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

bocek

gerbay'ın yazdığı bir noktaya da ben dikkat çekeyim.
eğer
#define x_API
gibi bir tanımlamayı kodların içinde bulamadıysanız bir de komut satırı parametrelerine bakınız. yani (kullandığınız IDE'ye göre değişmekle birlikte) 'project properties'te bir yerlerde x_API tanımı derleyiciye komut satırında bir parametre olarak geçiliyor olabilir. belki de makefile dosyasında bu tanım yapılıyordur.
1 ya da 0. işte 'bit'ün mesele..

z

STM32F4 Discovery kitteki 4 ledi biliyorsunuz.

Led adinda fonksiyon yazmak istiyorum.

Led(Y0) dersem yesil led sonecek, Led(K1) dersem kirmizi led yanacak vs

Led(Y1,K1,M0) dersem Yesil ve kirmizi led yanacak, Mavi led sonecek.

yada Led(M0,Y0,K1,S1) dersem mavi ve yesil ledler sonecek, kirmizi ve sari(kavunici) ledler yanacak.

Bu fonksiyon nasil yazilir?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

illa böylesi şartmı yoksa

led(off,off,on,on) yapsak olmazmı


z

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

mufitsozen

#697
Alıntı yapılan: z - 25 Aralık 2013, 16:16:37
STM32F4 Discovery kitteki 4 ledi biliyorsunuz.

Led adinda fonksiyon yazmak istiyorum.

Led(Y0) dersem yesil led sonecek, Led(K1) dersem kirmizi led yanacak vs

Led(Y1,K1,M0) dersem Yesil ve kirmizi led yanacak, Mavi led sonecek.

yada Led(M0,Y0,K1,S1) dersem mavi ve yesil ledler sonecek, kirmizi ve sari(kavunici) ledler yanacak.

Bu fonksiyon nasil yazilir?

c'de "variable arguments" ile yapilabilir. (variadic functions diyede gecer)

Sometimes, you may come across a situation, when you want to have a function, which can take variable number of arguments, i.e., parameters, instead of predefined number of parameters. The C programming language provides a solution for this situation and you are allowed to define a function which can accept variable number of parameters based on your requirement. The following example shows the definition of such a function.

int func(int, ... ) 
{
   .
   .
   .
}

int main()
{
   func(1, 2, 3);
   func(1, 2, 3, 4);
}

It should be noted that function func() has last argument as ellipses i.e. three dotes (...) and the one just before the ellipses is always an int which will represent total number variable arguments passed. To use such functionality you need to make use of stdarg.h header file which provides functions and macros to implement the functionality of variable arguments and follow the following steps:

    Define a function with last parameter as ellipses and the one just before the ellipses is always an int which will represent number of arguments.

    Create a va_list type variable in the function definition. This type is defined in stdarg.h header file.

    Use int parameter and va_start macro to initialize the va_list variable to an argument list. The macro va_start is defined in stdarg.h header file.

    Use va_arg macro and va_list variable to access each item in argument list.

    Use a macro va_end to clean up the memory assigned to va_list variable.

Now let us follow the above steps and write down a simple function which can take variable number of parameters and returns their average:

#include <stdio.h>
#include <stdarg.h>

double average(int num,...)
{

    va_list valist;
    double sum = 0.0;
    int i;

    /* initialize valist for num number of arguments */
    va_start(valist, num);

    /* access all the arguments assigned to valist */
    for (i = 0; i < num; i++)
    {
       sum += va_arg(valist, int);
    }
    /* clean memory reserved for valist */
    va_end(valist);

    return sum/num;
}

int main()
{
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}

When the above code is compiled and executed, it produces the following result. It should be noted that the function average() has been called twice and each time first argument represents the total number of variable arguments being passed. Only ellipses will be used to pass variable number of arguments.

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

ercan_t

merbaba,

iki şekilde yazılabilir,

1. c de kullanılan:
   void Led(const char * fmt, ...)
{char TmpData[100]
    va_list val;
    va_start(val, fmt);
    vsnprintf (TmpData,sizeof(TmpData), fmt, val);
*****
    va_end(val);
}

** yerde fscanf ile text icindeki değerler alınarak değişkenlere atılarak denenir.

2. her fonskiyon için overload fonksiyonları yazılır icerisindeki parametreler typedef enum ile tanımlanarak alınabilir
led(enum bir );
led(enum bir, enum iki);
led(enum bir, enum iki,enum üc);
....

z

#699
Mufitsozen hocam tesekkurler.

Aklima takilan tek sey kaldi. yazdigim fonksiyon kendisine kac tara parametre geldigini nereden bilecek?

Edit: pardon cevabi varmis zaten.

mesaj birleştirme:: 25 Aralık 2013, 17:01:00

Bu isleyisle ilgili biraz detay verebilirmisiniz?

C de Led(Y1,K0) yazacagim ama Led fonksiyonunu tamamen ASM yazacagim.

ASM tarafina kac tane parametre  gidecek?

Mantiken

parametrelerin yazildigi ram alaninin adresi
parametre sayisi
parametrelerin size'i gibi 3 parametre sart.

Deneme yaparak da bir seyler bulabilirim belki ama hazir bilgi varsa sevinirim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Istedigim olmuyor galiba. Ilk parametre olarak veri sayisini benim vermem gerekiyor diye anladim.

Led(1,K1) 1 lede erisilecek bu da kirmizi
Led(3,K1,Y0,S1) 3 lede erisilecek.

Yanlis mi anladim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

kantirici

@z hocam bir kaç sayfa geride bu konu hakkında konuşulmuştu bende aynı şeyi sormuştum. Fonksiyona kaç tane parametre gidicekse bunun sayısınıda beraber göndermemiz gerekiyor.

https://www.picproje.org/index.php/topic,35908.msg370896.html#msg370896

muhittin_kaplan

Alıntı yapılan: z - 25 Aralık 2013, 16:42:27
Onu ebem de yazar.
Acı Çekmekten mi Hoşlanıyorsunuz neden zorluyorsunuz :D

ErsinErce

birden fazla parametre kullanılarak yazılan fonksiyonlarda ilk başta kaç argüman gittiğini yazmanız gerekmiyor.

o kullanım sabit 1 adet giriş istiyor sadece, ister argüman sayısını gönderin ister başka birşey

argüman sayısı öğrenilemediğinden başta sayıyı göndermek tercih edilebilir ama bu tehlikeli bir durum malesef

düzenlerken yada yazım sırasında sorun çıkabilir.

en son argümanın bilinen bir değer gönderirseniz listenin sonuna geldiğinizi öğrenebilirsiniz ve yazarken, düzenlerken daha kolay olur

z

Aslinda derleme asamasinda derleyici parametreleri saysa kod uretirken de  R0'a arguman sayisini yerlestirse, ardindan R1'e de argumanlarin int mi char mi vs tipini de belirtse, argumanlari da staga atsa ...

Illa ben mi ogretecem bu adamlara bu isi?

Peki derleyiciye bunu yaptirmamim bir yolu varmi?

Yani derlenirken ben de kendimden bir seyler katabilirmiyim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com