Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Bitfields dönüştürme.
#1
Merhaba ustalarım. Elimde c programlama dilinde yazılmış bir record tipi var. Bu record tipinde bazı değişkenlere bitfield atanmış bunun karşılığını delphide bulamadım. İnternette bu konu hakkında pek kaynakta bulunmuyor.


C record şu şekilde.

typedef struct
{
   int                    com_port;
   META_COMM_BAUDRATE     baudrate[12];    
   META_FLOWCTRL          flowctrl;     
   FBOOT_META_ARG         boot_meta_arg;    
   unsigned int           ms_connect_timeout; 
   unsigned int           usb_enable: 1;  
   unsigned int           InMetaMode: 1;    
   unsigned int           escape: 1;       
   unsigned int           close_com_port: 1; 
   META_MODE_TRACE_PARA_T trace_para;    
   unsigned int           channel_type: 4;  
   META_COMM_TRACE_PARA_T commTrace;    
} Req;

Bunu delphi olarak nasıl çevirebilirim. Yardımcı olan ustalarıma şimdiden çok teşekkür ederim.
Cevapla
#2
Kaynak yok derken? Tüm yazılım dili kaynakları değişken tipleri tanımıyla başlar.

C dilinde ilgilendiğiniz tipin özelliği, sınırları inceleyip karşı dilde bu özellikleri içeren karşılığı ararsınız. 

Unsigned dediği (-) değer alamaz 0'dan başlar ve gider. 

Eğer sadece değişken olarak kullanılacaksa 
maksimum değeri geçmemek kaydıyla byte'dan (0..254) başlayıp uint64'e kadar uygun tipi kullanabilirsiniz. 

Bir veri bloğu kayıt veya bir dosyadan okuma vb rezervasyon/structure için ise tam ne uzunluk gerekliyse ihtiyaç öyle belirlenir ona net karşılık geleni kullanmalısınız. Yoksa blok olarak gelen veride odak sorunu yaşanır sıra kaydırması sorunu çıkar. 

Nasıl aradığınızı bilmiyorum ama bu ve benzeri durumlar için bkz. Embarcadero type karşılık tablosu
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(31-01-2021, Saat: 12:31)mrmarman Adlı Kullanıcıdan Alıntı: Kaynak yok derken? Tüm yazılım dili kaynakları değişken tipleri tanımıyla başlar.

C dilinde ilgilendiğiniz tipin özelliği, sınırları inceleyip karşı dilde bu özellikleri içeren karşılığı ararsınız. 

Unsigned dediği (-) değer alamaz 0'dan başlar ve gider. 

Eğer sadece değişken olarak kullanılacaksa 
maksimum değeri geçmemek kaydıyla byte'dan (0..254) başlayıp uint64'e kadar uygun tipi kullanabilirsiniz. 

Bir veri bloğu kayıt veya bir dosyadan okuma vb rezervasyon/structure için ise tam ne uzunluk gerekliyse ihtiyaç öyle belirlenir ona net karşılık geleni kullanmalısınız. Yoksa blok olarak gelen veride odak sorunu yaşanır sıra kaydırması sorunu çıkar. 

Nasıl aradığınızı bilmiyorum ama bu ve benzeri durumlar için bkz. Embarcadero type karşılık tablosu

Hocam cevap verdiğiniz için çok teşekkür ederim. Değişken çevirmeyi biliyorum ama bu recordda bazı değişkenlere değer atanmış.

usb_enable, InMetaMode, escape, close_com_port, protocol, channel_type

olanlara. Bunlar default değerler değil. Çünkü hex olarak yazdırdığımda yazdırdığım rakamlar çıkmıyor. Bit kaydırma durumu oluyormuş. Bunun delphi karşılığı hakkında pek kaynak bulamadım. Sorumu biraz yanlış sormuşum kusura bakmayın.
Cevapla
#4
(31-01-2021, Saat: 12:53)seci20 Adlı Kullanıcıdan Alıntı:
(31-01-2021, Saat: 12:31)mrmarman Adlı Kullanıcıdan Alıntı: Kaynak yok derken? Tüm yazılım dili kaynakları değişken tipleri tanımıyla başlar.

C dilinde ilgilendiğiniz tipin özelliği, sınırları inceleyip karşı dilde bu özellikleri içeren karşılığı ararsınız. 

Unsigned dediği (-) değer alamaz 0'dan başlar ve gider. 

Eğer sadece değişken olarak kullanılacaksa 
maksimum değeri geçmemek kaydıyla byte'dan (0..254) başlayıp uint64'e kadar uygun tipi kullanabilirsiniz. 

Bir veri bloğu kayıt veya bir dosyadan okuma vb rezervasyon/structure için ise tam ne uzunluk gerekliyse ihtiyaç öyle belirlenir ona net karşılık geleni kullanmalısınız. Yoksa blok olarak gelen veride odak sorunu yaşanır sıra kaydırması sorunu çıkar. 

Nasıl aradığınızı bilmiyorum ama bu ve benzeri durumlar için bkz. Embarcadero type karşılık tablosu

Hocam cevap verdiğiniz için çok teşekkür ederim. Değişken çevirmeyi biliyorum ama bu recordda bazı değişkenlere değer atanmış.

usb_enable, InMetaMode, escape, close_com_port, protocol, channel_type

olanlara. Bunlar default değerler değil. Çünkü hex olarak yazdırdığımda yazdırdığım rakamlar çıkmıyor. Bit kaydırma durumu oluyormuş. Bunun delphi karşılığı hakkında pek kaynak bulamadım. Sorumu biraz yanlış sormuşum kusura bakmayın.

1 byte = 8bit olduğuna göre (0 0 0 0 0 0 0 0 / sembolize için ramdan 8 transistor kullanır) = 1 karakter (1byte)(char)

bitfield alanı gördüğüm kadarıyla yukarıdaki 8 haneli 0 basamaklı rakamın basamaklarını değişken durumunaa göre
(1basamak/yani1.0=usb_enable?true/false,1/0     2basamak/yani2.0=InMetaMode?true/false,1/0     3.basmak, 4, 5, 6, 7, 8,. )=1char

1 / 0 olarak değiştiriyor, böylece 8 farklı değiş ken durumunu 1 byte ile sembolize edebiliyorsunuz,
bu durumda siz oraya 8 basamaklı uzun bir sayısal değer tanımlayabilmek için integer atayabilirsiniz.

ancak kod içerisinde bu byte bitleri üzerindeki değişikli bir fonksiyon ile manuel yaptırmalı ve değişkene yazdırmalı, yada bu alanı kullanan tüm değişkenler için ayrı ayrı boolean tipinde alanlar açmalısınız

var
usb_enable:boolean;
InMetaMode:boolean;
escape:boolean; gibi..


veya TBits de kullanılabilir düşüncesindeyim veya array index leri const ile set ederseniz aşağıdaki gibide kullanılabilir.

const
usb_enable=1;
InMetaMode=2;

var
bitalani1:array[1..8] of boolean;
bitalani2:array[1..8] of byte;

bitalani[usb_enable] = true;
bitalani[InMetaMode] = false;

bitalani1[usb_enable] = 0;
bitalani1[InMetaMode] = 1;
Cevapla
#5
(31-01-2021, Saat: 13:32)hayalyilmaz43 Adlı Kullanıcıdan Alıntı:
(31-01-2021, Saat: 12:53)seci20 Adlı Kullanıcıdan Alıntı: Hocam cevap verdiğiniz için çok teşekkür ederim. Değişken çevirmeyi biliyorum ama bu recordda bazı değişkenlere değer atanmış.

usb_enable, InMetaMode, escape, close_com_port, protocol, channel_type

olanlara. Bunlar default değerler değil. Çünkü hex olarak yazdırdığımda yazdırdığım rakamlar çıkmıyor. Bit kaydırma durumu oluyormuş. Bunun delphi karşılığı hakkında pek kaynak bulamadım. Sorumu biraz yanlış sormuşum kusura bakmayın.

1 byte = 8bit olduğuna göre (0 0 0 0 0 0 0 0 / sembolize için ramdan 8 transistor kullanır) = 1 karakter (1byte)(char)

bitfield alanı gördüğüm kadarıyla yukarıdaki 8 haneli 0 basamaklı rakamın basamaklarını değişken durumunaa göre
(1basamak/yani1.0=usb_enable?true/false,1/0     2basamak/yani2.0=InMetaMode?true/false,1/0     3.basmak, 4, 5, 6, 7, 8,. )=1char

1 / 0 olarak değiştiriyor, böylece 8 farklı değiş ken durumunu 1 byte ile sembolize edebiliyorsunuz,
bu durumda siz oraya 8 basamaklı uzun bir sayısal değer tanımlayabilmek için integer atayabilirsiniz.

ancak kod içerisinde bu byte bitleri üzerindeki değişikli bir fonksiyon ile manuel yaptırmalı ve değişkene yazdırmalı, yada bu alanı kullanan tüm değişkenler için ayrı ayrı boolean tipinde alanlar açmalısınız

var
 usb_enable:boolean;
InMetaMode:boolean;
escape:boolean; gibi..


veya TBits de kullanılabilir düşüncesindeyim.

Hocam cevap verdiğiniz için teşekkür ederim. Bu değişkenleri dll çağırmada kullanıyorum boolean değişkenler malasef olmadı. Byte olarak ayarladım ve oldu ama dediğim gibi bitfields olayı olduğu için istediğim sonucu vermedi. Dll normal olarak hataya düşüyor. TBits inceledim ama o sadece doğru yada yanlış çeviriyor anladığım kadarı ile malasef ondada başarılı olamadım.
Cevapla
#6
(31-01-2021, Saat: 13:45)seci20 Adlı Kullanıcıdan Alıntı:
(31-01-2021, Saat: 13:32)hayalyilmaz43 Adlı Kullanıcıdan Alıntı: 1 byte = 8bit olduğuna göre (0 0 0 0 0 0 0 0 / sembolize için ramdan 8 transistor kullanır) = 1 karakter (1byte)(char)

bitfield alanı gördüğüm kadarıyla yukarıdaki 8 haneli 0 basamaklı rakamın basamaklarını değişken durumunaa göre
(1basamak/yani1.0=usb_enable?true/false,1/0     2basamak/yani2.0=InMetaMode?true/false,1/0     3.basmak, 4, 5, 6, 7, 8,. )=1char

1 / 0 olarak değiştiriyor, böylece 8 farklı değiş ken durumunu 1 byte ile sembolize edebiliyorsunuz,
bu durumda siz oraya 8 basamaklı uzun bir sayısal değer tanımlayabilmek için integer atayabilirsiniz.

ancak kod içerisinde bu byte bitleri üzerindeki değişikli bir fonksiyon ile manuel yaptırmalı ve değişkene yazdırmalı, yada bu alanı kullanan tüm değişkenler için ayrı ayrı boolean tipinde alanlar açmalısınız

var
 usb_enable:boolean;
InMetaMode:boolean;
escape:boolean; gibi..


veya TBits de kullanılabilir düşüncesindeyim.

Hocam cevap verdiğiniz için teşekkür ederim. Bu değişkenleri dll çağırmada kullanıyorum boolean değişkenler malasef olmadı. Byte olarak ayarladım ve oldu ama dediğim gibi bitfields olayı olduğu için istediğim sonucu vermedi. Dll normal olarak hataya düşüyor. TBits inceledim ama o sadece doğru yada yanlış çeviriyor anladığım kadarı ile malasef ondada başarılı olamadım.

integer deneyebilirsiniz.
Cevapla
#7
Ustalarım sorun çözüldü ve mantığını anladım. Sorun yaşanlar için alıntı açıklama şu şekilde.



Alıntı:Bit alanları
Yapılar içinde bit alanı adı verilen elemanlar kullanabiliriz. Bir bit alanını kullanarak, bir byte veya kelimeye bit seviyesinde işlem yapabiliriz. Bir byte veya kelime içinde yer alan bit'lere erişmek için yapıları kullanabiliriz. Bit alanı, bir yapının bit olarak uzunluğunu belirleyen özel bir yapı elemanıdır.

Bit alanları, birden fazla Doğru/Yalnış değerini bir byte içine yükleme, bazı aygıtlara bir byte içindeki bit'ler yoluyla bilgi gönderme ve bit seviyesinde işlem gerektiren şifreleme işlemleri için kullanılır. Bir bit alanının genel yapısı aşağıda gösterilmektedir:


struct adı {
 veri-türü adı:boyut;
 veri-türü adı:boyut;
 .
 .
 .
 veri-türü adı:boyut;
} değişken-listesi;

Yukarıda yer alan veri-türü ifadesi int veya unsigned int bir değer olmalıdır. 1 bit uzunluğunda olan bir bit alanı mutlaka unsigned int bir değer olarak tanımlanmalıdır. Bunun nedeni tek bir bit'in işaret biti içermesinin mümkün olmamasıdır. adı ifadesi bit alanının adını, boyut ifadesi ise bit alanının boyutunu göstermektedir. Bir yapı içindeki bit alanlarına tıpkı diğer yapı elemanları gibi erişilir.

Bir bit alanın değeri 1 ile 16 bit arasında tanımlanmalıdır.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Online Xslt Editör | Base64 Resim Dönüştürme ahmet6513 5 1.461 08-08-2025, Saat: 12:30
Son Yorum: ahmet6513
  Qreport dan pdf e dönüştürme noname101 15 8.099 28-06-2022, Saat: 06:52
Son Yorum: erkutolga
Question Delphi de xml dosyalarını jsona dönüştürme XmlToJson delphicim 1 1.299 16-06-2022, Saat: 09:27
Son Yorum: ugorkem
  Timestamp dönüştürme serdal_aksoy 4 2.621 30-01-2021, Saat: 01:02
Son Yorum: serdal_aksoy
  String diziyi Json Veriye Dönüştürme - Çözüldü KarahanMesut 8 4.811 10-11-2020, Saat: 20:33
Son Yorum: pro_imaj



Konuyu Okuyanlar: 1 Ziyaretçi