C Programlama diliyle şamatalar

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

kantirici

#840
%5d ifadesi ile 5 karakterlik yer ayrılıyor fakat 0 konmuyor.

Ben olmayan basamaklarda da sıfır olsun istiyorum. Mesela sayı sıfırsa 00, sayı 2 ise 02 gibi. Dolaysıyla %02d ifadesini kullanıyorum ama işlev görmüyor.

Ayrıca yazmayı unutmuşum derleyici xc8.

yldzelektronik

Arkadaşın sorusunu umarım baltalamam.Ancak benim de sormak istediğim bir şey var.

Keil ile mi ilgili bilmiyorum ama bir sorun yaşıyorum.Şöyleki;

void GPIOConfig(GPIOConfigEnum_Typedef* CurrentGPIOConfigEnum)


şeklinde bir fonksiyonum var.Fonksiyonda aldığım değişkeni;

switch(*CurrentGPIOConfigEnum){
		case ConfigEnum_FSMC:


şeklinde kontrol ediyorum.Parametreyi gönderdiğim fonksiyonda parametreyi yalnızca karşılaştırma amaçlı kullanıyorum.

Ancak gönderiğim parametrelerin değerlerine göre hareket etmiyor.Keil ile debug da watcha veya memorye eklesem not in scope diyor veya adresini 0 olarak değerini de 0 olarak gösteriyor.

Aynı durum oluşturduğum struct değişkenler için de geçerli oluyor.Ancak başka bir şey daha dikkatimi çekti.

Stnin standart lib de yer alan fonksiyonlarında da aynı şey oluyor.Mesela gpioinit fonksiyonunda da pointer olarak struct gönderiliyor.Orada da aynı şeyler oluyor.Ama nedenini anlamadım.

Bir de global bir struct tanımlayıp main içinde fonksiyona çağrı yaparken structı gönderiyorum.Şöyle;

BoardConfig_Typedef BoardConfigStructure;
	
int main(void){
BoardConfigStructure.LCDConfig.ConnectionMode = ConnectionMode_8080;
	BoardConfigStructure.LCDConfig.Resulation = P800x480;
	BoardConfigStructure.LCDConfig.LCDFlag = 1;
	
	BoardConfig(&BoardConfigStructure);
...
}

void BoardConfig(BoardConfig_Typedef* BoardConfigStructure){
	//InitStatusFlags_Typedef InitStatasFlagStructure;
	
	 delay_init(100);
	 if (BoardConfigStructure->LCDConfig.LCDFlag == 1){
...
}
}


Ancak boardconfig fonksiyonu içinde yapıya debug ile baktığımda başta init ettiğim gibi değerler almadığını görüyorum.Ancak ben maindeki değişkenin adresini göndermiştim.Mainde global olarak tanımladığım değişkenin adresiyle gitmesi gerekmez miydi?Haliyle ilk verdiğim değerleri çağrı yaptığım fonksiyonda da koruyo olması gerekmez mi?

Son olarak enum bir değişkeni pointer olarak parametre geçebilir miyiz?

typedef	enum{
	P320x240,
	P480x272,
	P640x480,
	P800x480
}Resulation_Typedef;


void LCD_Init(Resulation_Typedef* Resulation){
	
  switch(*Resulation){


şeklindeki kullanım 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.

yldzelektronik

Kimsenin söyleceği bir kelimesi yok sanırım?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Tagli

Bildiğim kadarıyla switch epey nazlı bir komut. Özellikle C'de, C++'ta olduğundan daha da nazlı. İçine sadece sabit tamsayı ifade veya enum gibi şeyler kabul eder. Pointer ile kullanımında ben derleyicinin hata vermesini beklerdim, ama hata vermiyorsa da garip çalışmasına şaşırmam. enum'lar struct gibi bileşenler değil, o yüzden pointer ile aktarmana gerek yok. Aslında hiç öyle yapıldığını da görmedim, bana yanlış gibi geldi. Doğrudan aktar fonksiyona.

Bu arada, Resulation değil, Resolution olacak.
Gökçe Tağlıoğlu

berat23

burda temel mantık hatası var. enum dediğin zaten pointer kadar yer tutar. neden fonksiyona pointer parametre geçiyorsun ki? ayrıca switch yerine if ile dallanabilirsin. switch, sıralı dallanan kodlarda mantıklı, mesela 0,1,2,3... diye gidiyorsa. zaten asm çıktısına bakarsanız ofset + o değişken tipinde jmp gibi komutlak olarak derlenir. ayrıca nazlı olan enum ve struct'tır bence. packed olması vs. compiler'a bağımlı birçok şey var dikkat etmezsen.

struct pointer konusunda hata yok gibi anlattığın kadarıyla. kodun tamamını görmek lazım.

Gökhan BEKEN

Birşey sorayım. Bilgisayarda konsol uygulaması için soruyorum...
getchar fonksiyonuna zaman aşımı koyabiliyor muyuz?
Kullanıcı 5 saniye boyunca bir tuşa basmaz ise daha fazla beklemesin devam etsin gibi...
Sırf merak ettim, lazım değil aslında.
Özel mesaj okumuyorum, lütfen göndermeyin.

iruraz

#846
Merhaba,

Sorum "const" niteleyicisi ile ilgili.

#include <stdio.h>

int main(void)
{
    const char *dizi[4] = {"bir", "iki", "uc", "dort"};

    dizi[0] = "on";
    dizi[1] = "yirmi";
    dizi[2] = "otuz";
    dizi[3] = "kirk";

    return 0;
}


Yukardaki kodda görülen "array pointer" ın içeriği "const" olarak tanımlanmış. Yani içeriği değiştirememem gerekiyor. Ama her dizi elemanı için (dizi[0], dizi[1], dizi[2], dizi[3]) yeni string girdiğimde hata vermeden derliyor. Bu durumda "const" niteleyicisinin kullanım amacı ne oluyor?

Bir başka kod örneği, daha basit, bu da hatasız derleniyor.

#include <stdio.h>

int main(void)
{
    const char *dizi = "atmak";

    dizi = "tutmak";

    return 0;
}


İyi akşamlar.

iruraz

#847
@gerbay hocam, teşekkür ederim.

İki boyutlu pointer nasıl oluyor? Pek anlayamadım, "pointer to pointer" mı oluyor? Örnek verdiğim kodda dizide değişiklik yapabilmemin sebebi pointer 'ın sadece dizi adresini sabit (const) yapması mı? Böylece içeriği değiştirebiliyorum.

mir_as82

Hocam onu değiştirmek run  time hatasi olabilir. Yani derleme zamanında hata almayabilirsin.

iruraz

Alıntı yapılan: mir_as82 - 04 Kasım 2014, 20:07:15
Hocam onu değiştirmek run  time hatasi olabilir. Yani derleme zamanında hata almayabilirsin.

hocam nasıl bir "run time" hatası olabilir?

mir_as82

#850
Her dizi elemani diyor ki. Ben gosterdigim adresi sadece okuma yapmak için gosteririm. O adreslerin içeriğini benim vasitamla değiştiremezsiniz, der. Yani senin yaptigin. Verdiğin sozu tutmamaktir:).

mesaj birleştirme:: 05 Kasım 2014, 20:36:22

Sen gerbay hocanin dediğini yap.
Ömrü boyunca ayni adresi ve o adresi de sadece okuma yapmak için göstersin. Kendisi const gosterdigi yer const olan gösterici demek. Const char * const dizi[ ]. Bu su demek. Hep ayni adresi gosteririm ve o adresin olduğu yerdeki nesneyi benim vasitamla degisemezsin.

yamak

#851
Hocam @gerbay hocam da anlatmış ama.
#include <stdio.h>

int main(void)
{
    const char *dizi[4] = {"bir", "iki", "uc", "dort"};
    dizi[0] = "on";
    dizi[1] = "yirmi";
    dizi[2] = "otuz";
    dizi[3] = "kirk";

    return 0;
}

Sizin yukarıdaki kodda tanımladığınız dizinin her bir elemanı const char* türünden ve bu da demek oluyo ki bu dizinin her bir elemanı bir adres ve bu adresteki veri değiştirilemez.Siz dizi[0]="on"  dediğinizde bu adresteki veriyi değil de adresin kendisini değiştirmiş oluyosunuz.Fakat *dizi[0]=5 gibi bir işlemi yapamazsınız.Bunu yapabilmeniz için const belirtecini kaldırmanız gerekir.Tabi sadece const u kaldırarak denerseniz derleme hatası almazsınız ama çalışma esnasında segmentation fault oluşabilir.Tabi bu ayrı bi konu.

mir_as82

Chat *const dizi [ ] deseydiniz. O zaman kendi dizinizi sadece ilk değer verilen adresleri tutmasi ile sinirlamis olacaktiniz. C de string literaller adres olarak ele alinir. "Ali" bir string literaldir.

arslan74

Alıntı yapılan: kantirici - 29 Ağustos 2014, 22:35:41
%5d ifadesi ile 5 karakterlik yer ayrılıyor fakat 0 konmuyor.

Ben olmayan basamaklarda da sıfır olsun istiyorum. Mesela sayı sıfırsa 00, sayı 2 ise 02 gibi. Dolaysıyla %02d ifadesini kullanıyorum ama işlev görmüyor.

Ayrıca yazmayı unutmuşum derleyici xc8.

%5d yerine %05d yaz istediğin olur.

Burak B

Aşağıdaki makaleyi okursanız "const" konusunda detaylı bilgilere erişebilirsiniz.
http://www.dansaks.com/articles/1998-08%20What%20const%20Really%20Means.pdf
"... a healthy dose of paranoia leads to better systems." Jack Ganssle