Fonksiyon icindeki dizi isimlerin Değiştirilmesi.

Başlatan M_B, 08 Kasım 2016, 16:31:49

M_B

Merhabalar;
Resmi ve Kodu şimdi ekleyebildim.
MenuRes.h
const code char Ayar[100] = {
  0,   0,   0, 248,  68,  68,  68, 248,   0,  28,  32, 192,  32,  28,   0, 248,  68,  68,  68, 248,   0, 252,  36,  36, 100, 152,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
  0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
};

const code char Ayar_i[100] = {
255, 255, 255,   7, 187, 187, 187,   7, 255, 227, 223,  63, 223, 227, 255,   7, 187, 187, 187,   7, 255,   3, 219, 219, 155, 103, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 
  3,   3,   3,   2,   3,   3,   3,   2,   3,   3,   3,   2,   3,   3,   3,   2,   3,   3,   3,   2,   3,   2,   3,   3,   3,   2,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3
};

const code char Cikis[100] = {
  0,   0,   0, 248,   4,   4,   4, 136,   0,   0,   4, 252,   4,   0,   0, 252,  32,  80, 136,   4,   0,   0,   4, 252,   4,   0,   0, 152,  36,  36,  36, 200,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
  0,   0,   0,   0,   1,   1,   1,   0,   0,   0,   1,   1,   1,   0,   0,   1,   0,   0,   0,   1,   0,   0,   1,   1,   1,   0,   0,   0,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
};

const code char Cikis_i[100] = {
255, 255, 255,   7, 251, 251, 251, 119, 255, 255, 251,   3, 251, 255, 255,   3, 223, 175, 119, 251, 255, 255, 251,   3, 251, 255, 255, 103, 219, 219, 219,  55, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 
  3,   3,   3,   3,   2,   2,   2,   3,   3,   3,   2,   2,   2,   3,   3,   2,   3,   3,   3,   2,   3,   3,   2,   2,   2,   3,   3,   3,   2,   2,   2,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3
};

const code char Manuel[100] = {
  0,   0,   0, 252,   8,  16,   8, 252,   0, 248,  68,  68,  68, 248,   0, 252,   8,  16,  32, 252,   0, 252,   0,   0,   0, 252,   0, 252,  36,  36,  36,   4,   0, 252,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
  0,   0,   0,   1,   0,   0,   0,   1,   0,   1,   0,   0,   0,   1,   0,   1,   0,   0,   0,   1,   0,   0,   1,   1,   1,   0,   0,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
};

const code char Manuel_i[100] = {
255, 255, 255,   3, 247, 239, 247,   3, 255,   7, 187, 187, 187,   7, 255,   3, 247, 239, 223,   3, 255,   3, 255, 255, 255,   3, 255,   3, 219, 219, 219, 251, 255,   3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 
  3,   3,   3,   2,   3,   3,   3,   2,   3,   2,   3,   3,   3,   2,   3,   2,   3,   3,   3,   2,   3,   3,   2,   2,   2,   3,   3,   2,   2,   2,   2,   2,   3,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3
};

const code char Program[100] = {
  0,   0,   0, 252,  36,  36,  36,  24,   0, 252,  36,  36, 100, 152,   0, 248,   4,   4,   4, 248,   0, 248,   4,  36,  36, 232,   0, 252,  36,  36, 100, 152,   0, 248,  68,  68,  68, 248,   0, 252,   8,  16,   8, 252,   0,   0,   0,   0,   0,   0, 
  0,   0,   0,   1,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   1,   1,   1,   0,   0,   0,   1,   1,   1,   1,   0,   1,   0,   0,   0,   1,   0,   1,   0,   0,   0,   1,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0
};

const code char Program_i[100] = {
255, 255, 255,   3, 219, 219, 219, 231, 255,   3, 219, 219, 155, 103, 255,   7, 251, 251, 251,   7, 255,   7, 251, 219, 219,  23, 255,   3, 219, 219, 155, 103, 255,   7, 187, 187, 187,   7, 255,   3, 247, 239, 247,   3, 255, 255, 255, 255, 255, 255, 
  3,   3,   3,   2,   3,   3,   3,   3,   3,   2,   3,   3,   3,   2,   3,   3,   2,   2,   2,   3,   3,   3,   2,   2,   2,   2,   3,   2,   3,   3,   3,   2,   3,   2,   3,   3,   3,   2,   3,   2,   3,   3,   3,   2,   3,   3,   3,   3,   3,   3
};



main.c
#include <stdio.h>
#include "hardware.h"
#include "MenuRes.h"


#define INVERT 2
#define CLEAR  0
#define BLACK  1
#define EkranSil Glcd_Fill(0x00)        // ekran temizlendi


sbit YUKARI at RA0_bit;
sbit ASAGI at  RA1_bit;
sbit SAG   at  RA2_bit;
sbit SOL   at  RA3_bit;
sbit ENTER at  RA4_bit;


char Diziler[]={Program, Program_i, Manuel,Manuel_i,Ayar,Ayar_i,Cikis,Cikis_i};



void Cerceve(void);



 char *Menu[]=
{
  "           MENU         ",
  "    PROGRAM             ",
  "    MANUEL              ",
  "    AYAR                ",
  "    CIKIS               ",
  "                        "
};


 char *PrgMenu[]=
{
  "        PROGRAM         ",  // 0
  "  PROGRAM -1            ",  // 1
  "  PROGRAM -2            ",  // 2
  "  PROGRAM -3            ",  // 3
  "  PROGRAM -4            ",  // 4
  "  PROGRAM -5            ",  // 5
  "  CIKIS                 ",  // 6
  "                        "   // 7
};



void main() {

  ADCON1 |= 0x0F;         // AN pinleri dijital giriş/çıkış
  CMCON  |= 7;            // komparatörler disable edildi
  TRISA=0x1F;
  Glcd_Init();            // KS108 GLCD yapılandırıldı
  Glcd_Fill(0x00);        // ekran temizlendi
  Glcd_Write_Text("    MENU UYGULAMA  ", 0, 0, 1);      // text ekrana
  Glcd_Write_Text("  Test . ver.1 ", 0, 3, 1);          // gönderiliyor
  Glcd_Write_Text("                      ", 0, 7, 1);      //
  Delay_ms(1000);
  Glcd_Fill(0);                 // Ekrani siliyor

  Glcd_Write_Text_Adv(Menu[0], 28, 0);  // Yazi  22
  Cerceve();

  // Glcd_PartialImage(22, 13, 50, 10, 50, 10, Program_i);
  Glcd_PartialImage(22, 13, 50, 10, 50, 10, Diziler[1]);
  Glcd_PartialImage(22, 26, 50, 10, 50, 10, Manuel);
  Glcd_PartialImage(22, 39, 50, 10, 50, 10, Ayar);
  Glcd_PartialImage(22, 52, 50, 10, 50, 10, Cikis);

  while(1) {
            Delay_ms(50);
           }
}



/******************************************************************************/
 void Cerceve(void){
  Glcd_Box(0, 0,126, 9, 2);               // dikdortgen. 18->0 oldu
  Glcd_Box(0, 11, 126, 11, 2);           // ince cizgi   100->126  oldu
}
/****************************************************************************/


Glcd_PartialImage(22, 13, 50, 10, 50, 10, Program_i);
  Glcd_PartialImage(22, 26, 50, 10, 50, 10, Manuel);
  Glcd_PartialImage(22, 39, 50, 10, 50, 10, Ayar);
  Glcd_PartialImage(22, 52, 50, 10, 50, 10, Cikis);

Ekran Goruntusu:



@mufitsozen Hocanın ornegine göre kod ve ekran goruntusu.
Glcd_PartialImage(22, 13, 50, 10, 50, 10, Diziler[1]);
  Glcd_PartialImage(22, 26, 50, 10, 50, 10, Manuel);
  Glcd_PartialImage(22, 39, 50, 10, 50, 10, Ayar);
  Glcd_PartialImage(22, 52, 50, 10, 50, 10, Cikis);

Ekran Goruntusu.


Not: Eger
char *Diziler[]={Program, Program_i, Manuel,Manuel_i,Ayar,Ayar_i,Cikis,Cikis_i};
Seklinde Tanımlarsam Asağıdaki hatayı alıyorum.
Hata almamak icin ise
char  Diziler[]={Program, Program_i, Manuel,Manuel_i,Ayar,Ayar_i,Cikis,Cikis_i};
  (pointersiz)Tanımlarsam üst kısımda göstermıs olduğum göruntu cıkıyor.



İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

mufitsozen

Alıntı yapılan: M_B - 10 Kasım 2016, 22:56:01

char *Diziler[]={Program, Program_i, Manuel,Manuel_i,Ayar,Ayar_i,Cikis,Cikis_i};
Seklinde Tanımlarsam Asağıdaki hatayı alıyorum.
Hata almamak icin ise


hangi hatayi aldiginiz eklememissiniz.

Glcd_PartialImage tanimi asagidaki gibi, gordugunuz gibi type mismatch var, cast etmek yada tanimlari ona gore degistirmek gerek. (bunu da daha once belirtmistik ama herhalde tam olarak anlasilmadi)

Prototype :  void Glcd_PartialImage(unsigned int x_left, unsigned int y_top, unsigned int width, unsigned int height, unsigned int picture_width, unsigned int picture_height, code const unsigned short * image);
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

M_B

Hocam aldıgım hata;
Alıntı Yap
error: 19   319   Cannot cast '' to ''   main_v5.c
error: 19   325   Too many initializers   main_v5.c
error: 69   384   Illegal pointer conversion   main_v5.c
error: 0   102   Finished (with errors): 10 Nov 2016, 22:30:17   menu.mcppi
Alıntı YapGlcd_PartialImage tanimi asagidaki gibi, gordugunuz gibi type mismatch var, cast etmek yada tanimlari ona gore degistirmek gerek. (bunu da daha once belirtmistik ama herhalde tam olarak anlasilmadi)
evet hocam anlayamamısım.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

mufitsozen

Alıntı yapılan: M_B - 10 Kasım 2016, 23:37:53
evet hocam anlayamamısım.

sayin @M_B Onemli degil, bazen boyle seyler gozden kacabiliyor, hepimizin yaptigi hatalar bunlar.

Gordugunuz gibi fonksiyondaki parametre code const unsigned short * ama biz char * degisken kullaniyoruz.  Cast yaparak yada orijinal tanimlar uzerinde degisiklik yaparak cozulebilir zannediyorum.

Daha once belirttigim gibi bende sizin kullandiginiz derleyici yok, onun icin ben deneyemiyorum. Lutfen siz deneyiniz.
ornegin once unsigned short * cast kullanin, olmazsa diger secenekleri denersiniz.
Kolay gelsin.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

JOKERAS

Müfit Sözen Abi gibi bir Üstadın sözü üzerine söz söylenirmi bilmiyorum.
Geçen söyledim Karizma gitti.Zaten yoktu, o da ayrı mesele:)
Ama Dayanamayacağım söyleyeceğim,belki bu sayede asılmaktan kurtulurum:)
O gün bu gün kafamı meşgul ediyor bu konu,bazı araştrımalar yaptım.
Sanırım sıkıntı şu.

Sizin dizileriniz (const code char *) türünde.Dizi Adresleri Rom'da çakılı.Run Time'da değiştirilemez!
Değiştirilir de verimsiz kod yazıp değiştirmek istemiyoruz diyelim.

Siz bu diziyi (char *) türündeki  göstericileri gösteren char *Diziler[MAX]; dizisine aktarıyorsunuz.
Burada sorun var demektir.Tür uyuşmazlığı.

Bu şartlarda *Diziler[] = {Ayar, Ayar_i, Program, Program_i ...}; Hata vermesi normal.
Çünki Gösterici dizisinin her elemanı, Ayar, Ayar_i, Program,Program_i vs (const code char *) türünde.
char *Diziler[]; Adlı göstericileri gösteren dizi ise (char *) türünde.

Bu durumda Gösterici dizisinin her elemanı (char *) türüne Type Cast yapılmalı.

Örnek;
Char *Diziler[] = {(char *) Ayar,  (char *) Ayar_i,   (char *) Program,  (char *) Program_i ...}; gibi.
Bu şekilde derleyip deneyin,derleme hatası vermemesi lazım.

Eğer derliyor hata vermiyorsa sonraki adımda 
Glcd_PartialImage(22, 13, 50, 10, 50, 10, (code const unsigned short * ) Diziler[Idx]);

Başka yöntemlerle de yapılabilinir.

Derleyiciler de  "#pragma romdata", "rom section" , "Linker" " @" vs gibi  Memory Alocation yapan yer belirliyicileri oluyor.
Sizin Derleyicinin şeysini bilmiyorum,bir araştırıp daha verimli hale getirilebilinir.

Müfit abi,yamak usta,inşallah bu sefer çuvallamamışımdır:)



M_B

@mufitsozen hocam;
Sayenizde hem yeni bir şey öğrenmiş ve problemi cözmüş oluyorum. Teşekker Ederim.

fonksiyon icine gönderilecek dizinin fonksiyonun icinde tanımlanan tipte olması gerekiyormuş.
fonksiyonu kullanırken hic aklıma gelmemişti.

Birde hocam burda kullandığımız mantıgı düşünsem aklıma gelmezdi. Diziler icerisine onceden tanımlanmış dizilerin adresini koymak.

  const unsigned short  *Diziler[] =

Yapınca sorun cozulmuştur.

Tekrardan  Yardımcı olan/olmak isteyen arkadaşlara teşekkürler
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

yamak

Hocam sizdeki sorun typecast sorunu olmamasi lazim. Cunku run time da hata oldugunu soyluyosunuz. Eger typecast ile ilgili bi problem olsaydi hatayi compile time da almis olmaniz lazimdi.
const unsigned short* Diziler[] yerine char* Dizilier[] diye tanimlarsaniz olmuyo mu.
Yukarida char Diziler[] diye tanimlamistiniz. Sizin sorun asil bundan kaynaklaniyo olabilir.

mufitsozen

Alıntı yapılan: yamak - 13 Kasım 2016, 17:50:57
Hocam sizdeki sorun typecast sorunu olmamasi lazim. Cunku run time da hata oldugunu soyluyosunuz. Eger typecast ile ilgili bi problem olsaydi hatayi compile time da almis olmaniz lazimdi.
const unsigned short* Diziler[] yerine char* Dizilier[] diye tanimlarsaniz olmuyo mu.
Yukarida char Diziler[] diye tanimlamistiniz. Sizin sorun asil bundan kaynaklaniyo olabilir.

Sayin @yamak, @M_B zaten hatanin derleme sirasinda oldugunu soylemisti diye hatirliyorum (run-time'da bu sekilde bir type mismatch almis olamaz zaten).

Yani hata run-time'da degil.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

#23
Alıntı yapılan: M_B - 13 Kasım 2016, 17:13:32
@mufitsozen hocam;
Sayenizde hem yeni bir şey öğrenmiş ve problemi cözmüş oluyorum. Teşekker Ederim.

fonksiyon icine gönderilecek dizinin fonksiyonun icinde tanımlanan tipte olması gerekiyormuş.
fonksiyonu kullanırken hic aklıma gelmemişti.

Birde hocam burda kullandığımız mantıgı düşünsem aklıma gelmezdi. Diziler icerisine onceden tanımlanmış dizilerin adresini koymak.

  const unsigned short  *Diziler[] =

Yapınca sorun cozulmuştur.

Tekrardan  Yardımcı olan/olmak isteyen arkadaşlara teşekkürler

Birsey degil. Aslinda C dilini ogrenmekte biraz daha derinlestiginizinde gostergesi bu. C lisaninin yazim ve kullanim sekillerinden bir adim sonrasinda ogrenilmesi gereken konulardan birisi budur.

Bu bahis type conversion diye gecer (baska dillerdede ayni baslik vardir) implicit ve explicit diye iki ayri cesidi vardir. C derleyicisinin kullandigi implicit kurallari bilmemekten dolayi cesitli sekillerde hatalarla karsilasabilirsiniz.

Bu konu hakkinda daha ayrintili bilgi sahibi olmak icin duzgun bir kaynaktan biraz calismak lazim.

Ben ilk denememde su iki linki buldum. Bos bir vaktinizde bunlari okuyup ornek durumlari kendinizde kucuk bir kac program yazarak denemenizde fayda var.

https://www.safaribooksonline.com/library/view/c-in-a/0596006977/ch04.html

http://clanguagebasics.com/c-language-tutorial/c-type-conversion-implicit-explicit-type-conversion-in-c/

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

Alıntı yapılan: JOKERAS - 13 Kasım 2016, 16:05:13
Müfit Sözen Abi gibi bir Üstadın sözü üzerine söz söylenirmi bilmiyorum.
Geçen söyledim Karizma gitti.Zaten yoktu, o da ayrı mesele:)
Ama Dayanamayacağım söyleyeceğim,belki bu sayede asılmaktan kurtulurum:)
O gün bu gün kafamı meşgul ediyor bu konu,bazı araştrımalar yaptım.
Sanırım sıkıntı şu.
...............
Müfit abi,yamak usta,inşallah bu sefer çuvallamamışımdır:)

Bir miktar eksik ve/veya yanlis yorum var ama cuvallama demiyelimde kafa karisikligi diyelim, konu kapansin  :D
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

JOKERAS

Müfit Abi,bu verdiğim yöntemde yanlışlık varmı?

const code char Adizisi[10];
const code char Bdizisi[10];
const code char Cdizisi[10];
Bunlar Rom'da.

char *Diziler[] = {Adizisi, Bdizisi, Cdizisi};

Şimdi burada bunu yaptığımızda  Dizinin her elemanı (const code char *) türünde birer gösterici olduğuna göre
ve  "char *Diziler[];"  dizisi ise (char *) Türünde ise dolayısı ile Tür uyuşmazlığı çıkacak.

M_B, Romdaki dizilerin dağınık başlangıç adreslerini ardışıl hale getirmek istiyor sanırım.
Bunun içinde  Ram memoryde " char *Diziler[]; " adlı dizi açtık ve Romdaki dizi adreslerini Bu diziye (char *) türüne cast ederek
adreslerini geçirdik.
char *Diziler[]; adlı dizinin her elemanı Romdaki dizilerin adreslerini gösteriyor.
Göstericleri gösteren Dizi.

Basarkende,  func(  (code const unsigned short * )  Diziler[Idx]);

Fonksiyon parametresindeki türe dönüştürüp basmış oluyoruz.
Yaptığımız bu yöntemi biz Ram üzerinde yaptık,Bu yöntem Run Time'da kullanılabilinir.

M_B ustanın son yaptığı ise bizim Tür dönüşümleri yaparak Ram'de yaptğımız işlemi
Yine Rom'da bir dizi açarak yapmış oldu.Bu sayede Tür dönüşüm işlemleriyle uğraşmamış oldu.
Ama bu tip yapı Sadece derleme aşamasında kod üretecek diye düşünüyorum.
Diyorum ve sizden onay aldıktan sonra konuyu kapalım diyorum:)Ne dersiniz?









yamak

Alıntı yapılan: mufitsozen - 13 Kasım 2016, 18:03:27
Sayin @yamak, @M_B zaten hatanin derleme sirasinda oldugunu soylemisti diye hatirliyorum (run-time'da bu sekilde bir type mismatch almis olamaz zaten).

Yani hata run-time'da degil.
Hocam siz soyleyince tekrar baktim. char* seklinde tanimlayinca compiler error vermis sonra da char diziler[] seklinde tanimlamis ve hatasiz bi sekilde derlenmis ve dogal olarakta run timeda hata almis.Y ani haklisiniz hocam
Ama derleyinin char* i degil de char i kabul etmesi ilginc olmus.