string degiskeni toplamada kullanma

Başlatan Karamel, 04 Şubat 2015, 03:34:23

Karamel

merhaba. derslerden bulanip. azacik mikroc yi acayim dedim. lcd ekranda char degiskeni gosteriyorum. bu char degiskeninin bir elemanina + 1 ekleme yapinca ekrandaki yazi bozuluyor. yani soyle aciklamam gerekirse.

char sayimiz[3] = "000";
LcdOut(1,1,sayimiz);

yukarida ki kodta ekranda 000 gozukuyor. fakat asagidaki kodda sacmalamalar oluyor.

char sayimiz[3] = "000";
sayimiz[0] = sayimiz[0] + 1;
LcdOut(1,1,sayimiz)


bu neden oluyor? asci characterlere gore "0" decimal de 48 e karsilik gelmiyormu? ben 1 ekleyince 49 yani "1" e esit olmasi gerekmez mi?  :-\

DataDiver

MikroC bilmiyorum fakat, "sayimiz" 3 elemanlı array olmuş, String olarak tanımlanmış.

Şöyle dene;

char sayimiz = 0;
sayimiz = sayimiz + 1;
LcdOut(1,1,sayimiz) <-- !!! Ayrıca bu fonksiyon sadece string kabul ediyordur muhtemelen..

Karamel

hocam ben string bir degiskene toplama yapmak istiyorum.

yani "12456789" seklinde bir stringimiz olsun. ben buna decimal 1 ekleyecegim.

mesaj birleştirme:: 04 Şubat 2015, 03:58:37

basliga string degisken yazayim. char tam uygun olmamis

Gökhan BEKEN

Bunu anlamanın kolay bir yolu var:
char sayilar1[3] = "123";
char sayilar2[3] = "456";
LcdOut(1,1,sayimiz);
delay(1000);
LcdOut(1,1,sayimiz);


Eğer düzgün göstermiyorsa sorun toplama işleminde değil demektir. Ki toplama işleminde hata yapmamışsın dediğin gibi 48+1=49 yani '1' demektir.
Özel mesaj okumuyorum, lütfen göndermeyin.

MrDarK

#4
Hazır fonksiyonlar char array dizisinin sonunda bir adet null karakteri ararlar. Buna dikkat edin

char sayimiz[3] = "000";
LcdOut(1,1,sayimiz);

Şeklinde bir tanımlama yaptığınızda sonunda bir adet null koyacak yer kalmadığından LcdOut fonksiyonu bunu işleyemeyebilir.

MicroC'den örnek vermek yerine bu tarz işlemleri +1 şeklinde yapmak biraz yanlış gibi geldi gözüme. Neden diyecek olursan atıyorum string sayın;

199 olsun sen +1 eklersen en sona ne olur 190 ??

Bu işlem için doğru olan atoi ve itoa kullanman; Eğer kullandığın derleyicide yoksa bu işlemleri manuel yapacaksın :) Şahsen birçok projede manuel kullandım ben.

Örnekler devc ile denenebilir.
itoa ve atoi için linkler ;
http://www.cplusplus.com/reference/cstdlib/atoi/
http://www.cplusplus.com/reference/cstdlib/itoa/
Picproje Eğitim Gönüllüleri ~ MrDarK

Karamel

hocam benim anlayamadigim birsey var.

char sayimiz[3] = "000";

sayimiz[0] = sayimiz[0] + 1;


simdi sayimiz[0] in degeri "1"(string) olmasi gerekmez mi?

MCansız

mikroc de lcd sadece string ifadeleri yazar bunda dolayı sayı içerikli ifadeler stringe dönüştürülmeli

char say1=1; //burada sayısal içerilki bir değişken var

char txt[10];  // bu string bir ifade; 

while(1){
  
   BytetoStr(sayı1 , txt); //1 sayısı txt değişkenine string olarak dönüştürülüyor 
   
   lcd_out(1,1,txt);

 sayi1++; //sayi bir arttırılıyor

}
   

MrDarK

#7
Alıntı yapılan: Karamel - 04 Şubat 2015, 10:18:38
hocam benim anlayamadigim birsey var.

char sayimiz[3] = "000";

sayimiz[0] = sayimiz[0] + 1;


simdi sayimiz[0] in degeri "1"(string) olmasi gerekmez mi?

Evet string 1 olması gerekir. Eğer yine sıkıntı olursa "000" tanımlamasında array size girmeden dene [] , veya direkt sayimiz[0] = 0x30 gir '0' -> Hex30 ascii 48 0'ın karşılığıdır.
Yine problem olursa isiste simulasyon yap herşeyi gör

Şunu dener misin ?

char sayimiz[3] = "000";

sayimiz[2]++;

LcdOut(1,1,&sayimiz[2]);
Picproje Eğitim Gönüllüleri ~ MrDarK

Karamel

Hocam simdi yataga gectim :) aksama deneyecegim verdiginiz ornegi :)

elektronart

Hazır deniyorken bir de +1 satırını şöyle dener misin
(char)(sayimiz[0]+1);
Açık Elektronik

Karamel

Hocam gece deneyemedim. derslere baktim. simdide yataga gectim. ogrenmek isedigim iki sey var.

&sayimiz ile sayimiz arasindaki fark nedir?

char(sayimiz[0] + 1);  ne ifade etmektedir?

MrDarK

Alıntı yapılan: Karamel - 05 Şubat 2015, 08:35:33
Hocam gece deneyemedim. derslere baktim. simdide yataga gectim. ogrenmek isedigim iki sey var.

&sayimiz ile sayimiz arasindaki fark nedir?

char(sayimiz[0] + 1);  ne ifade etmektedir?

Karamel ;
Aşağıda verdiğim linkten mikroelektronikanın lcd_out fonksiyonunu inceleyebilirsin;
http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/lcd_library.htm#lcd_out_cp

void Lcd_Out(char row, char column, char *text);


Yani bilgi olarak char olarak tanımlı pointer kabul ediyor. Yani aslında sen "Merhaba" diye bir veri attığında M harfini işaret eden bir pointer gondermiş oluyorsun.

sayimiz dizini ekranda göstermek istersen direkt olarak yazabilirsin, fakat spesifik bir basamağını göstermek istersen de bunu adresi ile pointer şeklinde göstermen gerekir. Yani &sayimiz[2] gibi
Peki sayimiz diye gönderdiğinde adres göndermedin o nasıl gitti diyebilirsin, orada da şöyle birşey var derleyiciler array'in 0. elemanını gösteremiyorsun sanırım adres olarak, çünkü zaten sayimiz dediğin zaman array'in 0. elemanını işaret ediyorsun. Eğer spesifik[] değer girmediysen.

Bu array'i göndermene rağmen neden ekranda göremediğin konusuna tekrar gelirsek , dediğim gibi ekranda gösteren LCD_Out fonksiyonu bu gösterdiğin işaretçiden sonra (adresten) göndermeyi bitirmek için null karakterini bekler. Eğer bulamazsa ekrana saçma karakterler atabilir. Sabit uzunlukta bir array tanımladıysan bu array'in son elemanını null char (0x00) yapman gerekir.

Hata alırsan bir daha , ilgili kodlar ve resim ile desteklersen ilgilenelim. Birde pointer adres mantığını anlamaya çalış :) Elektronikte daha çok karşına çıkacak bunlar.
Picproje Eğitim Gönüllüleri ~ MrDarK

taso



char sayimiz[3] = "000";


sayimiz[2] += 1;
if(sayimiz[2]=="9"+1){sayimiz[2]="0";sayimiz[1]+=1;}
if(sayimiz[1]=="9"+1){sayimiz[1]="0";sayimiz[0]+=1;}
if(sayimiz[0]=="9"+1){sayimiz[0]="0";}
LcdOut(1,1,sayimiz);

sannırım bu işini görür.