CCS C String Sorunu

Başlatan Nedenler, 12 Nisan 2011, 11:29:07

Nedenler

Merhaba arkadaşlar TFT ekran için karakter basan fonksiyon hazırladım. Karakterleri tek tek gönderiyorum. Bu fonksiyonu kullanarak bir de string basan fonksiyon yazdım. Fakat olmaması gereken bir hatadan dolayı ekrana bunu yollayamıyorum.

Aşağıda karakter basan fonksiyon mevcut. Burada sorun yok.
void TFT_Putc(uint x, ulong y,char c)
{
   uchar i,j,temp;
   ulong num;
   TFT_SetReg(Gram_Adrs1,x);
   TFT_SetReg(Gram_Adrs2,y);
   num=((c-32)*5);      //Font dosyasındaki karakter adresi alınıyor
   for(i=0;i<5;i++)
   {
      temp=StandartChar[num+i];
      for(j=0;j<7;j++)
      {
         if(temp&0x80)   TFT_DataWrite(0x0000);
         else            TFT_DataWrite(0xFFFF);
         temp<<=1;
      }
      TFT_SetReg(Gram_Adrs1,(++x));
      TFT_SetReg(Gram_Adrs2,(y));
   }
   TFT_SetReg(Gram_Adrs1,(x+=3));
   TFT_SetReg(Gram_Adrs2,(y));
}



String basan fonksiyon da aşağıda.

void TFT_Print(uint x, ulong y, ulong Bcolor, ulong Tcolor,uchar *s)
{
   while(*s)
   {   
      if(x>LCD_Dot)  { x=0; y+=12; }
      if(y>LCD_Line) { x=y=0; TFT_SetArea(0,0,LCD_Dot,LCD_Line); }
      TFT_Putc(x,y,*s);
      x+=2;
      ++s;
   }
}



Kullanım
TFT_Print(100,110,WHITE,BLACK,"DENEME");


Verdiği hata

Attempt to create a pointer to a constant


constant yapmaktan *s pointerini const char olarak da tanımladım fakat sorun devam ediyor.

GreeN

#1
öncelikle ,,
hataya sebep olan durum ;
char *str;
*str="deneme";

yukarıdaki koda hata veriyor.

2. olarak ;
void TFT_Print(uint x, ulong y, ulong Bcolor, ulong Tcolor,uchar *s)
{
   while(*s)
   {   
      if(x>LCD_Dot)  { x=0; y+=12; }
      if(y>LCD_Line) { x=y=0; TFT_SetArea(0,0,LCD_Dot,LCD_Line); }
      TFT_Putc(x,y,s); // *s göndermişsin ama TFT_Putc fonsiyonuna tek karakter göndermen gerek.
      x+=2;
      ++s;
   }
}


geçici çözüm olarak;
şöyle bir deneme yapsana işe yara ama pointer kullanarak yaparsan hata verir mi bilmiyorum. yani char *str; strcpy(str,"deneme");

char str[10];
strcpy(str,"deneme");
TFT_Print(100,110,WHITE,BLACK,str);


Terörü Lanetliyoruz.

Nedenler

GreeN

Yanıtın için teşekkür ederim. Şunu da ekleyeyim;

char str[]="ABCDEFGHIJKLMNOPRS........" şeklinde tanımlama yapıp istediğim uzunluktaki bir string ifadeyi gönderebiliyorum. Tabi programın heryerinde aynı stringi göndermeyeceğim için ve kod aralarında değişken, dizi tanımlayamayacağım için char st[100] şeklinde bir tanımlama yaparak işi kurtarabilirim.

Yani verdiğiniz şekilde oluyor evet ama her yazı gönderdiğimde ekstradan bu işlemi yapmam gerekiyor ve gereksiz yere yapıyor olmak canımı sıkıyor. Bu olayı çözsem daha iyi olacak.

Forumda bir arkadaş daha sormuş burada fakat cevaplar işime yaramadı.
Birde sanıyorum ARM ile yapılmış bir örnek var elimde onda ki putc ve print fonksiyonları bunlar. Onda bu şekilde bir tanımlama sorun çıkarmamış. Zaten yukarıda verdiğim linkde de sadece CCS'ye özel bir şey olduğu söyleniyor.


gerbay

Programın başında typedef ile tanımlama yapmıştım orada sıkıntı yok ama yine de çok değiştirdim. char yaptım uchar unsigned char const char hepsini denedim. Yanlız const koyduğumda o aldığım hatayı almıyorum bolca Expecting an identifier, Expecting declaration hataları alıyorum.

GreeN

#3
Alıntı yapılan: gerbay - 12 Nisan 2011, 16:07:48
TFT_Putc(x,y,s); // *s göndermişsin ama TFT_Putc fonsiyonuna tek karakter göndermen gerek.


"*s"  zaten onu tek karaktere çeviriyor o kısım doğru. olay parametre uyumsuzluğu sanırım
void TFT_Putc(uint x, ulong y,char c)


şeklinde tanımlı

void TFT_Print(uint x, ulong y, ulong Bcolor, ulong Tcolor,uchar *s)


şeklinde tanımlı, son parametreyi "uchar *s"   yerine "char *s" yapıp deneyin.

hatta ben sizin yerinizde olsam şu şekilde tanılarım (kodu hiç değiştirmeden);
void TFT_Print(uint x, ulong y, ulong Bcolor, ulong Tcolor, const char *s)



@gerbay ;
const char *s bu şekilde tanımla  yapabilirmisin ? Buna ccs c hata verir.
Edit : Bu tanımlamaya hatayı @Nedenler benden önce cevap vermiş.
@Nedenler;

TFT_Putc(x,y,*s); ile karakter yazdırabiliyor musun?


Terörü Lanetliyoruz.

Nedenler

Evet yazdırıyorum konunun en başında paylaştığım herşey aynı sadece print fonksiyonuna direk string göndermeyip dizi üzerinden gönderiyorum.

dizi[]="picproje.org";
TFT_Print(100,50,WHITE,BLACK,dizi);