C Programlama diliyle şamatalar

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

yldzelektronik

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

kantirici

#976
Merhaba,

Elimde aşağıdaki gibi struct yapıları var.

typedef struct Button_t {
    char Order;
    TScreen* OwnerScreen;
    char Left;
    char Top;
    char Width;
    char Height;
    char Visible;
    char Active;
    const char *Caption;
    char InversText;
    TTextAlign TextAlign;
    char PressColEnabled;
    void (*OnClickPtr)();
} TButton;

struct Screen_t {
    unsigned char ObjectsCount;
    unsigned int ButtonsCount;
    TButton   * const * Buttons;  
};



Mesela 5 tane buton değişkeni tanımlayıp bunları bir diziye atarak struct Screen_t da  bulunan "TButton   * const * Buttons; " değişkenine bu dizinin adresini atamak istiyorum. Tanımlamaları aşağıdaki gibi yapıyorum.

TScreen ScreenKeyboard;

TButton  buton1, buton2;

const TButton * KeyboardButtons[27] = {
    &buton1,
    &buton2};


Son olarak dizi adresini "TButton   * const * Buttons" a atamak işlemi aşağıdaki gibi yapıyorum.

ScreenKeyboard.Buttons = KeyboardButtons;



Bu atama işlemine derleyici kızıyor ama derliyor. Başka bir fonksiyonda ilgili butonlara ulaşmak istedigimde sıkıntı yaşıyorum. Bazen çalışıyor bazen sıkıntı çıkarıyor. Yapmak istedigim ScreenKeyboard.Buttons[indis] ile dizide tanımladıgım butonlara erişmek.


CLR

#977
Burada ne yapmak istediğini anlayamadım, başkalarının yazdığı hazır struct yerine kendi struct'ını yazarsan daha verimli olur. Yinede kullanımı şöyle

// öncelikle 27'lik dizi oluşturmuşsun ama 2 tane değişken tanımlamışsın buna compiler uyarı verir, 2'den büyük buton değişkeni değeri girdiğinde büyük ihtimalle programın kilitlenir çünkü programda kaybolmuşsun demektir. Aşağıdaki gibi yapmanı tavsiye ederim.

// kaç button varsa diziye ekle
const TButton * KeyboardButtons[] = { &buton1, &buton2, .......};


// Kullanırken,

char ButtonNo=1;  // kullanacağın buton no olsun

const TButton *Bptr = KeyboardButtons[ButtonNo-1]; // ButtonNo=1 olduğu için button1 struct'ı veya registerleri kullanılır

GlcdPrint( Bptr->Left, Bptr->Width.....);  //  Burada kullanımı

......
Knowledge and Experience are Power

kantirici

#978
Programdan bir parça aldığım için orası 27 kalmış, normalde içeriği dolu.

Hocam bu mikroC nin bir kütüphanesi kütüphaneyi xc8 de kullanmak için port etmeye çalışıyorum.   Her ekran için bir ekran oluşturulup bu ekran da bulunacak yazı,resim, buton v.b şeyler ekran struct ına yükleniyor. Daha sonra ekran lcd ye yansıtılıyor. Ekran geçisinde DrawScreen(Tscreen A) gibi ir fonksiyona ekran struct ı geçirilip o ekranda tanımlanan butonlar, yazılar, resimler  ekrana basılıyor. Burada ki espiri bir ekranda 10 buton diğerinde 5 buton bir diğerinde sadece resim veya yazı olabilir. Bunlar için static bir fonksiyon yazmak yerine dinamik çalışan bir yapı sağlanmış . Yani A struct ında tanımlanmış ne varsa onu ekrana basıyor.


ScreenKeyboard adında tanımladıgım ekranda 27 tane buton var. Bu butonları "const TButton * KeyboardButtons[27] " isimli diziye adreslerini alıyorum. Daha sonra Screen struct ında " TButton   * const * Buttons;" ile tanımlı yapı elemanına "ScreenKeyboard.Buttons = KeyboardButtons" atamasıyla butonların adreslerinin oldugu diziyi atmaya çalışıyorum. Daha sonra bu butonların ekrana yazıldığı fonksiyon da

......
    void DrawScreen(TScreen *aScreen){
TButton *local_button;
......
            local_button = (aScreen->Buttons[button_idx]);
            if (order == local_button->Order) {
                button_idx++;
                order++;
                DrawButton(local_button);
            }
......
        }
.......


yukarıda ki gibi "local_button = (aScreen->Buttons[button_idx]);" satırı ile her butona erişip ekrana yazdırıyorum.

Sorun ise şu; xc8 
ScreenKeyboard.Buttons = KeyboardButtons;
bu atamaya
pointer to pointer to const struct Button_t -> pointer to const pointer to struct Button_t
uyarısını veriyor. Program bazen saçmalıyor. Pointerler ile çalışıldığı için bişeyler yanlış belli. MikroC deki  doğru  karşılığı tanımlamayı çözemedim. Pointerler konusunda zayıfım.

CLR

#979
O uyarıda const hatası yaptığını söylüyor, anladığım kadarıyla, pointer olanı const pointer kullanmışsın, const struct olanıda sadece struct olarak kullanmışsın.
bu durumda pointer yerine, const pointer kullandıysan yeni adresleri point edemezsin, yani birkez atadıktan sonra değiştiremezsin.

sonuç olarak değişken tanımlama hatası var görünüyor, 

tüm uyarıları yok etmeden kullanmak programda açık var anlamına gelir
Knowledge and Experience are Power

kantirici

Alıntı yapılan: CLR - 13 Temmuz 2015, 02:29:09
sonuç olarak değişken tanımlama hatası var görünüyor, 


Evet hocam sorun orada da nedeni ve çözüm arayışım sürüyor.

CLR

Compiler'ın uyarıyı verdiği satırda kullandığın değişkenler ile atağın veya yarattığın değişkenlerin tamamen aynı type mı ona bakacaksın sadece. Cast işlemsel olarak kurtarıyorsa cast yaparsın veya type'lerini değiştirirsin.
Knowledge and Experience are Power

yldzelektronik

merhaba,

Bir konuyu öğrenmek istiyorum.

__attribute__((packed))
konusu.

Genel olarak bellekte verilerin hizalanmasıyla ilgili konu.Ancak biraz daha detaya girmek istiyorum..

Bana struct içindeki düzensiz tanımlamalarım için gerekti.Bu konuyu biraz açıklar mısınız?

Bir de uart spi gibi yerlerden veri gönderirken struct kullanmak üzerine konu vardı.Bu konudan bahsedebilir misiniz?Kullanan arkadaşlar nasıl yapıyorlar.Neler yapıyorlar. @z tartışacak güzel bir konu arıyordun.Bu konudan biraz bahseder misin?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mucit23

Aşağıdaki gibi bir tablom var

   float concrete_factor [4][4]={0.5800, 0.5825, 0.5850, 0.5900,  
                                       0.5500, 0.5600, 0.5700, 0.5800,  
                                       0.5200, 0.5400, 0.5600, 0.5800, 
                                       0.5100, 0.5150, 0.5200, 0.5250};


Bu tabloyu sprintf fonksiyonunda kullanıyorum aşağıdaki gibi.

sprintf(LCD_String,"%f ",concrete_factor[0][0]);

Fakat "Printf format type is invalid" hatası alıyorum.

Const tanımlamasam hata vermiyor. Acaba Sprintf fonksiyonu const tipi veriler kabul etmiyormu?

(Derleyici CCS C)


Gökhan BEKEN

LCD_String'i nasıl tanımladın? Char dizisi olmak zorunda benim bildiğim.
eğer char değilse şöyle yap
sprintf((char*)LCD_String,"%f ",concrete_factor[0][0]);
Özel mesaj okumuyorum, lütfen göndermeyin.

Mucit23

LCD string char dizisi. Normalde sıkıntı yok. Const veriyi yazdırmak istersem sıkıntı oluşuyor.

Birde Dizinin ilgili elemanı 0.5800 ise ekrana yazdırdığımda 0.5799 yazıyor.

CoşkuN

#986
CCS C kullanmadım ama derleyiciler const değişkenleri ROM'a yani flash belleğe kaydedebiliyorlar. Sorun burdan kaynaklanıyor muhtemelen.

https://www.ccsinfo.com/content.php?page=compiler-features

Note: The const qualifier in CCS always means that the data will be placed in program memory, and that the data is 'read-only'. It does not follow the ANSI definition which simply states that const is 'read-only'.

sovalye

Alıntı yapılan: Mucit23 - 20 Ağustos 2015, 14:25:31
LCD string char dizisi. Normalde sıkıntı yok. Const veriyi yazdırmak istersem sıkıntı oluşuyor.

Birde Dizinin ilgili elemanı 0.5800 ise ekrana yazdırdığımda 0.5799 yazıyor.
Hocam, işlemciler matematik yapmayı bilmedikleri için herşeyi basit nümerik yöntemle hesaplayıp bir süre sonra bulduğunu iddia ediyorlar. 25in kare kökü de bilgisayar için 4.999999 a eşit, genellikle 5 diyorlar ama 4.9999 bolca gördüm. Düzeltmek için genel bir yol bilmiyorum. Kendi kodunuza göre işlemler yapabilirsiniz. Küsüratın ulaşmadığı bir basamağınız varsa onu kontrol edebilirsiniz eğer o basamak 9 sa yuvarlama yaptırırsınız yada önce bütün sayıları 10000 ile çarpıp int e çevirdikten sonra string e çevirip daha sonra onu noktalı hale getirebilirsiniz.

OxfordBlue

pic18f4620

unsigned char LowByte=200; (Bunlar unsigned char olmak zorunda eeprom kullanımından dolayı)
unsigned char HighByte=5;
unsigned int FinalByte=0;

FinalByte=(HighByte*256+LowByte);


Ram belleği en az yorarak işlemi en kısa sürede tamamlayan kod örneği verebilirmisiniz?

Gökhan BEKEN

HighByte*256
kısmını
(HighByte<<8)&0xFF00
olarak değiştirmeniz yerinde olur.
Özel mesaj okumuyorum, lütfen göndermeyin.