dizideki byteları komple sıfırlamak

Başlatan ziyaretci, 03 Haziran 2012, 16:21:21

ziyaretci

 merhaba

int abc[]={0b1011000,0b1011000,0b1011000,0b1011000};


ben bu diziyi program içerisinde nasıl bir komut kullanarak dizi içerisindeki bütün byteları komple 0x00 yaparım?

esensoy

tek bir satırda yapılıyor mu bilmiyorum,
döngü ile yaparsak;

for (i=0;i<4;i++) abc[i]=0;

i yi yukarıda tanımlaman lazım,
4 dizi büyüklüğünü gösteriyor
En tehlikeli an "zafer" anıdır.

ziyaretci

Alıntı yapılan: emresensoy - 03 Haziran 2012, 17:38:00
tek bir satırda yapılıyor mu bilmiyorum,
döngü ile yaparsak;

for (i=0;i<4;i++) abc[i]=0;

i yi yukarıda tanımlaman lazım,
4 dizi büyüklüğünü gösteriyor

Eyw.



 

bocek

1 ya da 0. işte 'bit'ün mesele..

muuzoo

Döngülerde artırma yerine azaltma kullanırsanız daha verimli bir kod olur. Ayrıca doğrudan sıfır yüklemektense kendisiyle xor işlemine tabi tutmak daha hızlı sonuç verir diye hatırlıyorum  emin değilim denemek lazım.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

esensoy

sıfır ile bir eş gibi duruyor,
fakat bariz memset kullanmak lazım:

....................    for (i=0;i<4;i++) abc[i]=0; 
033A:  CLRF   11
033C:  CLRF   10
033E:  CLRF   0F
0340:  CLRF   0E
0342:  MOVF   11,F
0344:  BNZ   0374
0346:  MOVF   10,F
0348:  BNZ   0374
034A:  MOVF   0F,F
034C:  BNZ   0374
034E:  MOVF   0E,W
0350:  SUBLW  03
0352:  BNC   0374
0354:  MOVLW  36
0356:  ADDWF  0E,W
0358:  MOVWF  FE9
035A:  MOVLW  00
035C:  ADDWFC 0F,W
035E:  MOVWF  FEA
0360:  CLRF   FEF
0362:  MOVLW  01
0364:  ADDWF  0E,F
0366:  BTFSC  FD8.0
0368:  INCF   0F,F
036A:  BTFSC  FD8.2
036C:  INCF   10,F
036E:  BTFSC  FD8.2
0370:  INCF   11,F
0372:  BRA    0342
....................     
....................    for (i=4;i>0;i--) abc[i]=0; 
0374:  CLRF   11
0376:  CLRF   10
0378:  CLRF   0F
037A:  MOVLW  04
037C:  MOVWF  0E
037E:  MOVF   0E,F
0380:  BNZ   038E
0382:  MOVF   0F,F
0384:  BNZ   038E
0386:  MOVF   10,F
0388:  BNZ   038E
038A:  MOVF   11,F
038C:  BZ    03AE
038E:  MOVLW  36
0390:  ADDWF  0E,W
0392:  MOVWF  FE9
0394:  MOVLW  00
0396:  ADDWFC 0F,W
0398:  MOVWF  FEA
039A:  CLRF   FEF
039C:  MOVLW  FF
039E:  ADDWF  0E,F
03A0:  BTFSS  FD8.0
03A2:  ADDWF  0F,F
03A4:  BTFSS  FD8.0
03A6:  ADDWF  10,F
03A8:  BTFSS  FD8.0
03AA:  ADDWF  11,F
03AC:  BRA    037E
....................     
....................    memset(abc,0,sizeof(abc)); 
03AE:  CLRF   FEA
03B0:  MOVLW  36
03B2:  MOVWF  FE9
03B4:  CLRF   00
03B6:  CLRF   02
03B8:  MOVLW  04
03BA:  MOVWF  01
03BC:  BRA    01C0
En tehlikeli an "zafer" anıdır.

mufitsozen

Alıntı yapılan: bocek - 04 Haziran 2012, 11:24:09
memset(abc,0,sizeof(abc));

bir kac konuya dikkat cekmek isterim.

- maksat sifirlamak(clear) ise memset yerine memclr daha cabuk/dogru olur.

ornek portable bir kod degil.

- memset'e parametre char * olmasi lazim, o yuzden abc'yi (char *) ile cast etmek lazim. Kullandiginiz compiler int ile char arasinda fark gozetmiyor olabilir ama 8 yerine 16/32 bir bir MCUya gecerseniz kod ya yanlis calisir, yada warning/error verebilir.
-  int buyuklugu 1den farkli ise dizinin sadece bir kismina 0 yazilabilir (yukardaki nedenden). o yuzden uzunluk sizeof(dizi) * sizeof(int) diye hesaplanmali.

or: memclr((char *)abc, sizeof(abc)*sizeof(int) ); 
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

bocek

memclr fonksiyonu ccs c'de tanımlı mı bilmiyorum ama kılavuzda bulamadım.

iddialaşmak değil niyetim tartışmak ve doğruyu bulmak onu belirteyim öncelikle.
memset fonksiyonunun yaptığı, bellekte, sizin verdiğiniz kadar byte'a verdiğiniz değeri yazmak.
yani sizeof(abc) dediğimiz zaman zaten abc'ye kaç byte ayrıldıysa o kadar byte'e 0 yazılıyor.
yani kullandığımız sistemde int için kaç byte kullanılıyorsa zaten sizeof(dizi) dediğimiz zaman
dizi_boyutu * int_için_ayrılan_alan
kadar bir büyüklük hesaplanmıyor mu?
1 ya da 0. işte 'bit'ün mesele..

esensoy

memclr ccs te görünmüyor,

ccs te char ile int in büyüklükleri aynı, 8 bit,
16/32 bit mcu derleyicilerinin bir kısmında char 8 bit iken int 16 bit ile ifade edilebiliyor,
mufitsozen bundan bahsediyor,
portable değil diyor, yani sen bu kodu yarın öbür gün başka bir işlemci ve onun derleyicisine taşırsan hata alırsın diyor
En tehlikeli an "zafer" anıdır.

bocek

mufitsozen'in neden bahsettiğini anlıyorum. ben de diyorum ki:
diyelim kullandığmız sistemde int için 2 byte ayrılıyor.
sizeof(abc) fonksiyonu bize 4*2 = 8 byte büyüklük verecek ve biz bu 8 byte'i 0 ile dolduracağız.
sistemimiz int için 4 byte ayırıyor diyelim
sizeof(abc) -> 4*4 = 16 byte alan bildirecek ve biz bu 16 byte'i 0 ile dolduracağız.

sizeof diye bir operatörün çıkış amacı bu zaten. sistemde o değişken için ne kadar 'byte' yer ayrılıyor onu vermek.
memset fonksiyonu sadece dizilerde değil struct'larda da kullanılıyor biliyorsunuz.
1 ya da 0. işte 'bit'ün mesele..