Fonksiyon icindeki dizi isimlerin Değiştirilmesi.

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

M_B

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.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

mufitsozen

#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--
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

M_B

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

İ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 - 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.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Klein

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?

M_B

Hocalarim hata vermiyor derliyor ama ekrana yazmiyor. Akşam tam kodu ve ekran goruntusunu  ekleyecem.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

JOKERAS

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.


yamak

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.

JOKERAS

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.






yamak

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

JOKERAS

#10
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!








yamak

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.

mufitsozen

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
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

JOKERAS

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

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

yamak

Alıntı yapılan: JOKERAS - 09 Kasım 2016, 14:36:19
Ne yapalım çuvalladım toparlamaya çalışıyorum:)Yerseniz!
Estağfurullah hocam