Lcd ekran için menu algoritması?

Bence python bilgisayar tarafinda arayuz yaparken yada derleyici ile işgili otomasyonlar felan yazarken faydalı olabilir çünkü bilgisayarda kaynak bol ve bilgisayarı o işe adamıyoruz işimiz bitince kapatacağız o programı ama iş 50 centlik 1 dolarlık 2 dolarlık işlemcilere gelince donanımın suyunu sıkmak gerekiyor öyle ki hala c ile yazdıgı kodu sonra assemblyde düzenleyen veya bazı kritik fonksyonları assembly ile yazanlar var bol bol kullanırsak ne olur 1 dolar fazla verir üst işlemciye geçeriz sonra 10.000 tane sipariş gelir hem 10.000 doları çöpe atmış oluruz hem 10.000 dolar dovizi yurtdışına göndermiş oluruz hem de ihtiyacimizdan fazla elektronik atık üretmiş oluruz
kısa bilgi : udemy de falan kuantum çekirdek programlama ile ders almak istersen (geleceğin teknolojisi) python da içinde geliyor paket olarak
 
kısa bilgi : udemy de falan kuantum çekirdek programlama ile ders almak istersen (geleceğin teknolojisi) python da içinde geliyor paket olarak
Önce c yi ve mikrodenetleyici mimarilerini düzgün öğrenmek istıyorum sonrasında phyton bakabilirim
 
  • Beğen
Reactions: nt
Nesneye yönelik programlamanın en bereketli olduğu konudur kullanıcı arayüzü yazılımları. Tabi bu mutlaka C++ kullanacaksın anlamına gelmiyor, C dilinde de nesneye yönelik programlama yapılabiliyor. Benim şu anda çalıştığım ve C de yazılmış firmware'de şöyle bir "class" yapısı var.

@taydin , ben bu yapıyı anlayamadım. Şimdi adım adım gitsek olur mu?

Şöyle bir yapı kurdum :

C++:
typedef struct M_item
{
    char * itemHeader;      // menu öğesi başlığı
    char * prefix;          // menü öğesi ön eki (% gibi)
    char * itemText;        // menü öğresi metni
    char * suffix;          // menü öğresi son eki (TL Volt vs.)
    uint8_t screenType;     // hangi ekran tasarımında gösterilecek
    int8_t  step;           // öğe değerinin değişim adımı
    int64_t valMin;         // öğenin alabileceği en küçük değer (8byte)
    int64_t valMax;         // öğenin alabileceği en büyük değer
    int64_t valOld;         // öğenin mevcut değeri (yeni değer set edilmez ise eski değeri korumak için)
    int64_t valNew;         // öğenin mevcut değeri (yeni değer set edilmez ise eski değeri korumak için)
};


Bu yapıda menu öğelerinin özelliklerini saklamak istiyorum. Bu yapıyı kullanan bir sınıf yazdım. Oda şöyle olsun :

C++:
typedef class M_subMenu
{
    public:
    static int subMenuIndex;
    M_item item;
    int itemNum;
    M_subMenu() // yapıcı fonksiyon. Nesne oluşturulduğunda otomatik çağırılır.
    {
        subMenuIndex++;
        itemNum=subMenuIndex;
    }
};

bu sınıfın yapısı nasıl olmalı? Bu noktada kafam basmadı. Her menu öğesi için sınıftan bir nesne mi üreteceğim? Yoksa addItem gibi bir fonksiyon mu yazmalıyım...
 
Bu şekilde program çalışırken menü içeriklerini oluşturmak mantıklı değil. Menü yapısını statik olarak tanımlamak daha mantıklı. Mesela birçok GUI yazılımda tepede bulunan menüleri düşünelim. Buna nasıl bir class yapısı düşünebiliriz?

Aşağıda bir örnek var. Genel bir MENU class tanımlıyoruz ve menu_var dizisine bu menulerden istediğimiz kadar yerleştiriyoruz. Sonra da her menu'nün alt menülerini tanımlıyoruz. Herşey statik olarak yapılıyor. Program çalıştığı anda veri yapıları hazır olarak buluyor.

Buna ilave yapılması gereken, menu kutularını ekrana çizmek, klavye ve fare aksiyonlarına göre de hangi menu'nün seçildiği belirlemek (menu id). Sonra da bu menü seçiminin gereğini yapmak.

C++:
enum MENU_TYPES
{
    MTYPE_NONE,
    MTYPE_STR,
    MTYPE_SEP,
    MTYPE_SUB,
};

class MENU
{
public:
    int id;
    MENU_TYPES type;
    MENU* sub_menu;
    char name[100];
};


static MENU menu_file_export[] =
{
    {1, MTYPE_STR, 0, "Export to file"},
    {2, MTYPE_STR, 0, "Export to Dropbox"},
    {0, MTYPE_NONE, 0, 0},
};

static MENU menu_file[] =
{
    {3, MTYPE_STR, 0, "New"},
    {4, MTYPE_STR, 0, "Open"},
    {5, MTYPE_SEP, 0, 0},                 // ayirici yatay çizgi
    {6, MTYPE_STR, 0, "Print"},
    {0, MTYPE_SUB, menu_file_export, "Export"},
    {7, MTYPE_STR, 0, "Exit"},
    {0, MTYPE_NONE, 0, 0},
};

static MENU menu_edit[] =
{
    {8, MTYPE_STR, 0, "Undo"},
    {9, MTYPE_STR, 0, "Redo"},
    {10, MTYPE_SEP, 0, 0},                 // ayirici yatay çizgi
    {11, MTYPE_STR, 0, "Cut"},
    {12, MTYPE_STR, 0, "Copy"},
    {13, MTYPE_STR, 0, "Paste"},
    {0, MTYPE_NONE, 0, 0},
};

static MENU menu_bar[] =
{
    {0, MTYPE_SUB, menu_file, "File"},
    {0, MTYPE_SUB, menu_edit, "Edit"},
    {0, MTYPE_NONE, 0, 0},
};

int main()
{
}
 
@taydin,

Kendi kafamda bir mantık kurdum ama takıldığım bir nokta daha var. kod şöyle:
C++:
struct ItemText
{
    char *itemHeader;      // menu öğesi başlığı
    char *valText1;        // "Açık" "kapalı" gibi metinbazlı ayarlar için
    char *valText2;        // "Açık" "kapalı" gibi metinbazlı ayarlar için
};


ItemText ayarlar[]=
{
    {"1 Nolu menu",  "Ayar1",    "Ayar2" },
    {"1 Nolu menu",  "Ayar1",    "Ayar2" },
    {"1 Nolu menu",  "Ayar1",    "Ayar2" }

};

struct Item
{
    byte itemNumber;       
    ItemText *text;
    uint8_t screenType;     // hangi ekran tasarımında gösterilecek
    int8_t  step;           // öğe değerinin değişim adımı
    int64_t valMin;         // öğenin alabileceği en küçük değer (8byte)
    int64_t valMax;         // öğenin alabileceği en büyük değer
    int64_t valOld;         // öğenin mevcut değeri (yeni değer set edilmez ise eski değeri korumak için)
    int64_t valNew;         // öğenin mevcut değeri (yeni değer set edilmez ise eski değeri korumak için)
};

ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] uyarısını alıyorum. Kod çalışıyor ama uyarı almak canımı sıkıyor. ItemText yapısındaki karakter dizilerine boyut tanımlarsam sorun ortadan kalkıyor ama bunu yapmak gereksiz hafıza kaybı gibi geliyor. yapıdan oluşturduğun diziyi const olarak tanımlamayı denedim bir şey değişmedi. Bu uyarıdan nasıl kurtulabilirim.?
 
tamam böyle çözüldü...

C++:
struct ItemText
{
    const char *itemHeader;      // menu öğesi başlığı
    const char *valText1;        // "Açık" "kapalı" gibi metinbazlı ayarlar için
    const char *valText2;        // "Açık" "kapalı" gibi metinbazlı ayarlar için
};


const ItemText ayarlar[]=
{
    {"1 Nolu menu",  "Ayar1",    "Ayar2" },
    {"1 Nolu menu",  "Ayar1",    "Ayar2" },
    {"1 Nolu menu",  "Ayar1",    "Ayar2" }

};
 
Sabit string'ler "read only" bir bölümde tanımlanır derleyici tarafından. Dolayısıyla onlara erişecek bütün pointer'ların "const" olması şart.
 
C/C++ a yeni başladığın için sana şöyle bir stil önerisinde bulunayım: Pointer tanımlarken, yıldızı değişkene değil de tiplere dayamak bana daha mantıklı geliyor, çünkü o yıldız esasında tip tanımının bir parçası, değişkenin değil. Ama piyasada iki form da kullanılıyor, sana hangisi mantıklı geliyorsa o şekilde devam et.

Kod:
// bütün tip bilgileri solda, değişken sağda, herşey net
const char*     sade_tost;

// tip bilgileri hem solda, hem sağda, fazla karışık
const char      *karisik_tost;
 
C/C++ a yeni başladığın için sana şöyle bir stil önerisinde bulunayım: Pointer tanımlarken, yıldızı değişkene değil de tiplere dayamak bana daha mantıklı geliyor, çünkü o yıldız esasında tip tanımının bir parçası, değişkenin değil. Ama piyasada iki form da kullanılıyor, sana hangisi mantıklı geliyorsa o şekilde devam et.

Kod:
// bütün tip bilgileri solda, değişken sağda, herşey net
const char*     sade_tost;

// tip bilgileri hem solda, hem sağda, fazla karışık
const char      *karisik_tost;
Böyle düşününce mantıklı ama ben "ampersand" nerede yıldız orada mantığını benimsedim galiba...

Mesela :
C++:
bool OutputFunctionSelect(byte &OUT_FUNCTION)

Bu durumda "&" işareti sence solda mı yoksa sağda mı mantıklı?
 
& da tipin bir parçası

C++:
#include <stdio.h>

static int degisken = 10;

int main()
{
    int& ref = degisken;

    printf("&degisken = %p, ref = %p\n", &degisken, &ref);
}
 
Yine bir noktada takıldım...

C++:
// Menu 2
Item Kumanda_Ayarlari[] =
{  // No.  Title                Text      ekran   artış   min     maks    old   new 
    {  1, "Kumanda Ekle",       textVal,    1,      1,      0,      1,      0,    0   },
    {  2, "Kumanda Sil",        textVal,    1,      1,      0,      1,      0,    0   },
    {  3, "Hepsini Sil",        textVal,    4,      1,     -1,    240,      0,    0   },
};

Kumanda_Ayarlari[] dizisinde 3 eleman var ama bunu nasıl tespit etmeliyim. Normal dizilerde kullandığım sizeof(dizi)/sizeof(dizi[0]); şeklindeki tespit işe yaramıyor.
 
Yine bir noktada takıldım...

C++:
// Menu 2
Item Kumanda_Ayarlari[] =
{  // No.  Title                Text      ekran   artış   min     maks    old   new
    {  1, "Kumanda Ekle",       textVal,    1,      1,      0,      1,      0,    0   },
    {  2, "Kumanda Sil",        textVal,    1,      1,      0,      1,      0,    0   },
    {  3, "Hepsini Sil",        textVal,    4,      1,     -1,    240,      0,    0   },
};

Kumanda_Ayarlari[] dizisinde 3 eleman var ama bunu nasıl tespit etmeliyim. Normal dizilerde kullandığım sizeof(dizi)/sizeof(dizi[0]); şeklindeki tespit işe yaramıyor.

Bu yöntem işe yarıyormuş... Ben biraz daha karmaşık birşeyler denediğim için hata yapıyormuşum...
 

Forum istatistikleri

Konular
5,844
Mesajlar
99,694
Üyeler
2,481
Son üye
rfdog12

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top