Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => C/C++ => Konuyu başlatan: M_B - 08 Kasım 2016, 16:31:49

Başlık: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: M_B - 08 Kasım 2016, 16:31:49
Merhabalar;

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
};


Şeklinde elimde 5  tane farklı isimde dizim var.


Glcd_PartialImage(0, 10, 50, 10, 50, 10, Program);


Şeklinde Ekrana resim basan fonksiyonum var. ( mikroC )
for dongusu yardımıyla Program yazan yerdeki dizi ismini nasıl değiştirebilirim.
Şimdilik şu şekilde yapıyorum


Glcd_PartialImage(0, 10, 50, 10, 50, 10, Program);
Glcd_PartialImage(0, 23, 50, 10, 50, 10, Manuel);
Glcd_PartialImage(0, 36, 50, 10, 50, 10, Ayar);
Glcd_PartialImage(0, 49, 50, 10, 50, 10, Cikis);


Farkli bir başka yolu var mı ? Yapı falan kullanarak.

Teşekkürler.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: mufitsozen - 08 Kasım 2016, 16:54:46
#include <stdio.h>

char Bir[] ={'B','i','r','\0'};
char Iki[] ={'I','k','i','\0'};
char Uc [] ={'U','c','\0'};
char Dort[]={'D','o','r','t','\0'};

char *Diziler[]={Bir, Iki, Uc, Dort};


int main(void) {

int ndx;

printf("\n Hello World!\n");

printf("\n\%s", Bir);
printf("\n\%s", Iki);
printf("\n\%s", Uc);
printf("\n\%s", Dort);

printf("\n for icinde \n");
for(ndx=0; ndx<4; ndx++){
printf("\n%s", Diziler[ndx]);
}

printf("\n --O--\n");
return 0;
}


Alıntı YapHello World!

Bir
Iki
Uc
Dort
for icinde

Bir
Iki
Uc
Dort
--O--
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: M_B - 09 Kasım 2016, 08:30:01
@mufitsozen Hocam;
Örnek için Teşekkür ederim.

Yalnız mikroC
Glcd_PartialImage(0, 23, 50, 10, 50, 10, Manuel); bu fonksiyonda yonteminizi kabul etmedi. :(
Baska bir cözüm yolu var mıdır.

Not: Diyeceksin ki mikroC yi bırak haklısınız. İlerde XC8 'e gececem.

Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: mufitsozen - 09 Kasım 2016, 10:26:17
Alıntı yapılan: M_B - 09 Kasım 2016, 08:30:01
@mufitsozen Hocam;
Örnek için Teşekkür ederim.
Yalnız mikroC
Glcd_PartialImage(0, 23, 50, 10, 50, 10, Manuel); bu fonksiyonda yonteminizi kabul etmedi. :(
Baska bir cözüm yolu var mıdır.

Birsey degil!

Basit bir teknik oldugu ve pointer kullanimi icin bir ornek oldugu icin yardim etmek istedim. Tesekkur edilecek kadar ciddi bir konu degil gercekten.

Bende mikroC olmadigi icin onun ile denemedim, generic bir C compiler ile denedim ornek programi. Bununla birlikte sorunun mikroC'den kaynaklandigini zannetmiyorum. Tahminimce kullanilan fonksiyonun tanimi ile uyusmayan bir yazim vardir vede cast kullanarak yada dizi tanimlarinda kucuk degisiklikler yapilarak sorun cozulebilir.

ilk cikan prblemde pes etmeyiniz. Sorun kullandiginiz araclarda degil. Forumlarda soru cevap hap gibi cozum saglamak tabii cok kolay degil. Keske butun programinizi ve derledikten sonra cikan hata mesajinida yazsaydiniz sizinde benimde vaktim israf olmazdi.

Alıntı yapılan: M_B - 09 Kasım 2016, 08:30:01
@mufitsozen Hocam;

Not: Diyeceksin ki mikroC yi bırak haklısınız. İlerde XC8 'e gececem.

Hayir demem, yukarda bahsettigim gibi sorunun su yada bu derleyici markasindan kaynakladigini dusunmuyorum. Burada kullanilacak teknikler o kadar temel bahislerle ilgili ki hangi derleyici kullanilsa bir prb cikmadan calisacaktir.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: Klein - 09 Kasım 2016, 12:49:47
Alıntı yapılan: M_B - 09 Kasım 2016, 08:30:01
@mufitsozen Hocam;
Örnek için Teşekkür ederim.

Yalnız mikroC
Glcd_PartialImage(0, 23, 50, 10, 50, 10, Manuel); bu fonksiyonda yonteminizi kabul etmedi. :(
Baska bir cözüm yolu var mıdır.
Muhtemelen typecasting sorunudur. Verdiği hata nedir?
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: M_B - 09 Kasım 2016, 13:16:37
Hocalarim hata vermiyor derliyor ama ekrana yazmiyor. Akşam tam kodu ve ekran goruntusunu  ekleyecem.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: JOKERAS - 09 Kasım 2016, 13:28:25
M_B,
Eğerki Dizi tanımlamanız Yukarıdaki gibiyse "const code char Program[100];"  bu dizi ismini değiştiremezsiniz.
Sizin diziniz "const", Dolayısı ile Rom'da yer alıyor.
Bunu Run Time'da değiştirmenin tek yolu FlashWrite işlemi.
Dizinin Romda'ki başlangıç adresini bulup, FlashWrite Fonksiyonunun adres parametresine geçirip
değiştrebilirsiniz.


Sanırım siz dizilerin Ram'da yer kaplamaması için Rom'da saklıyorsunuz.
Bu sorun için dinamik dizileri incelemelisiniz.
Tabii burada şöyle bir sıkıntı olacak,dinamik dizi işlemi Hızdan yer.
Ya hızı yada Alanı tercih etmek zorundasınız.
Ne kadar Ekmek O kadar Köfte:)

const'u kaldırıp deneyin.

Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: yamak - 09 Kasım 2016, 13:39:44
Alıntı yapılan: JOKERAS - 09 Kasım 2016, 13:28:25
M_B,
Eğerki Dizi tanımlamanız Yukarıdaki gibiyse "const code char Program[100];"  bu dizi ismini değiştiremezsiniz.
Sizin diziniz "const", Dolayısı ile Rom'da yer alıyor.
Bunu Run Time'da değiştirmenin tek yolu FlashWrite işlemi.
Dizinin Romda'ki başlangıç adresini bulup, FlashWrite Fonksiyonunun adres parametresine geçirip
değiştrebilirsiniz.


Sanırım siz dizilerin Ram'da yer kaplamaması için Rom'da saklıyorsunuz.
Bu sorun için dinamik dizileri incelemelisiniz.
Tabii burada şöyle bir sıkıntı olacak,dinamik dizi işlemi Hızdan yer.
Ya hızı yada Alanı tercih etmek zorundasınız.
Ne kadar Ekmek O kadar Köfte:)

const'u kaldırıp deneyin.
Hocam dizi isminin değiştirlemesi compile time'da yapılan bişey neden değiştiremesin.
Ayrıca cont array i flash write ile de değiştirmek o kadar kolay değil.Ancak array'i linker direktifleri ile program memory nin dışında bir sektöre yazarsanız olur.Aksi taktirde programın bulunduğu sektörü de silmeniz gerekir.Ya da array değiştirmek istediğiniz elemanı ilk başta FF olur sektör silme ihtiyacı olmadan bir kereye mahsus değiştirebilirsiniz.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: JOKERAS - 09 Kasım 2016, 14:10:23
Compile Time derken?
const diziyi değiştirmek kolay değil tabiki,belli bir prosedürü var.
Adresi ve uzunluğu biliniyorsa önce bellekteki veri kopyalanır,değişiklik yapılacak kısım değiştirildikten sonra
geriye yazılır.
Tabii bu işi sorunsuz yapmak için Rom'un uzak,kullanılamayan bir bölgesi Compile Time'da
dizinin yerleşeceği adres bölgesi link edilir.
Pgm'ı yazan vatandaş işlemcinin Rom'unu kodu yazdıktan sonra inceleyip ona göre adres belirlemeli.
Bir de Alingment olayı var tabii,Rom sectörleri Rom page yapısına denk getirilmeli.

M_B ustanın yapmak istediği şu sanırım.
Bir fonksiyon ile sadece ilgili dizinin ismini değiştirerek basmak.

Bunun için şu şekilde bir yöntem izlenebilinir.
Dizilerimiz yine Rom'da yer alır,ilgili dizi önce Ram'e keş edilip sonra basılır.
Bu biraz zaman alır.Bence önemi olamayan bir zaman.
Hatta bu işi yapan fonksiyon da vardı,öyle hatırlıyorum.
pgm2ram(char*Rom, char *Ram); gibi.





Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: yamak - 09 Kasım 2016, 14:18:22
Alıntı YapCompile Time derken?
Derleme zamanı hocam.
Run time da dizi ismi değiştirmekten kastettiğiniz şey nedir?Adresini değiştirmek falan mı?

Edit:
Soruda sorulmak istenen
Glcd_PartialImage(0, 10, 50, 10, 50, 10, Program);
Kodunu tekrarlamadan sadece array i değiştirerek ekrana istenilen şeyin basılması.Bu da @mufitsozen in yöntemiyle olur.
Yani const olup olmamasıyla bunun bi alakası yok.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: JOKERAS - 09 Kasım 2016, 14:36:19
Yamak usta,valla kafam karıştı.
Bir saniye.Düşünüyorum...

Şimdi M_B usta derki ben Rom'a çaktığım dizilerin isimlerini değiştirmek istiyorum.
Bu ne demek?Önce bunu anlamak lazım.
Dizi isimleri birer adres olduğuna göre,sırayla çağrılıp basılabilinir.
Bunun için bu kadar atraksyona da gerek yok o zaman.



Edit:
Soruda sorulmak istenen
Glcd_PartialImage(0, 10, 50, 10, 50, 10, Program);
Kodunu tekrarlamadan sadece array i değiştirerek ekrana istenilen şeyin basılması.Bu da @mufitsozen in yöntemiyle olur.
Yani const olup olmamasıyla bunun bi alakası yok.

El birliğiyle tongaya düşürdünüz beni
.
Evet yamak usta haklısın.
Ben soruyu yanlış anlamışım.
Var olanının adresini-İsmini değiştir al bas.Hepsi bu.

M_B usta,kusura bakmayasın,sorunuzu yanlış anlamışım.

Pgm memory'inin içine bakıp dizi adreslerini bir diziye alıp sırayla basın.
müfitsözen ustanın yaptğı yöntemi yalandan yere uzatma taktiği:)

Ne yapalım çuvalladım toparlamaya çalışıyorum:)Yerseniz!







Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: yamak - 09 Kasım 2016, 14:39:20
Hocam dizi ismi değiştirmek derken
Glcd_PartialImage fonksiyonun son parametresini değiştirmekten bahsetmiş arkadaş.Yani @mufitsozen in dediği gibi öncesi dizi adreslerini bir array e yazıp bir for loop ile istediğini yapabilir.Çalışmamasının başka bir nedeni vardır.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: mufitsozen - 09 Kasım 2016, 15:35:42
Alıntı yapılan: JOKERAS - 09 Kasım 2016, 14:36:19
.....
Ne yapalım çuvalladım toparlamaya çalışıyorum:)Yerseniz!


Yemesekte yemis gibi dururuz, senin karizmayi cizdirmeyiz netekim!  ;)
[
Marak Etme sen!
https://www.youtube.com/watch?v=652tLNeS9Dk (https://www.youtube.com/watch?v=652tLNeS9Dk)
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: JOKERAS - 09 Kasım 2016, 15:45:19
Alıntı yapılan: mufitsozen - 09 Kasım 2016, 15:35:42
Yemesekte yemis gibi dururuz, senin karizmayi cizdirmeyiz netekim!  ;)
[
Marak Etme sen!
http://www.youtube.com/watch?v=652tLNeS9Dk (http://www.youtube.com/watch?v=652tLNeS9Dk)

Yok be abi çok fena çuvalladım.
Bu nasıl oldu hala anlamış değilim.
O değil,verdiğim yöntemin konuyla uzaktan yakından alakası yok.
Hala daha soruyu niye böyle yorumladım onu düşünüyorum.
yamak usta geldi işin sihrini bozdu,yoksa ben hala yok Rom,Ram Türküsü okuyacaktım.

Fermanımı imzalayıp asın beni:)
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: yamak - 09 Kasım 2016, 15:59:43
Alıntı yapılan: JOKERAS - 09 Kasım 2016, 14:36:19
Ne yapalım çuvalladım toparlamaya çalışıyorum:)Yerseniz!
Estağfurullah hocam
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: M_B - 10 Kasım 2016, 22:56:01
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:

(https://s12.postimg.cc/k2s8i9bkp/Calisan_Kod.jpg) (https://postimg.cc/image/k2s8i9bkp/)

@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.
(https://s17.postimg.cc/o740a8q2z/Dongulu.jpg) (https://postimg.cc/image/o740a8q2z/)

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.


(https://s22.postimg.cc/5grivkonh/Error_Goruntusu.jpg) (https://postimg.cc/image/5grivkonh/)
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: mufitsozen - 10 Kasım 2016, 23:27:07
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);
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: M_B - 10 Kasım 2016, 23:37:53
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.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: mufitsozen - 11 Kasım 2016, 00:51:34
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.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: 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.

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:)


Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: 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
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: 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.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: mufitsozen - 13 Kasım 2016, 18:03:27
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.
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: mufitsozen - 13 Kasım 2016, 18:11:57
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 (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/ (http://clanguagebasics.com/c-language-tutorial/c-type-conversion-implicit-explicit-type-conversion-in-c/)

Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: mufitsozen - 13 Kasım 2016, 18:16:42
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
Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: JOKERAS - 13 Kasım 2016, 18:46:07
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?








Başlık: Ynt: Fonksiyon icindeki dizi isimlerin Değiştirilmesi.
Gönderen: yamak - 13 Kasım 2016, 19:11:22
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.