Struct Yapısı hakkında

Başlatan Mucit23, 12 Eylül 2017, 13:48:55

Mucit23

#15
Çok uğraştım ama henüz doğru yöntemi bulabilmiş değilim. Aslında struct içine olması işi bozuyor.

Keilde Debug yaparken gözlemliyorum neler olduğunu durum aşağıdaki gibi.



P10_Currentfonts=tahoma_8ptFontInfo; Bu komut çalıştığı anda tFONT türündeki tahoma_8ptFontInfo P10_Currentfonts yapısına aktarılıyor. Debugda bu görülüyor.

Bana lazım olan verileri P10_Currentfonts.Fontdescriptor içerisinde. Adresi benim dizimin adresi. Şimdi ben P10_Currentfonts.Fontdescriptor 'un adresini başka bir iki boyutlu pointere atayıp o pointer üzerinden verilerime ulaşmaya çalışıyorum ama yapamıyorum. Burada gösterilen her türlü yöntemi denedim ama beceremedim.

Keilde mi sıkıntı var anlamıyorum. Nasıl yaparım bu işi?

Forumda "C" bilen birileri var mı?  :)

yamak

#16
Hocam pointer to pointer veri tipinde olan bi değişkene 2 boyutlu bir dizinin adresini yükleyince elemanlara yapmaya çalıştığın gibi erişemezsin.
tFONT tahoma_8ptFontInfo =
{
	11, //  Character height
	' ', //  Start character
	'~', //  End character
	(const uint16_t *)tahoma_8ptDescriptors, //  Character descriptor array
	(const uint8_t *)tahoma_8ptBitmaps, //  Character bitmap array
};

atamasından sonra
tahoma_8ptFontInfo.tahoma_8ptDescriptors[0] ile tahoma_20ptDescriptors array inin ilk elemanı olan 5 e erişirsin
Eğer tahoma_8ptFontInfo.tahoma_8ptDescriptors[0][1] dersen bu durumda 5 adresindeki 1. elemana erişmeye çalışırsın ve bu durumda hardfault oluşur ya da saçma bi değer okursun.

Yapmak istediğin şeyi şu şekilde yapabilirsinin
*((uint16_t*)(&(tahoma_8ptFontInfo.tahoma_8ptDescriptors[0]))+1)

Bu durumda array in 0. elemanının 1.elemanına erişirsin.

Ama ben olsam
ilk olarak
typedef struct
{
   uint16_t width;
   uint16_t offset;
}fontInfo;


Şeklinde bi struct tanımlayıp
tahoma_20ptDescriptors[95][2]
array ini de

fontInfo tahoma_20ptDescriptors[95]={
...
...
...
}

Şeklinde tanımlardım.

Daha sonra da
tfont.tahoma_8ptDescriptors[0].width
tfont.tahoma_8ptDescriptors[0].offset


Şeklinde erişirdim.




Mucit23

yusuf hocam sizin ikinci önerdiğiniz yöntemde fontInfo türünde bir yapı oluşturup bunuda Ana tanımladığım struct içine gömebilirmiyim?

Temel hedeflerimden biri P10_Currentfonts=tahoma_8ptFontInfo; yapısını koruyabilmek.

Mucit23

FontInfo yapısını hemen denedim ama bir terslik var gibi

İlk önce dediğiniz gibi bir yapı tanımladım.

typedef struct
{
   uint16_t width;
   uint16_t offset;
}FontInfo;


Sonra dizimi FontInfo türünde tanımladım.
const FontInfo tahoma_8ptDescriptors[95][2] = 
{
	{3, 0}, 		//   
	{2, 11}, 		// ! 
	{5, 22}, 		// " 
	{8, 33}, 		// # 
	{6, 44}, 		// $ 
	{12, 55}, 		// %
.
.
.


Ana programdan bu diziye erişebilmek içinde aşağıdaki gibi tanımlama yaptım.

extern const FontInfo tahoma_8ptDescriptors[];

Kullanırkende aşağıdaki gibi kullanıyorum.

      Value=tahoma_8ptDescriptors[0].width;

Fakat şöyle bir terslik var.

Index değeri sadece çift sayılarda bana değer veriyor.
Yani Dizinin 0. satırındaki Witdh ve Ofset Değerleri için index 0 vermem gerekiyor.
Dizinin 1. satırındaki width ve Ofset değeri için index 2 olmak zorunda
Dizinin 2. satırındaki width ve Ofset değeri için index 4 olmak zorunda

Örnek;

      Value=tahoma_8ptDescriptors[4].width;  //Dizinin 2. satırındaki width değeri

Bu şekilde olması normalmidir?
   

yamak

const FontInfo tahoma_8ptDescriptors[95]={
...
...
...
}

şeklinde olacak.Kopyala yapıştır şeklinde yaptığım için silmeyi unuttum

JKramer

#20
Alıntı yapılan: Mucit23 - 15 Eylül 2017, 14:28:22
@baran123 Sen kodu derleyebildinmi? Ben derleyemedim. Hata veriyor.

Struct yapısını bu şekilde yaptım.
typedef struct 
{
   uint8_t Height;
	 char StartChar;
	 char EndChar;
	 const uint16_t (*FontDescriptor)[95][2];
	 const uint8_t *FontBitmap;
} tFONT;


Bu tek başına derleniyor.

Fakat bu yapıya göre fontinfo tanımladığımda hata veriyor.
Aşağıdaki gibi.

// Font information for Tahoma 8pt
tFONT tahoma_8ptFontInfo =
{
	11, //  Character height
	' ', //  Start character
	'~', //  End character
	(const uint16_t *)tahoma_8ptDescriptors, //  Character descriptor array
	(const uint8_t *)tahoma_8ptBitmaps, //  Character bitmap array
};


Verdiği hatada budur.
Boyutla ilgili bir sıkıntımı var acaba
// Font information for Tahoma 8pt
tFONT tahoma_8ptFontInfo =
{
	11, //  Character height
	' ', //  Start character
	'~', //  End character
	//(const uint16_t *)tahoma_8ptDescriptors, //  Character descriptor array
        (const uint16_t (*)[2] ) tahoma_8ptDescriptors, //  Character descriptor array
	(const uint8_t *)tahoma_8ptBitmaps, //  Character bitmap array
};

şeklinde olması lazım.

Ek olarak tahoma_8ptFontInfo yu neden P10_Currentfonts'a atıyorsunuz? O fontun her şeyi sabit, zaten oluşturmuşsunuz. Bir fonksiyona parametre olarak geçecekseniz tahoma_8ptFontInfo'nun adresini geçip yine onun üzerinden işlem yaparsınız.

baran123

@JKramer hocam haklı bu fontları tanımlayıp direk kullanmak daha mantıklı değil mi ?
Yada bir font dizisi oluşturup çekebilirsiniz.

Mucit23

Amaç şudur. P10_Currentfonts yapısı p10 ile ilgili text basma gibi işlemlerde değişken olarak kullanılıyor. Ben bu değişkenin içerisine hangi fontu kullanacaksam ona ait parametreleri yüklüyorum ve arka plandaki text basma kodlarım bu değişken içerisindeki font parametrelerine göre çalışıyor.

Daha öncelerden hep bu yapıyı kullandım ve üst katmanlarda kodum çok sade oldu.

Elimde kendi kafama göre bir font dosyası üreten bir yazılım olmadığı için eldeki font dönüştürme yazılımlarına göre kodumu şekillendirmem gerekiyor.

Bu tür konular karmaşık konular gerçekten. Daha önce bu kadar kapsamlı hiç uğraşmamıştım.

İs yerine geçince tekrar bakacağım

Mucit23

#23
Yamak hocama ve diğer yardım eden herkese teşekkürler.

FontDescriptor ile ilgili öneriniz çok güzel. Dediğim gibi hemen bir FontInfo adında bir struct tanımlayıp dediklerinizi yaptım.
Şuanda descriptor bilgilerine bu aşağıdaki gibi ulaşabiliyorum. Güzel yanı FontDescriptor dizisine derleme esnasında boyut verme gereği kalmadı.

Value=tahoma_8ptDescriptors[1].offset;

Şimdi ana Struct yapısını aşağıdaki gibi düzenledim ve hedefime ulaştım gibi. Şimdilik testlerini yapıyorum.

typedef struct 
{
   uint8_t Height;
	 char StartChar;
	 char EndChar;
	 FontInfo *FontDescriptor;
	 uint8_t *FontBitmap;
} tFONT;


Aslında en başta FontDescriptoru temsil edecek bir yapı tanımlansaydı bu kadar uğraşmazdım herhalde. Sorun tek boyutlu pointer ile iki boyutlu diziyi temsil etmekti.

Şimdi aşağıdaki gibi sade bir kullanım var.
      Value=P10_Currentfonts.FontDescriptor[5].width;

Her neyse Bu konu ile C de pointer ve Struct kullanımının önemini öğrenmiş olduk :)