Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

make8(a,b); fonksiyonu

Başlatan ziyaretci, 06 Temmuz 2015, 22:08:28

ziyaretci

Merhaba, bu make8(a,b); fonksiyonunda 2. parametrede değişken kullandığımda hata veriyor. 8 bitlik char ve uint denedim olmadı. Düz decimal sayı girince sıkıntı olmuyor tabi.

baran123

make8() fonksiyonu 16 veya 32 bit değişkenlerden 8 bitlik değerler almak için kullanılır. Kullanımı şu şekildedir.

make8(degisken,offset)

degisken: 16 veya 32 Bit integer
offset: 0-3 arası değer. (16 için 0-1, 32 için 0-3)

long x=0x1234;
long y = 0x12345678;
int sekizBit;
sekizBit = make8(x,1); //sekizBit = 0x12 olur
sekizBit = make8(x,0); //sekizBit = 0x34 olur
sekizBit = make8(y,3); //sekizBit = 0x12 olur
sekizBit = make8(y,1); //sekizBit = 0x56 olur


Kaynak : http://www.teknobakis.com/ccs-c-ile-pic-programlama-bit-ve-byte-islemleri-dahili-fonksiyonlari#make8

ziyaretci

#2
Hocam buraya kadar sıkıntı yok. Ben 2. parametrede değişken kullanmak istiyorum. Ardarda yapacağım dönüşümler için bu fonksiyonu for döngüsüne sokmak istiyorum.

int a=1;
int16 z=0x1b0b;
int abc;
abc = make8(z,a);  // sonuç 1b

Ama bu şekilde kullanıma derleyici izin vermiyor. 2. parametre için illa tam sayının elle girilmesi isteniyor.

baran123

unsigned in8 a; // böyle denesek ?
olmadı kendi make8 fonksiyonunuzu yazabilirsiniz.

respected

Hocam anladığım kadarıyla 2.  parametrede değişken kullanarak farklı dataları almaya çalışacaksın. Farklı bir yöntemle
int a=1;
int16 z=0x1b0b;
int abc;

switch(a)
{
case 0:  abc = make8(z,0);
            break;
case 1:  abc = make8(z,1);
            break;
case 2:  abc = make8(z,2);
            break;
case 3:  abc = make8(z,3);
            break;

}

şeklinde yapabilirsin diye düşünüyorum.
Kolay gelsin

sadogan

#5
int a degeri 0 255 arasında bir sayı.
z ise 2 byte bir sayı
fonksiyona bu durumda en küçük 0 en büyük 1 olan bir değer girilmesi gerekiyor.
compiler buna itiraz ediyor.
a değişkenini int1 a; şeklinde tanımlarsan sorun çözülür diye düşünüyorum.


mesaj birleştirme:: 07 Temmuz 2015, 01:13:39

Şimdi denedimde olmadı

mir_as82

Hocam bence iki olasılık var,
Sistemin eğer 16 bit bir sistemse make8 fonksiyonu senden 0,1 değerlerini isteyebilir.
İkinci olarak ise oraya gireceğin değer compile time sabiti isteyebilir.
Zaten buna eşdeğermiş:  i8 = (((var >> ( offset * 8 )) & 0xff)

ziyaretci

O zaman çare yok demektir, direkt sayısal değeri tek tek gireceğiz.


Alıntı yapılan: respected - 06 Temmuz 2015, 22:54:51
Hocam anladığım kadarıyla 2.  parametrede değişken kullanarak farklı dataları almaya çalışacaksın. Farklı bir yöntemle
int a=1;
int16 z=0x1b0b;
int abc;

switch(a)
{
case 0:  abc = make8(z,0);
            break;
case 1:  abc = make8(z,1);
            break;
case 2:  abc = make8(z,2);
            break;
case 3:  abc = make8(z,3);
            break;

}

şeklinde yapabilirsin diye düşünüyorum.
Kolay gelsin


Hocam güzel çözüm. Bu şekilde yerden tasarruf edilebilir.

Ben neden 2. parametrede değişken kullanamadığımızı merak etmiştim. @mir_as82   "Zaten buna eşdeğermiş:  i8 = (((var >> ( offset * 8 )) & 0xff)" şeklinde bir bilgi sunmuş ama bir şey çıkaramadım. @mir_as82  biraz açıklarsanız sevinirim. Teşekkürler.

mufitsozen

Alıntı yapılan: erkantr67 - 10 Temmuz 2015, 19:26:11
O zaman çare yok demektir, direkt sayısal değeri tek tek gireceğiz.


Hocam güzel çözüm. Bu şekilde yerden tasarruf edilebilir.

Ben neden 2. parametrede değişken kullanamadığımızı merak etmiştim. @mir_as82   "Zaten buna eşdeğermiş:  i8 = (((var >> ( offset * 8 )) & 0xff)" şeklinde bir bilgi sunmuş ama bir şey çıkaramadım. @mir_as82  biraz açıklarsanız sevinirim. Teşekkürler.

cunku make8(degisken,offset) fonksiyon değil preprocessor macrosu,

o yuzden daha compiler calismaya baslamamis, degisken isimleri ile ilgili bilgi ortada yok vede

onceleride soyledigim gibi preprocessor degisken, pointer filan bilmez!

make8'i macro yerine bir fonksiyon olarak yaziniz (derleyicinizde varsa inline fonksiyon) sorun kalmasin. Genellikle inline fonksiyonlarda macrolarin yerine kullanilabilirler.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mir_as82

Sen make8(var, offset); yapinca arkada olan olaylari bilmen gerekir işin mahiyetini anlayabilesin.
Bir program CPU nun alip işleyebileceği birşey olabilmesi için bazi aşamalardan geçmesi gerekir. Bir kavramin ciktisi bir kavramin girdisi olur ve bu şekilde (bayrak yarisina benzeterek, veya elden ele oyununa) en son makina koduna dönüşür.
Biz kodu bir text editorde yazariz bu bildiğiniz yazidan farksizdir.
Bu yazilardan oluşan kelimeler dilin yapisna uygunsa (biz akilliyiz ama bilgisayar bizim gibi akilli değil, ona herşeyi eksiksiz söylememiz gerekir) bir sonraki aşamaya geçilir bu asama ise ön işlemci aşamasidir. Bu aşamada ise o yazdigimiz yazilarin içine kisa yolunu verdiğimiz dosyalar kopyalanip yapistirilir. Sizin make8 de de tam bu asama devrededir. Yani bizim yazimizda make8 vardır, bu yazi on işlemciye girdikten sonra onun yerine bu kopyalanir i8 = (((var >> ( offset * 8 )) & 0xff
On işlemcinin cikisi ise derleyiciye verilir. O halde derleyici i8 = (((var >> ( offset * 8 )) & 0xff bu ifadeyi görür.

tekosis

#10
make8 veya make16 gibi komutlar çok zor işler yapmıyor aslında. bu fonksiyon bunu desteklemiyor olabilir. bu durumda kendi fonksiyonunuzu da if deyimleri ile bit_test ile rahatlıkla yapabilirisiniz.

zaten komutun açıklamasında;
var is a 16 or 32 bit integer.
offset is a byte offset of 0,1,2 or 3.  denilmiş. eğer değişkeni kabul etse idi bunu belirtirlerdi.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

mehmet

Bu şekilde olmaz mı?
uint8_t myMake8(uint32_t var, uint8_t ofset)
{
      return (((var >> ( offset * 8 )) & 0xff;
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

mir_as82

Hocam zaten C standartlarında 32 bitlik bir değişken en fazla 31 defa sağa veya sola kaydırılabilir. Kaydırma negatif bir tamsayı da olamaz, 31 den büyükte olamaz, eğer olursa tanımsız davranış olmuş olur.
Ben senin yerinde olsam ya fonksiyonun içinde offset değişekenini kontrol ederdim. Veya sisteminin türüne göre o fonksiyona gönderilecek parametreyi enum türden bir değişken yapardım.