CCS C Const Array vs ROM Array

Başlatan Mucit23, 26 Kasım 2019, 01:02:38

Mucit23

Selamlar

CCS C de bu iki tanımlama arasındaki fark nedir?

Daha önce CCS ile Pic18F46xx Serisinde denemiş olduğum P10 kütüphanemi Pic18F97XX serisi bir MCU bulunan karta yüklemem gerekti. Kütüphanemde birçok noktada pointerlar ile işlem yapıyorum. Önceden tanımladığım dizilere pointer erişiminde sorun yaşadığım için forumdan birisinin önerisi ile const char dizi[]={...} yerine rom char dizi[]={...} şeklinde tanımlamıştım. Şimdi bu yapıda sorun yaşıyorum

rom ile const arasında fark nedir? Pointer ile erişim seviyeleri Microchip'in üst seviye mikroişlemcilerinde farklı olabilir mi acaba? Amacım Kütüphanede kullanılan Font Datalarını bir struct yapısı ile işaret etmek.

Sorumu şöyle güncelleyeyim. Const ile tanımlarsa diziye erişimde sorun yok. Fakat Const ile tanımlamış olduğum diziyi bir struct yapısında gösteremiyorum. Derleyici hata veriyor.

Örneğin

const unsigned int8 Table[]={.....} diye bir dizi olsun.
Aşağıdaki gibi bir struct yapısı kullanırsam hata veriyor

typedef struct _tFont
{   
  const unsigned int8 *table;
  unsigned int8 x;
  unsigned int8 y;
} FONT;

daha önce bu yapıyı rom ile kullanmıştım ama rom ile hafıza bölgesine erişemiyorum. Genel olarak sorun bu şekilde.

fide

#1
typedef içinde const değişken tanımlamak yerine typedef ile tanımladığınız değişkeni(struct'ı ) const olarak tanımlayın. Bence sebep şu const tanımlanırken değer atanması gerekiyor. Siz ise hem const tanımlayıp hem de daha sonra değer alacağını belirtiyorsunuz. Sıkıntı burada.

typedef struct hw_strings{
      u8 sbt;
      char str[20];

  }myHwStrings;
  
  
  myHwStrings const deviceData[10]={
      cHWID,{"FD.RAL.MCU.R03"},
      cSWVersion,{"1.0.0"},
      cHwR,{"1.0.1"},
      mfc,{"FiDeNet UKoSis"},
  };

yukardaki kodlar düzgün çalışıyor. Denemeye değer.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

OptimusPrime

Hata veriyor derken? Neye sinirleniyor? ::)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Mucit23

rom unsigned int8 FontTable[]={1,2,3,4,5,6,7,8,9,10};

typedef struct __tFont
{   
  rom unsigned int8 *Table;
  unsigned int8  Width;
  unsigned int8  Height;
 
} ssFONT;


ssFONT FontData = {
  FontTable,
  8,
  8,
};
yukarıdaki gibi bir struct tanımlıyorum. Bu struct ile const olarak tanımlamış olduğum diziye erişmeye çalışıyorum. Yukarıdaki şekilde hata vermiyor ama struct ile diziye erişemiyorum. Gelen değer daima null

Kullanımı ise şöyle İlk önce ssFONT türünde bir değişken tanımlıyorum

sFONT NewVar;

NewVar=FontData; şeklinde atama yaptığım zaman atadığım değişken FontData struct'ını temsil etmesi gerekiyor.

Struct içinde pointer kullanımı nasıl olur? Const olarak tanımlanmış bir dizinin başlangıç adresine nasıl erişirim bu yapıyla?

Daha önce kullandığım bir yapıydı halbuki anlamıyorum.

OptimusPrime

Kuvvetle ihtimal NewVar=FontData a kafayi takmistir. C++ bu yuzden var cunku  :D
Bazi derleyiciler bunu yapamayabilirler (icerisinde pointer oldugundan). Bunun yerine memcpy veya sFONT tipinden bir pointer deneyebilirsin.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Mucit23

Ya zaten farklı bir yöntemle çözdüm. Bu yapıyı kullanmadım. Çok da gerek kalmadı yani. GNU ve ARM bu tür şeyleri hiç kafaya takmıyor.

OptimusPrime

Bir keresinde if (NewVar == FontData) seklinde birsey yapmistim. Hebele hubele yapmadan gnu ne demek istedigimi anlamisdi.  8-)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||