C Programlama diliyle şamatalar

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

yldzelektronik

Alıntı yapılan: arslan74 - 23 Ekim 2013, 11:43:38
Böyle bir şey olamaz. Eğer dizi oluşturulmuş ise bu sıralı olur. Aksı takdirde dizi olmaz.

Abi olmaz derken suçlanan ben miyim yoksa bana bunu gösteren program mı?Debug mu?Anlayamadım.

Şuan yaşadığım sorun tamamen bununla alakalı.Dizinin içinde karakter arıyorum ancak dizi sıralı olmadığından farklı adresler çıkıyor.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

arslan74

Alıntı yapılan: yldzelektronik - 23 Ekim 2013, 11:46:29
Abi olmaz derken suçlanan ben miyim yoksa bana bunu gösteren program mı?Debug mu?Anlayamadım.

Şuan yaşadığım sorun tamamen bununla alakalı.Dizinin içinde karakter arıyorum ancak dizi sıralı olmadığından farklı adresler çıkıyor.

Anlatığın şeyin örnekleri verirsen daha açıklayıcı olur. Bir de verdiğin örnek hangi derleyici ye ait?

yldzelektronik

Alıntı yapılan: arslan74 - 23 Ekim 2013, 11:55:08
Anlatığın şeyin örnekleri verirsen daha açıklayıcı olur. Bir de verdiğin örnek hangi derleyici ye ait?

Derleyici ccs.

Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

arslan74

Alıntı yapılan: yldzelektronik - 23 Ekim 2013, 12:05:29
Derleyici ccs.

CCS Ansi-C standartlarında uyumlu değil, yanlış biliyorsam düzeltin. Derleyicilerin bir standartları olmalı, C89 veya C99 gibi standardı olan bir derleyici ye göre konuşuyorum.


yldzelektronik

#664
Alıntı yapılan: arslan74 - 23 Ekim 2013, 12:11:53
CCS Ansi-C standartlarında uyumlu değil, yanlış biliyorsam düzeltin. Derleyicilerin bir standartları olmalı, C89 veya C99 gibi standardı olan bir derleyici ye göre konuşuyorum.



Anladım.

Diğer sorular kaynadı ama...

Sorunun kaynağının

if (Parameters.Temp_Unit == 1){
               #undef Temp_UstLimit
               #define Temp_UstLimit   257f
            }
            else{
               #undef Temp_UstLimit
               #define Temp_UstLimit   125f
            }


Satırları olduğunu gördüm.Bu şekilde bir kullanım hatalı mıdır?

Eklem:Sanırım meseleyi anladım.

#define tarzı tanımlamalar derleyiciye söylenen şeyler.Dolayısıyla compile time da etkisi olur.Run time da bu arkadaşlar etkisiz oluyor.Doğru mudur?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

arslan74

Alıntı yapılan: yldzelektronik - 23 Ekim 2013, 13:43:59
Anladım.

Diğer sorular kaynadı ama...

Sorunun kaynağının

if (Parameters.Temp_Unit == 1){
               #undef Temp_UstLimit
               #define Temp_UstLimit   257f
            }
            else{
               #undef Temp_UstLimit
               #define Temp_UstLimit   125f
            }


Satırları olduğunu gördüm.Bu şekilde bir kullanım hatalı mıdır?

Eklem:Sanırım meseleyi anladım.

#define tarzı tanımlamalar derleyiciye söylenen şeyler.Dolayısıyla compile time da etkisi olur.Run time da bu arkadaşlar etkisiz oluyor.Doğru mudur?

Evet doğrudur. "#define"  compile olmadan önce precompile ile sadece yer değiştirme olur, sonra compile olur. yani derlemeye bir etkisi olmaz. derleme öncesine ait bir olay.


kantirici

Alıntı yapılan: arslan74 - 14 Ekim 2013, 03:26:00
Merhaba,

Değişken parametreli fonksiyonu nerede kullanmak istiyorsunuz? Onu belirtirseniz doğrudan onun nasıl yapabiliriz diye örnek bir kod yazalım.
Eğer sadece öğrenmek için soruyorsanız, İnternet te değişken parametreli fonksiyon veya arguman listesi ("Variable-length Argument Lists") diye aratırsanız karşınıza bir sürü örnek kod çıkar. Bulduğum en basit örnek kodu yayımlıyorum.

Fonksiyonun açıklaması: Bu fonksiyon değişken uzunluktaki sayıların ortalamasını alır. fonksiyonun ilk parametresi kaç tane sayının girileceği bilgisini belirtiyor. ondan sonra gelenlerde ortalaması alınacak sayılardır.

Değişken parametrei kullana bilmek için "#include <stdarg.h>" bildirimin yapılması şart. Fonksiyon içinde bu işi gören "va_list" yapısı bildirilmesi gerekiyor. sonra uç fonksiyon kullanılıyor.

"va_start ( arguments, num );" ile girdiğimiz değer ile ilişkilendiriyor uz.

"va_arg ( arguments, double ); " türünü önceden bildiğimiz parametreleri çekiyoruz. Her çağırmadan sırayla bir sonraki  parametreyi getirir.

"va_end ( arguments );" ile bu yapının içi boşaltılır.


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

/* this function will take the number of values to average
   followed by all of the numbers to average */
double average ( int num, ... )
{
    va_list arguments;                     
    double sum = 0;

    /* Initializing arguments to store all values after num */
    va_start ( arguments, num );           
    /* Sum all the inputs; we still rely on the function caller to tell us how
     * many there are */
    for ( int x = 0; x < num; x++ )        
    {
        sum += va_arg ( arguments, double ); 
    }
    va_end ( arguments );                  // Cleans up the list

    return sum / num;                      
}

int main()
{
    /* this computes the average of 13.2, 22.3 and 4.5 (3 indicates the number of values to average) */
    printf( "%f\n", average ( 3, 12.2, 22.3, 4.5 ) );
    /* here it computes the average of the 5 values 3.3, 2.2, 1.1, 5.5 and 3.3
    printf( "%f\n", average ( 5, 3.3, 2.2, 1.1, 5.5, 3.3 ) );
}


@arslan74 hocam burada veriler double türünden gönderilmiş.peki printf deki gibi char, int gibi farklı veri türleri gönderebiliyormuyuz bu fonksiyon yapısı ile.

arslan74

Merhaba,

printf de const char dizisinden sonra ne geldiğini veriye bakararak anlayamayız. Onu girilen string'in içinde parse ederecek elde etmeliyiz.

Örneğin:

"%d  %f  %c"


içini analiz ettiğimizde, bütün bilgileri yazının içinde var. 2. parametre = int , 3. parametre = float , 4. parametre = yazı.

şeklinde tespit edilir. Dikkat ederseniz değişken parametre mutlaka sabit bir veya daha fazla parametre ile birlikte kullanılır. tek başına içinde değişken parametre kullanılmaz. Sebebi bu yüzden.




iruraz

Merhaba,

CMSIS dosyalarını incelerken önişlemci komutları  (#if, #ifdef, #ifndef) ile ilgili anlamadığım bir şey oldu..

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F4xx_IT_H
#define __STM32F4xx_IT_H

#ifdef __cplusplus
 extern "C" {
#endif 

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */

void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);

#ifdef __cplusplus
}
#endif

#endif /* __STM32F4xx_IT_H */


Yukarda tamamını gördüğünüz dosyanın başta bulunan kısmı:
#ifndef __STM32F4xx_IT_H    // __STM32F4xx_IT_H  ifadesi tanımlanmamışsa
#define __STM32F4xx_IT_H   // bu ifadeyi tanımla.
//__STM32F4xx_IT_H  ne olarak tanımlanıyor?


"define" önişlemci komutunu kullanırken kullandığımız anahtar kelimenin hangi değerin yerine geçtiğini de belirtmek gerekir diye biliyorum. Örneğin:
#define PI 3.14

Yukardaki
#define __STM32F4xx_IT_H

satırında __STM32F4xx_IT_H ifadesinin karşılığı ne olmaktadır? Yani bu satır derleyiciye ne söylemektedir? Verdiğim örneği herhangi bir başlık dosyasından aldım. Bu tip tanımlamalar diğer başlık dosyalarında da bulunuyor.

Saygılar.

iruraz

Alıntı yapılan: gerbay - 14 Kasım 2013, 19:01:36
aynı proje içerisinde farklı farklı kod dosyalarından aynı header file include edilebilir hatta başka header lar başka header lar içerisinden de include edilebilir ki bu normal bir durum, bu tür durumlarda preprocessor bir kez işlediği header file ı tekrar işlemeye çalışmasın diye öyle bir icat var.

preprocessor ilk kez o olay ile karşılaşınca kendi definition uzayında define ederek aradakileri işleyip geçer, sonra devam ederken yoluna aynı header tekrar çıkarsa daha önce define edildiğinden o ifdef in içine girmez, bu şekilde bir kez işlenmiş ve tanımlanmış olur o dosyadakiler..

buna "multiple inclusion protection" diyo gavurlar..

@gerbay hocam,

Cevap için teşekkür ederim. Peki bu durumda sorumda bahsettiğim "__STM32F4xx_IT_H" ifadesi tanım uzayının bir yerinde mutlaka bir değer ile tanımlanmış mı demektir?

Veya verdiğim örnekten yola çıkarsak. Diyelim ki "__STM32F4xx_IT_H" ifadesi hiçbir yerde tanımlanmamış ve önişlemci ilk kez aşağıdaki kodda bu ifadeyi rastladı ve ifndef 'in içine girdi. Bu durumda "__STM32F4xx_IT_H" alacağı değer ya da karşılığı ne olacaktır?
#ifndef __STM32F4xx_IT_H    
#define __STM32F4xx_IT_H

arslan74

#670
Merhaba,

Bu kodu amacı, bir koduna farklı işlemcilere göre yazılıp ortak kütüphane yapması için kullanılıyor. Örneği tek bir fonksiyonunuz var ama onu çok farklı işlemcilerde yazmamız gerekir. Her seferinde hangi işlemciyi kullanıyorsanız ona göre yazılmış kodu eklemeniz gerekir. Ama tek bir fonksiyonda  hangi işlemci kullanılacaksa ayrılan yerleri belirtip ona göre otomatik seçmesini sağlamak için bu yapı kullanılır.

Aşağıda örnek bir kod veriyorum. Hangi işlemci kullanılmış ise ona göre otomatik seçer.

Bu bildirimler dosyada kod içinde yazılabileceği gibi ayrıca proje içinde yazılabilir. Projeyi içinden menü ile işlemci seçilebilinir. Bu illa işlemci olmak zorunda herhangi bir özellikte olabilir.

#define   islemci_a


int fonksiyon_foo(int val)
{

  #ifdef  islemci_a
   
    return val*10;

  #endif

  #ifdef islemci_b

    return val*20;

  #endif


}

Tagli

#671
#define ile tanımlanan değişkene bir değer verilmesi gerekmiyor. Bu durumda o değişken sadece "tanımlı" oluyor, yani herhangi bir değeri olmuyor. gerbay hocamın bahsettiği şey bazen "header guard" olarak da adlandırılır. Tüm header dosyası ancak o baştaki ifade daha önce tanımlanmamışsa işleme sokuluyor ve ifade tanımlanıyor. Dosya ile tekrar karşılaşıldığında giriş ifadesi artık tanımlı olduğundan ön-işleyici header dosyasını tamamen gözardı eder.
Gökçe Tağlıoğlu

iruraz

Alıntı yapılan: Tagli - 14 Kasım 2013, 22:20:26
#define ile tanımlanan değişkene bir değer verilmesi gerekmiyor. Bu durumda o değişken sadece "tanımlı" oluyor, yani herhangi bir değeri olmuyor. gerbay hocamın bahsettiği şey bazen "header guard" olarak da adlandırılır. Tüm header dosyası ancak o baştaki ifade tanımlanmamışsa işleme sokuluyor ve ifade tanımlanıyor. Dosya ile tekrar karşılaşıldığında giriş ifadesi tanımlı olduğundan ön-işleyici header dosyasını tamamen gözardı eder.

@Tagli hocam, "tanımlı" olmak deyince aklıma "ne ile tanımlı olmak?" sorusu geliyor. Daha önceki örnekte bahsettiğim gibi
#define PI 3.14

dediğimde PI için 3.14 ile tanımlıyorum. Ama
#define PI

dediğim zaman bunu boş bir değer "NULL" ya da sıfır ile mi tanımlamış olacaktım?

@arslan74 hocam, örnekten ve anlattıklarınızdan sonra kafamda şöyle bir şey oluştu:

"islemci_a" seni yoktan var ettim ama şimdilik hiçbir şey değilsin. Ne olacağını, hayatın (burada tabi ki kodun :) ) akışı belirleyecek.

Olayı bu şekilde özetlesem doğru olur mu?

Tagli

Alıntı yapılan: iruraz - 15 Kasım 2013, 01:22:56
#define PI

dediğim zaman bunu boş bir değer "NULL" ya da sıfır ile mi tanımlamış olacaktım?
Hayır. Sadece "PI diye birşey var" demiş olacaktın. Programın başka bir yerinde de "PI diye birşey var mı?" sorusunu sormak mümkün olacaktı böylelikle. Ama mesela "alan = PI * r * r" yazmak mümkün olmayacaktı.

Bu tür ifadeler genellikle derleme ayarlarını belirlemek için kullanılır. Örneğin yazılan kodda LCD fonksiyonları var ama bazı durumlarda cihazda LCD takılı olmuyor diyelim. Bu durumda LCD ile ilgili kodları "#ifdef LCD_KULLANILIYOR" gibi bir şeyle sarmalayabilirsin. Eğer programın başında #define LCD_KULLANILIYOR tanımlaması yoksa, o bölüm hiç derlenmez. Böylece yerden kazanırsın veya kodda onun yerine başka birşey derlenir, mesela 7 bölmeli gösterge kodu gibi. Bazen de debug kodlarını ayırmak için bu tanımlamalar yapılır.

Ayrıca, önceden tanımlanmış birşeyi tanımsız hale de getirebilirsin. Bunun için de #undef kullanılır.
Gökçe Tağlıoğlu

fatih6761

Bu preprocessor komutları if-else yapısına da sahip:
#if X == 1
...
#elif X == 2
...
#else
...
#endif