C Programlama diliyle şamatalar

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

Burak B

sizeof() veri tipinin byte cinsinden uzunluğunu verir. Yani bir pointer kullandığınız platforma göre 4 byte da olabilir 2 byte da. Eğer struct içinde pointerlar varsa sizeof bunların gösterdiği yerdeki veriyi hesaba katmaz.

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

coderun

Alıntı YapŞöyle bir örnek ekleyeyim.
Kod: [Seç]
    char x[4] = {1,2,3,4};
    unsigned long y;
    y= *((unsigned long *)&x[0]);

İşleminin sonucunda y de 04030201 yani 01020304 değeri atanır. Böylece bir dizi (bu bir struct olabilir) elemanlarına bir bütünmüş (unsigned long) gibi
işlem yapabiliriz.

hocam bu bilgi için teşekkürler. Bir eksik daha gitti :)

yldzelektronik

Derleyici için "C" ile 'C' arasında ne fark var?Neden tek karakter olduğunda ' ' aralığında olmak zorunda?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yamak

#648
Alıntı yapılan: yldzelektronik - 08 Ekim 2013, 10:43:41
Derleyici için "C" ile 'C' arasında ne fark var?Neden tek karakter olduğunda ' ' aralığında olmak zorunda?
Hocam "C" string tir 'C' ise karakterdir.Bir string bellekte en az iki byte lık yer ayrılır çünkü derleyici otomatik olarak string in sonuna '\0' karakterini koyar fakat karater için en az 1 byte gerekir.Ayrıca stringler aslında adrestir.Yani bi string in adı onun ilk karakterinin adresidir.


yldzelektronik

#649
Alıntı yapılan: yamak - 08 Ekim 2013, 11:24:10
Hocam "C" string tir 'C' ise karakterdir.Bir string bellekte en az iki byte lık yer ayrılır çünkü derleyici otomatik olarak string in sonuna '\0' karakterini koyar fakat karater için en az 1 byte gerekir.Ayrıca stringler aslında adrestir.Yani bi string in adı onun ilk karakterinin adresidir.



Anladım.

Teşekkürler.

Şimdi bir konuda canım sıkıldı.;

rom float               Birim[4] = {100,0.1f,1,1};


Şeklinde bir dizim var.Görüldüğü üzere burada sadece 0.1 yüzünden bu diziyi float tanımlıyorum ve çok yer kaplıyor.Alanım  daralıyor ve optimizasyona gitmem gerek.

O eleman 0.1 olarak kalmak durumunda çünkü dizinin ilgili elemanını direk formülde kullanıyorum.Aklıma şu geldi;

Ben o diziyi char tanımlasam ve 0.1f şeklinde ilk değeri kalsa ve formülde ilgili yerde formülün başına (float) şeklinde tanımlama koysam uygun değer çıkar mı?

Veya daha uygun ne yapılabilir?

#mufitsozen abiydi sanırım.Fixed point sayılardan bahsetti.Biraz bakındım ancak çok bir şey bulamadım.

Ne yapılabilir?

Teşekkürler.

Ekleme:

//Bu değişkenlerin hangi bellek bölgesinde tutulduğunu söyleyebilir misiniz?

char degisken;
char degisken = 12;

static char degisken;
static char degisken = 23;

const char degisken = 43;

static const char degisken = 56;

rom char degisken;


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

arslan74

Merhaba,

Benim ilk akılma gelen şey,

Tüm sayıların 10 katını kullan. Dolaysıyla float sayıdan kurtulmuş olursun. ilgili formülde sayısı float'a cevirip sonra 10'a bölüp öyle fonksiyonuna verirsen hiçbir problem kalmaz.

Selamlar


yamak

Hocam struct kullabilirsiniz.
typedef struct
{
     char dizi[3];
     float flt;
}birim;

Tabi bu şekilde yaparsanız struct ın boyutu 7 byte dan büyük çıkabilir tam 7 byte olmasını istiyosanız aşağıdki gibi tanımlayabilirsiniz.
#pragma pack(push,1)
typedef struct
{
    char dizi[3];
    float flt;
}birim;
#pragma pack(pop)


yldzelektronik

#652
Düzeltme: printf protatip için

int printf ( const char * format, ... );

verilmiş.Bu üç nokta ne demek?Bir fonksiyona parametre olarak böyle bir şey girilebilir mi?
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 - 12 Ekim 2013, 10:21:58
Düzeltme: printf protatip için

int printf ( const char * format, ... );

verilmiş.Bu üç nokta ne demek?Bir fonksiyona parametre olarak böyle bir şey girilebilir mi?

Yanıt : Evet verilebilir. Bunun anlamı, değişken parametre oluyor. Printf değişken bir sürü parametresi olduğu için C'de ancak bu şekilde kullanılır.


yldzelektronik

Alıntı yapılan: arslan74 - 12 Ekim 2013, 16:44:16
Yanıt : Evet verilebilir. Bunun anlamı, değişken parametre oluyor. Printf değişken bir sürü parametresi olduğu için C'de ancak bu şekilde kullanılır.


Teşekkürler.Ancak,

Açıklaması yok mu?Bu kadar mı?

Nasıl tanımlayabilirim,nasıl kullanılır?

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

arslan74

#655
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 ) );
}

yldzelektronik

#656
@arslan Teşekkürler.

inline
separate
register

tam olarak nedir?Compiler help de izah etmiş ama tam anlayamadım.Anladığım kısım separate de romdan tasarruf sağlarken stack şişiriyormuş.

Açıklaması var mı bu direktiflerin?

Ekleme:Ram de istediğim adres alanlarını kendime ayırabilir miyim?

Şöyle bir sorun ile karşı karşıyayım;

50 elemanlı bir katar oluşturuyorum ve katarı ramde sıralı olarak yerleştirmiyor.İlk 5 kadar eleman sıralı,sonraki elemanları farklı adreslere yerleştiriyor.Normalde dizi değişkenler sıralı yerleştirilmez mi?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

arslan74

"inline" : fonksiyonun başına yazdığın zaman fonksiyon üretmek doğrudan olduğu yere kodunu yazar. Dolaysıyla fonksiyon çağırma işlemleri olmayacağını için daha hızlı çalışacaktır. Ancak C89'de yok C99 standartlarına var.

"seperate" bunu bilmiyorum. Örnek kod gösterbilirmisin.


yldzelektronik

Alıntı yapılan: arslan74 - 23 Ekim 2013, 11:38:52
Örnek kod gösterbilirmisin.


#pragma id version
#reserve 0x20:0x2f

int CYCLES;    // Global cycles (note upper case)

#inline
void pulse_B0() {
#pragma use fast_io(B)
      output_low(PIN_B0);
      delay_ms(100);
      output_high(PIN_B0);
      delay_ms(100);
#pragma use standard_io(B)
}


#separate
void send_pulses() {
   int cycles;  // Local cycles (note lower case)

   for(cycles=CYCLES; cycles!=0; --cycles) {
      pulse_B0();
   }
}


#pragma zero_ram


Burada reserve kullanılmış.Acaba benim sorduğum soruya cevap olabilir mi?
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:20:20
50 elemanlı bir katar oluşturuyorum ve katarı ramde sıralı olarak yerleştirmiyor.İlk 5 kadar eleman sıralı,sonraki elemanları farklı adreslere yerleştiriyor.Normalde dizi değişkenler sıralı yerleştirilmez mi?

Böyle bir şey olamaz. Eğer dizi oluşturulmuş ise bu sıralı olur. Aksı takdirde dizi olmaz.