Ynt: fonksiyona "const BYTE* buffer" şeklinde değişken tanımlama

Başlatan esensoy, 03 Mayıs 2013, 13:00:38

esensoy

selamlar,
C ile yazılmış bir kodu CCS e uydurmaya çalışıyorum,
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, BYTE count);

satırında "Expecting an identifier" hatası veriyor,
sanırım const BYTE* buff tanımlamasında bir sıkıntı var,
fonksiyona pointer göndermeyi anlıyorum fakat const ne işe yarıyor?
bunu nasıl çevirmek lazım??

mesaj birleştirme:: 03 Mayıs 2013, 13:12:31

burada da aynı hatayı veriyor,
FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);   /* Forward data to the stream */
En tehlikeli an "zafer" anıdır.

xoom

Const Bir Sabit sayı tanımlamak için kullanılmıyor mu? ben mi yanlış hatırlıyorum mesela Pi (3,14) sayısı Const olarak tanımlanıyor..

arslan74

Alıntı yapılan: esensoy - 03 Mayıs 2013, 13:00:38
selamlar,
C ile yazılmış bir kodu CCS e uydurmaya çalışıyorum,
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, BYTE count);

satırında "Expecting an identifier" hatası veriyor,
sanırım const BYTE* buff tanımlamasında bir sıkıntı var,
fonksiyona pointer göndermeyi anlıyorum fakat const ne işe yarıyor?
bunu nasıl çevirmek lazım??

mesaj birleştirme:: 03 Mayıs 2013, 13:12:31

burada da aynı hatayı veriyor,
FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);   /* Forward data to the stream */


const C temel komutlarından biridir. Onda problem olmaz. Bence olsa olsa şunları tanımamıştır.
BYTE , DWORD, FIL, UINT.

Bunarlın tanımlama için başlarına define yeniden tanımlama yap.
örneğin:
#define UINT unsigned int

gibi.

fatih6761

Alıntı yapılan: esensoy - 03 Mayıs 2013, 13:00:38
selamlar,
C ile yazılmış bir kodu CCS e uydurmaya çalışıyorum,
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, BYTE count);

satırında "Expecting an identifier" hatası veriyor,
sanırım const BYTE* buff tanımlamasında bir sıkıntı var,
fonksiyona pointer göndermeyi anlıyorum fakat const ne işe yarıyor?
bunu nasıl çevirmek lazım??

mesaj birleştirme:: 03 Mayıs 2013, 13:12:31

burada da aynı hatayı veriyor,
FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);   /* Forward data to the stream */

Burada const, sabit diziyi tanımlamak için kullanılmış. Pointer'lar value-type sınıfına girdiğinden parametre olarak verdiğiniz ptr. 'ın bir kopyası fonksiyona gönderilir. pointer'ın kendisine yapacağınız değişiklik sadece kopyayı etkiler. Ancak pointer, bellekteki fiziksel adresi işaret ettiğinden pointer'ın işaret ettiği bölgede yapılacak değişiklikler gerçek değerleri değiştirir. Bundan korunabilmek için const ile birlikte işaret edilen dizinin elemanlarının da sabit olduğu kabul edilir. UINT, BYTE, DWORD tanımları C standartlarına (C89, C99) uygun değildir.
Özetle yapılması gereken tanımların eklenmesidir:
typedef int8 BYTE;
typedef int32 DWORD;
typedef unsigned int UINT; // CCS C'de 8-bit MCU'lar için unsigned int tanımı 8-bit işaretsiz tamsayıdır.

Not : C dili, dolayısıyla kodu okurken ne anlama geldiğini çözebilirsiniz.
type * name; -> type türüne işaret eden name adında işaretçi;
char * p; p adında char türüne işaret eden işaretçi
const char * p; const char türüne işaret eden p adında işaretçi
const char * const p; const char türüne işaret eden p adında const(değeri değiştirilemez) işaretçi
Son tanım genelde string oluştururken kullanılır.

esensoy

typedef unsigned int   UINT;
typedef unsigned long   DWORD;

olarak tanımladım,
#define BYTE int8

işlemci başlık dosyasında da BYTE bu şekilde tanımlı,

olay ccs c nin ansi c ile uyumlu olmaması ile alakalı diye düşünüyorum, çünkü "const BYTE* buff" dan const u kaldırırsam hata vermiyor,
bu const u kaldırmak sorunu çözüyor mu bilmiyorum ama?
En tehlikeli an "zafer" anıdır.

fatih6761

Alıntı yapılan: esensoy - 03 Mayıs 2013, 21:49:37
typedef unsigned int   UINT;
typedef unsigned long   DWORD;

olarak tanımladım,
#define BYTE int8

işlemci başlık dosyasında da BYTE bu şekilde tanımlı,

olay ccs c nin ansi c ile uyumlu olmaması ile alakalı diye düşünüyorum, çünkü "const BYTE* buff" dan const u kaldırırsam hata vermiyor,
bu const u kaldırmak sorunu çözüyor mu bilmiyorum ama?
Evet CCS C gözümde bir kez daha "fail" oldu :( Oradaki const dediğim gibi güvenlik önlemidir. Kod çok kritik değilse const'u kaldırmanız sıkıntı yaratmayacaktır.

esensoy

Yanlış anladıysam düzeltiniz,
const char* p --> p işaretçi, dolayısıyla içeriği değişkenin adresi ve bu adres değiştirilemiyor,
const char* const p --> bu nedir? işaret edilen değişken de mi değiştirilemiyor?

mesaj birleştirme:: 03 Mayıs 2013, 21:57:48

fatih hocam sen ne kullanıyorsun c olarak?
En tehlikeli an "zafer" anıdır.

fatih6761

Alıntı yapılan: esensoy - 03 Mayıs 2013, 21:55:40
Yanlış anladıysam düzeltiniz,
const char* p --> p işaretçi, dolayısıyla içeriği değişkenin adresi ve bu adres değiştirilemiyor,
const char* const p --> bu nedir? işaret edilen değişken de mi değiştirilemiyor?

mesaj birleştirme:: 03 Mayıs 2013, 21:57:48

fatih hocam sen ne kullanıyorsun c olarak?
Sondan başlayayım hocam. Belirli bir standardım yok, hobi olarak yani. Bilgisayarda genellikle gnu c derleyicilerini kullanıyorum, PIC için daha çok CCS kullandım ama bir süredir PIC ile uğraşmıyorum.
Asıl sorunuza gelince, const char * p nin C için anlamı şu:
"Programcı bir pointer tanımlıyor. Bu pointer const char türüne işaret edecek. Yani programcı p isimli değişkene doğrudan müdahele edebilir, ancak bu p'nin işaret ettiği bellek alanındaki veri const ile korunuyor, tanımladıktan sonra değiştiremez."
Yani;
#include <stdio.h>

int main() {
  const char * p = "merhaba dunya!";
  p = "iste degistirdim!";
  puts(p);
  return 0;
}

Bu kod geçerlidir ve ekrana "iste degistirdim" yazar ancak;
#include <stdio.h>

int main() {
  const char * p = "merhaba dunya!";
  *p = 'z';
  puts(p);
  return 0;
}

bu kod geçerli değildir. Çünkü p bir değişkendir, istenildiğinde atama yapılabilir, değiştirilebilir. Ancak işaret ettiği char dizisi const özelliktedir. Asla ve kat'a değiştirilemez.
Derleme zamanı hatası verir. (yalnızca okunabilir alana atama hatası)

const char * const p 'nin anlamı ise;
"Programcı bir const bir değer tanımladı ve bu değer bir const char türüne işaret ediyor. Programcı p değişkenine ilklendirme dışında atama yapamaz. Aynı zamanda içeriğini de değiştiremez."
Yani;
#include <stdio.h>

int main() {
  const char * const p = "merhaba dunya!";
  p = "atayamam ve degistiremem :(";
  puts(p);
  return 0;
}

Bu kod geçersizdir. Derleme zamanında hata verecektir. Derleyici p'nin pointer olup olmadığına bakmaz, p const'mu ? evet, o halde atama yapamazsın diyor bize...
Umarım anlatabilmişimdir, iyi çalışmalar...

JKramer


esensoy

jkramer in ilgili konuda belirttiği gibi
#device CONST=ROM
yazarsak,
const BYTE* buff
gibi bir fonksiyon parametreleri tanımlaması için hata vermeyi kesiyor,
ilginize teşekkür ederim,

fatih, hangi c yi kullandığını şundan dolayı sordum, hitec zaten bitti, mplab ı da mikro c vs yi de denedim, yine en kullanışlı ccs geldi bana, o yüzden kullanmaya devam ediyorum, boyle antin kuntinlikleri var işte, bilenlere danışınca en az zamanla çözülüyor,
yoksa tırmala dur:)
En tehlikeli an "zafer" anıdır.

fatih6761

Alıntı yapılan: esensoy - 04 Mayıs 2013, 12:04:27
jkramer in ilgili konuda belirttiği gibi
#device CONST=ROM
yazarsak,
const BYTE* buff
gibi bir fonksiyon parametreleri tanımlaması için hata vermeyi kesiyor,
ilginize teşekkür ederim,

fatih, hangi c yi kullandığını şundan dolayı sordum, hitec zaten bitti, mplab ı da mikro c vs yi de denedim, yine en kullanışlı ccs geldi bana, o yüzden kullanmaya devam ediyorum, boyle antin kuntinlikleri var işte, bilenlere danışınca en az zamanla çözülüyor,
yoksa tırmala dur:)
Hocam, o açıdan bakınca XC derleyicileri iyi deniyor, hem C standartlarına da yakınmış, ama kullanışlılık açısından CCS daha iyi. Hızlı proje geliştirme için CCS kullanmak daha mantıklı olur...