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...
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,950
Mesajlar
118,747
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top