Dizilerle İlgili Problem

Başlatan erdinch, 20 Eylül 2007, 01:20:32

erdinch

#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include  <Lcd.c>

char const text[3]="12";

int a;
int i =0;
int16 value=0;
int16 uzunluk;
 
 
 const int  alfabe[8][6]={
{126,129,129,129,126,0} //  0 rakamı
{132,130,255,128,128,0} // 1 rakamı
{195,161,145,137,134,0} // 2 rakamı
{137,137,137,137,255,0} // ...
{48,40,36,34,241,0}
{135,137,145,145,241,0}
{60,82,145,145,113,0}
{193,33,17,9,7,0}
};



 char metin1;
 
 
 void main()
   {
      lcd_init();
      delay_ms(1);






uzunluk=2;

for(i=0;i<12;i++)metin1[i]=0;

for(i=0;i<uzunluk;i++){

switch(text[i]){


case '1':  

for(a=0;a<6;a++){

metin1[a+value]=alfabe[0][a];;

}
value=value+6;

break;

case '2':  

for(a=0;a<6;a++){
metin1[a+value]=alfabe[1][a];
}
value=value+6;
break;

}
}

for(i=0;i<12;i++){
lcd_gotoxy(i+1,1);
printf(lcd_putc ,"%d",metin1[i]);  // printf(lcd_putc ,"%c",metin1[i]);
}


            }




Kodu bu şekilde derleyemiyorum.Pointer kullanmam gerektiğine dair bir mesaj alıyorum.

char metin1[];


şeklinde kod derlenebiliyor.

Buradaki amacım "text" (şu an için kısıtlı kod kullanıyorum.text verisi 11, 12,22 veya 21 olabilir)  verisindeki ifadeye göre metin1 dizisini alfabe dizisindeki verilerden oluşturmaya çalışıyorum.Lcd kullanmamın amacı ise metin1 dizisinin doğru bir şekilde oluşturulup oluşturulmadığını görmek adına.

char metin1[];


kodunu kullanıp derlediğim zaman ise lcd de boş ekran görüyorum.Nerede yanlış yaptığımı birtürlü bulamadım.

Umarım yardımlarınız dokunur.Şimdiden teşekkür ederim.İyi çalışmalar..

DumrulBey

char const text[3]="12";

Const'u başa alıp eşitliği güzel parantez {} içine almayı bir dene. Ayırıca hata kodlarını yazarsan tam olarak hatanın nerede olduğunu söyleyebiliriz.

Kolay gelsin...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

controller

verdiğin kod bende hatasız derleniyor. derleyicinde bir problem olabilir. ya da unuttuğun bir ayar...
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

erdinch

arkadaşlar öncelikler teşekkür ederim.

char metin1[255];


şeklinde kod sorunsuz çalıştı.

Fakat bu seferde başka bir problemle karşı karşıyayım.
Program içinde


char const text[3]="12";


Şeklinde herhangibir ifadenin strlen fonksiyonu ile uzunluğunu hesaplamaya çalışıyorum.Fakat "attemp to create pointer to constant" hatasını alıyorum.Strlen fonkisyonunu incelediğimde pointer kullanılarak gerçekleştirilmiş bir fonk.Uzunluğu hesaplanacak dizinin de hafıza açısından mecburen constant olması gerekiyor.Bu durumda uzunluğu hesaplamam için ne gibi bir yöntem izlemeliyim.Şİmdiden teşekkürler..

Ziya

Alıntı yapılan: "erdinch"Uzunluğu hesaplanacak dizinin de hafıza açısından mecburen constant olması gerekiyor.
Kullandığın sürümü yazabilir misin. Galiba 4.049 için fonksiyonda bir hata var.

stdlib.h klasörü içerisindeki strlen fonksiyonu
/* standard template: size_t strlen(const char *s).
   Computes length of s1 (preceding terminating 0) */

unsigned int8 *strlen(char *s) 
{
   char *sc;

   for (sc = s; *sc != 0; sc++);
   return(sc - s);
}


// strlen önündeki yıldız olmayacak. String içerisinde NULL termination (yani 0 değeri) bulana kadar pointeri ilerletir ve başlangış ile bulduğu arasındaki farkı geri döndürür.

Kullanımı uzunluk=strlen(&text[0]);
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

erdinch

hocam öncelikle cevabınız için çok teşekkür ederim.

Peki

char const text[4][255]="100100","111111","1110113334","00123412123001";


şeklindeki bir dizide 3. elemanın uuznluğunu hesaplatmak istersem ne yapmam gerekli?

uzunluk=strlen(&text[3]);


şeklinde denedim fakat istediğim doğru sonucu alamadım.
Bu arada sürümüm  4.049 .


strlen fonksiyonu ise "string.h" dosyasında şu şekilde

int strlen(char *s)
{
   char *sc;

   for (sc = s; *sc != 0; sc++);
   return(sc - s);
}

Ziya

sizdeki strlen fonksiyonu ile bendeki neden farklı? Acaba eski sürümden mi kaldı ki?

Yazdığınız şekli doğru olması lazım. ISIS ile simule ederseniz sorunu kolayca çözebilirsiniz. Adım adım çalıştırmada strlen fonksiyonuna girince pointerlerin içeriğini izleyin.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

erdinch

hocam malesef istedigim sonucu alamiyorum.

İki türlü dizi tanımladım

char const text[4][21]="100100","111111","1110113334","00123 412123001";
 char const text1[9]="12314124";


uzunluk=strlen(&text[3]);
lcd_gotoxy(1,1);
printf(lcd_putc ,"%d ",uzunluk);


uzunluk=strlen(&text1);
lcd_gotoxy(1,1);
printf(lcd_putc ,"%d ",uzunluk);


şekillerinde denedigim de ise lcd'de sıfır değerini okuyorum.

Fakat diziyi sabit olarak tanımlamadığımda doğru değerleri görüyor.Sabit tanımlayınca "0" değeri okuyorum.

Sizin strlen fonksiyonunuzu da denedim (strlen önündeki yıldızı kaldırarak) fakat yine aynı sonuç.

Ziya

Hocam, kusura bakma dikkatimden kaçmış. CCS'de sabit dizilere pointer atama yapılamıyor. Fakat 18F serisi için yapılabilir diye hatırlıyorum (table pointeri var çünkü).

bir döngü içerisinde ( örneğin for(i=0;i<255;i++) ) sabit dizinin ilk elemanından başlayarak her bir elemanını 0 ile karşılaştır. 0 ile ilk eşleşme durumunda döngüyü kır ve döngü indexini string uzunluğu olarak al.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

titanium

uzunluk=strlen(text1);

Bu şekilde denermisiniz? "text1" zaten text1 dizisinin başlangıç adresidir.

const char text1[5] = "1234";
uzunluk = strlen(text1);


bu şekilde denedim ama ccs de değil.

Edit: Mesajı gönderdiğimde Ziya' nın cevabını okudum, eğer öyleyse bu da sonuç vermeyecektir.

erdinch

Alıntı yapılan: "titanium"uzunluk=strlen(text1);

Bu şekilde denermisiniz? "text1" zaten text1 dizisinin başlangıç adresidir.

const char text1[5] = "1234";
uzunluk = strlen(text1);


bu şekilde denedim ama ccs de değil.

Edit: Mesajı gönderdiğimde Ziya' nın cevabını okudum, eğer öyleyse bu da sonuç vermeyecektir.

malesef bu da sonuç vermemişti.Bu durumda "attemp to a pointer to a constant" hata mesajını alıyorum.

erdinch

Alıntı yapılan: "Ziya"Hocam, kusura bakma dikkatimden kaçmış. CCS'de sabit dizilere pointer atama yapılamıyor. Fakat 18F serisi için yapılabilir diye hatırlıyorum (table pointeri var çünkü).

bir döngü içerisinde ( örneğin for(i=0;i<255;i++) ) sabit dizinin ilk elemanından başlayarak her bir elemanını 0 ile karşılaştır. 0 ile ilk eşleşme durumunda döngüyü kır ve döngü indexini string uzunluğu olarak al.


Hocam evt haklısınız.Aşağıdaki kod ile uzunluk hesaplatabiliyorum.Fakat pointer'lar ve sabit kullanmam yüzünden bunu da bir fonksiyon haline dökemedim.

for(uzunluk=0;uzunluk<1024;uzunluk++)
if(text1[uzunluk]==0)
break;


FOnksiyon'a dökebilseydik daha güzel olacaktı.Ama bu da iş görür.İlgilendiği için herkese teşekkür ederim..

titanium

Böyle bir şeye de mi izin yok?

unsigned char uzunluk_bul(const char* dizi)
  {
  unsigned char uzunluk = 0;
  
  while(dizi[uzunluk++] != '\0'){}
  return uzunluk-1;
  }