Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

char degiskeni degistirme

Başlatan Karamel, 24 Ağustos 2014, 23:05:37

Karamel

merhaba. mikroc de char txt1[] = "mikroElektronika"; seklinde tanimladigim txt1 degiskenini Lcd_Out(1,1,txt1);  ile ekrana basabiliyorum. programin icersinde txt1 degiskenini  txt1[] = "PicProje"; diye degistirmek istedigimde invalid expression hatasi veriyor. bu degiskenin icersini yazilim icersinde degistirme sansim yokmu?

baran123

 txt1[] = "PicProje"; yerine  txt1 = "PicProje"; yaparsan hata vermez ama bu şekildede string yapmış olursun biraz araştır bence

MrDarK

strcpy gibi fonksiyonlar var onları kullanmanı tavsiye ederim. Bu arada da txt array'in uzunluk sayısını yazsan iyi olur.
Picproje Eğitim Gönüllüleri ~ MrDarK

Karamel

#3
Hocam uzunluk yazinca lcd deki karakerler sacmaliyor. İlginc bir durum. yarin txt1="picproje"; yi bir deniyeyim.

mesaj birleştirme:: 25 Ağustos 2014, 00:36:42

Alıntı yapılan: baranekrem9 - 24 Ağustos 2014, 23:28:51
txt1[] = "PicProje"; yerine  txt1 = "PicProje"; yaparsan hata vermez ama bu şekildede string yapmış olursun biraz araştır bence

hocam dayanamadim ve kalktim denedim.   txt1 = "PicProje"; seklinde yazinca non-Ivalue hatasi veriyor. yani icerik istiyor. icerik yaziyorum bu seferde sacmaliyor. ilginc bir durum.

mesaj birleştirme:: 25 Ağustos 2014, 00:42:28

Alıntı yapılan: MrDarK - 24 Ağustos 2014, 23:31:24
strcpy gibi fonksiyonlar var onları kullanmanı tavsiye ederim. Bu arada da txt array'in uzunluk sayısını yazsan iyi olur.

hocam strcpy de iki adet char array i birbirine kopyalamak icin. benim zaten char txt1[] = "mikroElektronika";  ben bu degiskenin icersini "abcdefgha"; seklinde kolayca degistirebilmek istiyorum.

son olarak degiskeni su sekil yazinca derleyici sorun cikartmiyor.  txt1[15] = "mikroElektronika";  bu seferde bazi karakterler bozulmus oluyor. mesela ekrana mikroElektronika degilde mipooElektr7/ka seklinde cikiyor.

mesaj birleştirme:: 25 Ağustos 2014, 01:12:34

sorumun cevabini buldum. http://stackoverflow.com/questions/14396202/cannot-modify-char-array surada anlatiliyor. cozum mesajida su:

You cannot use character array like that after declaration. If you want to assign new value to your character array, you can do it like this: -

strcpy(message, "bar");


mesaj diyor ki, tanimlamadan sonra bu sekil yazayim degissin olmuyor. eger degistirmek istiyorsak yukaridaki ornek gibi yapmaliyiz.

mesaj birleştirme:: 25 Ağustos 2014, 01:26:35

bu sekilde yapincada bir kisimda yine sorunlar cikmaya basliyor. amazim lcd menusunu secenek ile ingilizceye dondurmek. eger degiskene dokumazsam hic sorun yok. degiskene txt1[0] = 'A'; seklinde dokunursam yine sorun yok. boyle cevirme yapamam. 60 civarinda menu icin tanimlanmis degiskenler var. bunlari "abcdefgh"; seklinde cevirmem gerekli. asagiya beceremedigim basit bir ornegi yaziyorum.


char txt1[] = "mikroElektronika1";
char txt2[] = "mikroElektronika2";
char txt3[] = "mikroElektronika3";
char txt4[] = "mikroElektronika4";
char txt5[] = "mikroElektronika5";
char txt6[] = "mikroElektronika6";
char txt7[] = "mikroElektronika7";
char txt8[] = "mikroElektronika8";


tam burada yazilanlari 1 sn ara ile lcd ye basmayi deneyin. sorun yok. hepsi normal gozukur.


strcpy(txt1,   "      Pic Proje       ");
strcpy(txt2,   "      Pic Proje       ");
strcpy(txt3,   "      Pic Proje       ");
strcpy(txt4,   "      Pic Proje       ");
strcpy(txt5,   "      Pic Proje       ");
strcpy(txt6,   "      Pic Proje       ");
strcpy(txt7,   "      Pic Proje       ");
strcpy(txt8,   "      Pic Proje       ");


simdi burada lcd ye basmayi deneyin.  "      Pic Proje       " icerigi  "  7i Pic Pzdje       " gibi bozuluyor.

Gökhan BEKEN

Alıntı yapılan: Karamel - 24 Ağustos 2014, 23:05:37
txt1 degiskenini  txt1[] = "PicProje"; diye degistirmek istedigimde invalid expression hatasi veriyor.
c dilinde böyle birşey mümkün değil. C++ gibi üst seviye dillerde string değişken türü vardır ama c dilinde yoktur. Bu yüzden dizi işlemleri ile kendiniz yapmalısınız veya standart "string.h" fonksiyonlarını kullanmalısınız.
Örneğin değişkeni şöyle tanımladınız txt1[]="hede";
içeriği "picproje" yapmak için şunu yazmanız yeter: değiştirmek için sprintf(txt1,"picproje");
strcpy fonksiyonunu da kullanabilirsiniz: strcpy (txt1,"picproje");

eğer eski veri silinmesin, peşine eklesin isterseniz: strcat(txt1,"picproje");
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

#5
hocam strcpy (txt1,"picproje"); te sorunlar oluyor bazi karakterler bozuluyor.

mesaj birleştirme:: 25 Ağustos 2014, 01:43:00

hocam sprintf(txt1,"picproje"); te bozulmalar daha az ama yinede var. cok ilginc bir durum. 60 degiskenin 40 i normal degistiriliyor. kalan 20 sinin icersi bozuluyor. sanirim mikroc bu konuda sinifta kaldi.

Gökhan BEKEN

tanımlarken boyut belirtmeniz gerekiyor. char dizi[32]="asdasdas"; yapın mesela
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

hocam  o zamanda yine sikinti cikiyor. acayip bir sorun. olmamasi gereken birsey. yani diyorum ya. %80 i normal ama kalan degiskenler bozuluyor. yarin bunu duzgun kafa ile bir dusuneyim ben. belki bir yerlerde hata yapiyorumdur. cozum bulamazsak mikroe ye de yazarim.

Gökhan BEKEN

#8
http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/lcd_library.htm
adresinde prototip olarak şöyle yazmış: void Lcd_Out(char row, char column, char *text);
şöyle denermisiniz:
char* txt1="deneme";
sprintf(txt1,"picproje");
Lcd_Out(1,1,txt1);

sorunun sprintf veya başka bir string fonksiyonundan kaynaklanıp kaynaklanmadığından emin olmak için şunu da deneyebilirsiniz:
txt1[0]='p'; txt1[1]='i'; txt1[2]='c'; txt1[3]='p'; txt1[4]='r'; txt1[5]='o'; txt1[6]='j'; txt1[7]='e'; txt1[8]=0;
Özel mesaj okumuyorum, lütfen göndermeyin.

MrDarK

Bazen bu tarz hazır fonksiyonları kullanmak başa bela olabiliyor Karamel ; sana tekrar tavsiyem txt buffer uzunluğunu sabit tut, buffer güncellemeden önce tüm mevcut bufferin tüm elemanlarına 0x00 yükle, sonra str fonksiyonlarıni dene, yine problem çıkarsa özel bir fonksiyon yazıp buffer temizlendikten sonra verileri tek tek girecek şekilde alt program yazarız
Picproje Eğitim Gönüllüleri ~ MrDarK

kimlenbu

Buffer'ı karakter sayısından 1 fazla yap. Buffer'ın son karakterini '\0' olarak atayıp dene. Hatalı karakterlerin kaybolması gerekiyor.

Karamel

#11
hocam simdi cok ilginc birsey paylasacagim. bahsettigim uzere 2x16 lcd uzerindeki menuyu Turkce yada Ingilizce yapmaya calisiyordum. bu yuzden 2 adet 16 lik icerigi olan degiskenlerim hep vardi. yani asagidaki gibi.

char Dil[]             = "<      Dil     >";
char Dil2[]            = "                ";


mesela yukaridaki menu dil menusunun. dil2 degiskenine ne gerek var diyebilirsiniz. Turkcede Dil kelimesi uc harfli olabilir ama farkli bir dilde 14 harften daha fazla olabilir. benim her zaman ozgurce kullanabilecegim alt satirimin olmasi gerekir. Yani Turkce secili iken alt satir bosluk olarak kullaniliyor olmasi mantiksiz bir hareket degil. gelelim sorunun kaynagina. Dil2 degiskeni gibi icersinde sadece bosluk olan degiskenleri sprintf yapmayinca sorun ortadan kalkti. eger bunlarida sprintf yaparsam degiskenlerin icersi bozuluyorlar. bunun deneyini yapmak isteyen arkadaslar 3-5 degisken ile denerlerse sorun olusmayabilir. soyle 50-60 degisken uzerinde oynayinca tamami bosluktan olusan degiskenlerde sorunlar oluyor. cok acayip bir durum oyle degilmi?

mesaj birleştirme:: 25 Ağustos 2014, 11:13:15

simdi daha farkli bir sorun var. uarti programimin initialize kisminda soyle UART1_Init(9600); aciyorum. sonra programimin herhangi bir yerine. bakin burasi cok onemli. mesela butonun basildiginda aktif olan fonksiyonun icersine yaziyorum ama butona hic basmadigim icin dolayisi ile icersindeki kodlar hic islenmiyor. herhangi bir yere UART1_Write('A'); yazdigim zaman yine lcd icin kullandigim degiskenler sacmaliyor. UART1_Write('A'); yi kaldirinca hersey normale donuyor.

Karamel

birsey daha sormak istiyorum. sprintf i kullaninca mcu nun rom undan 8234 byte kullaniliyor. buda hafizamin %20 si gibi birsey. sprintf e bir cozum getirmek gerekli. bu isi nasil halledebilirim?

kimlenbu

Kendi fonksiyonu yazabilirsin anca, sprintf i bir kere kullandığında 8k gider, sonraki her kullanımında bu kadar gitmez, defalarca kullanabilirsin. Eğer kendin yazmayacaksan 8k'yı gözden çıkaracaksın.

engerex

MikroPascal kullanırken bende de şöyle bir şey oluyordu.

int1 := 123;
if i1 = 123 then UART1_Write('A');

normalde koşul %100 yerine gelmesi gerekiyor. Görünürde öyle ama her zaman öyle olmayabiliyor. Araya alttaki gibi alakasız bir satır eklersem koşul yerine geliyor. Çok ilginç. Çok eksi versiyonlarda karşıma çıkıyordu. Şu an düzelmiştir diye umut ediyorum.

int1 := 123;
int99 := 5;
if i1 = 123 then UART1_Write('A');