Delphi ve C de structure içine yerleşecek arrayin uzunluğunu otomatik belirleme

Başlatan z, 12 Haziran 2012, 13:02:47

z


type
    TMyFormat
       A:char;
       B:char;
       C:word;
       D:integer;
       X: [0..7]array of byte;
end;

Yukarıkdaki gibi bir structure tanımlamış olalım.

Eğer bu structure içinde bir byte değişken daha tanımlarsam toplam uzunluk 17 byte olacağından fakat 16 byte ı aşmamasını istediğimden structure tanımımı aşağıdaki gibi yapmam gerekiyor.

type
    TMyFormat
       A:char;
       B:char;
       C:word;
       D:integer;
       E:byte;
       X: [0..6]array of byte;
end;

X: arrayının boyunu, structure uzunluğu 16 olacak şekilde nasıl otomatik tanımlatabilirim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

JOKERAS

Selam, "z".

Ben iç içe yapı kullanarak yapılabileceğini düşünüyorum.
Bildirimini yaptığımız yapının içine başka değişken eklesek veya
azaltsak esas yapımızı oluşturan YENI_YAPI içinde tanımladığımız
dizi otomatik olarak genişleyip azalacak.
Sonuç itibarı ile YENI_YAPI uzunluğu hep sabit kalır diye düşünüyorum.

typedef struct {
   char a;       //1 byte.
   char b;     //1 byte.
   int  i;          //2 byte.
   long int k;  //4 byte.
} YAPI_T;


typedef struct {
   YAPI_T YAPI;
   char dizi[16 - sizeof(YAPI_T)];
} YENI_YAPI;

YENI_YAPI Yapi;
   

z

@Jokeras bu aklıma gelmemişti. Değişkenlere ulaşırken Yapı.Yapı_T.A gibi olumsuzluk dışında işimi görecek.
Fakat çözümü varsa Yapı.A olarak erişimi tercih ederim.

Aslında sorunum bundan biraz daha büyük.

ARM işlemcide koşan yazılımımda 64 Bytelık bir array var. Bu arrayın elemanlarına ismen hitap edebilmek adına structure tanımladım. (Malesef değişkenler farklı farklı tiplerde)

64 Bytelık bu arrayın içindeki veriler, seri iletişimle aktarılarak karşıdaki PC nin 64 bytelık arrayının içine yerleşiyor.

PC tarafında bu arrayın elemanlarına gene ismen hitap edebilmem için gene structure tanımlamam gerekiyor.

Ancak ARM tarafındaki derlemede byte short ve integer verilerde alignment işlemi, PC tarafındaki alignmend işleminden farklı olursa bu yapı çuvallar. Öteyandan alignment işlemi için bufferda bazı alanları kaybetmek istemiyorum.

@Gerbay  verileri özenle sıraladığım için benim hesabıma göre aşağıdaki yapının 16 byte uzunlukta olması gerekiyor. Delphi 6 da da öyle.

type
    TMyFormat = record
       A:char;
       B:char;
       C:word;
       D:integer;
       X: array [0..7] of byte;
    end;

Sizde neden farklı oldu? + Packet record neden farklı oldu?

Yukarıdaki sorumda Array elemanlarına konuyla alakalı isimlerle hitap etmek çok önemli. Bu soruna nasıl çözüm getirebilirim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bocek

C'de union yapısı işinizi görür gibi geliyor bana. ama Delphi'de nasıl olur onu bilmiyorum.
union yapi {
 struct record myrecord;
 char dizi[sizeof(myrecord)];
};
1 ya da 0. işte 'bit'ün mesele..

z

Anladim hocam. Su ana kadar align islemini byte, word ve double word degiskenleri ince ince hesaplayip yerlerini kendim belirliyordum. Ancak bu structera her yeni degisken eklentisi ya da siliminde kulfet getiriyordu.

Dediginiz gibi her iki tarafta da Align 1 tanimini yapip structure da yapacagim degisikliklere ayrica kafa yormayacagim. En sonunda da align islemini elle yapip max performansi elde edecegim.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Aslinda yaptigim su; ARM tarafinda 64 bytelik bir alan PC tarafina aynalanmis durumda. Her 1 ms de bir ARM tarafindaki degiskenlerin goruntusu PC tarafina yansiyor. 1 ms zaman diliminin icinde ARM islemci bu array uzerinde surekli islem yapiyor. Durum boyle olunca surekli olarak align edilmemis veriler uzerinde islem yapmak belirgin bir performans kaybina neden olacak. Bu nedenle verilerin yerlesiminde elle ayarlama yoluna basvurdum.

Mevcut bu 64 bytelik alanin disinda bir 3 adet daha 64 bytelik alan daha var. Bunlar siradan bir buffer ve  PC ile veri degis tokusunda kullaniliyorlar. Fakat buradaki verilerin align edilip elmemesi birinci buffer kadar onemli degil. Cunku istek oldukca doldurulup bosaltilan buffer bunlar.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com