CCS'de String Alan Fonksiyon Sorunu

Başlatan rojhatbilge, 17 Ekim 2009, 21:55:52

rojhatbilge

Herkese merhabalar.

Bir sorunuma çözüm arıyorum. Çözmek için çok takla attım ama olmadı
Sorunum şu;

CCS'de parametre değişkeni string olan bir fonksiyon olmuyor.

örneğin string alan fonksiyon şu olsun ;
char video[2][16];            //Global değişken


void Video_Ekle(int8 sutun, int8 satir, char *str)
{
       strcpy(video[sutun][satir], str);
}


bu fonksiyonu ana progrmada aşağıdaki gibi çağırıyorum;
Video_Ekle(1, 4, "Bilge");


sonuçta aşağıdaki hata mesajını veriyor;
"Attempt to create a pointer to a constant"

Normalde standart C'ye uygun bir C derleyicisinde (örneğin Visual C) çalışıyor. CCS C de çalışmıyor.

CCS C'de bunu yapmanın bir yolunu bilen varmı.
Eğer CCS C bu tür atamalara izin vermiyorsa o zaman bu CCS C için büyük bir eksik demektir.

koordinat

fonksiyon dışında x=&k gibi tanımlayabilirsiniz

piedos

Alıntı yapılan: "rojhatbilge"Herkese merhabalar.

Bir sorunuma çözüm arıyorum. Çözmek için çok takla attım ama olmadı
Sorunum şu;

CCS'de parametre değişkeni string olan bir fonksiyon olmuyor.

örneğin string alan fonksiyon şu olsun ;
char video[2][16];            //Global değişken


void Video_Ekle(int8 sutun, int8 satir, char *str)
{
       strcpy(video[sutun][satir], str);
}


bu fonksiyonu ana progrmada aşağıdaki gibi çağırıyorum;
Video_Ekle(1, 4, "Bilge");


sonuçta aşağıdaki hata mesajını veriyor;
"Attempt to create a pointer to a constant"

Normalde standart C'ye uygun bir C derleyicisinde (örneğin Visual C) çalışıyor. CCS C de çalışmıyor.

CCS C'de bunu yapmanın bir yolunu bilen varmı.
Eğer CCS C bu tür atamalara izin vermiyorsa o zaman bu CCS C için büyük bir eksik demektir.


hata bu "Attempt to create a pointer to a constant"
header ı void Video_Ekle(int8 sutun, int8 satir, const char *str)
olarak değiştirirsen sorun düzelecektir
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

rojhatbilge

Arkadaşlar yukarıda vermiş olduğunuz öneriler için teşekkür ederim. Ama bunları denemiştim, yine olmamıştı.

Başlık yazısında bahsettiğim "attığım taklalardan" bazıları bunlardı zaten :D

picusta

Birde söyle dene :
char *Tmp;
Tmp =  &video[sutun][satir];
strcpy(Tmp, str);

veya
strcpy(&video[sutun][satir], str);

rojhatbilge

Picusta, yazdıkların doğru ama ben bir fonksiyona geçici değişken kullanmadan string göndermeye çalışıyorum.

picusta

strcpy(char *,char *);

Yukarida strcpy fonksyonunun prototipini verdim.
Senin hatan "char *" tipi istenen yere "char" tipi veri vermendir.
Yaptigin hatayi önce bi anla.
Visual C 'de nasil çalisir anlamadim. Bugün deneyip kontrol edecegim.

strcpy(&video[sutun][satir], str);

Bu yöntemle yaparsan geçici degiskenin olmaz.

koordinat

benim araştırdığım kadarıyla hata ccs de,yani desteklememesinde ama siz yinede deneyin.hitech-c de böyle bir sorun yokmuş

picusta

Alıntı yapılan: "koordinat"benim araştırdığım kadarıyla hata ccs de,yani desteklememesinde ama siz yinede deneyin.hitech-c de böyle bir sorun yokmuş
Alıntı yapılan: "rojhatbilge"
Normalde standart C'ye uygun bir C derleyicisinde (örneğin Visual C) çalışıyor. CCS C de çalışmıyor.

Cevap :
Alıntı yapılan: "Visual Studio 2005"
error C2664: 'strcpy' : cannot convert parameter 1 from 'char [2][16]' to 'char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

gallavi

CCS gibi compiler lar sanırım ANSI standartlarını tam olarak sağlamıyo ama ben kullandığım yöntemi anlatayım o şekilde halledebilirsiniz.



strin değer alacak fonksyonu

void menu(int16 adress)

şeklinde tanımlayın

sonra birde

int16 rom_adres(int16 adress)
{
return adress;
}

şeklinde 2. bi fonksyon tanımlayın

menü fonksyonunu çağırıken rom_adres fonksyonunu araya eklemeniz gerekli bu şekilde

menu(rom_adres(&"Merhaba Dünya!!"));



menü fonksyonu içinde karakterleri

read_program_eeprom (adress+i);

yukardaki şekilde alabilirsiniz

biraz karmaşık ama çalışıyo ben de çok takla atmıştım en son bu şekilde hallettim :)
DemirHan=gallavi;

rojhatbilge

strcpy(video[sutun][satir], str);


yerine

strcpy(&video[sutun][satir], str);


olacak doğru. Ben burada (formda) yanlış yazmışım.

Yapmaya çalıştığım şey ;
Video_Ekle(1, 4, "Bilge");

şeklinde bir fonksiyon yazmak.

CCS bunu yapmıyor.

gallavi

pic fiziksel olarak kod içindeki stringleride kod gibi program memeory'e yazıyo siz fonksyona stringin program memory'de bulunduğu adresini girmenin bi yolunu bulursanız read_program_eeprom (adress); fonksyonu ile o stringi karakter karakter okuyabilirsiniz. Ancak dikkat edilmesi gereken çok şey var string'in sonuna gelinip gelinmediğinin kontrolu ve işlemcini configurasyon bitlerinde eğer program memory okuma koruması varsa onun kapalı olması gibi şeylere dikkat etmelisiniz ben önceki mesajımdaki gibi hallettim. O fonksyonu menu(rom_adres(&"Merhaba Dünya!!"), int sutun,int satir); şeklinde de tanımlayabilirsiniz kolay gelsin
DemirHan=gallavi;

rojhatbilge

Evreka, evreka, evreka
Yani diyorim ki "Buldum, buldum, buldum"  :D  :D

Olayı makroyla çözdüm. Fonksiyon yerine fonkisyonla aynı içeriği taşıyan bir makro yazdım.

char video[2][16];
#define Video_String_Ekle(sutun, satir, str)     {strcpy(&video[sutun - 1][satir - 1], str); }


Bu makroyu ana programda (main'de)

Video_String_Ekle(1, 4, "Bilge")


şeklinde çalıştırabiliyorum.


Yağmaya çalıştığım şey şuydu;
char video[2][16]; bir 2x16 karakter LCD'nin video belleği idi. Bir timer kesmesi içinde peryodik olarak bu video bellekteki her karakteri tek tek LCD'ye yazdırıyordum.

Artık ana programda : Video_String_Ekle(1, 4, "Bilge") yazdığım anda LCD'de 1.satir, 4.sutunda "Bilge" yazısını ekliyor.