Switch Case sorusu

Başlatan baran123, 25 Ağustos 2015, 21:04:38

yldzelektronik

#15
Düzeltme: Her ne kadar debug yaparken aşağıdaki cümleyi doğrulayacak şeylerle karşılaşsam da;
c de switch case her case değeri için tarama yapmıyor.Switch içine girdikten sonra ilgili case değerine zıplıyor.

Şimdi baktığımda söylediğimin aksiymiş;
http://www.cagataycebi.com/programming/c_programming/c_programming_4.html
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

muhittin_kaplan

#16
şimdi switch yada select çalışmasında bir farklılık yok,

aranan değer bulunduğunda yapılması istenen yapılır ve ve select yada switch den çıkılır. ama bu arama işlemi 300 çeşitşe ve en sondaysa en sona kadar gitmek zorundadır. hiç bukadar uzun selectlerim olmadı (zaten pekde kullanmam açıkcası) ama olsa ne yapardım, düşünelim.

mesaj birleştirme:: 26 Ağustos 2015, 23:13:21

sql ve veritabanı biliyormusunuz hocam ?
300 kayıtlı basit bir veritabanı hazırlarım, doğrudan çekerim
aslında vb.net kullansanız veritabanını ram de de oluşturabilirsiniz (dataset,XML)

z

Successful Approximation Register yapısına bir göz at.

256 seçenek olsun. En fazla 8... bilemedin 12 karşılaştırma ile şak diye ilgili hedefe gidebilirsin.


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

Burak B

#18
Derleyiciler genelde siwtch/case için jump table oluşturmayı tercih eder. Böylece verilen parametre ile index hesaplayarak direkt offsete sıçrar. Yani oturup acaba gelen a mı B mi diye bakmaz. Çünkü switch yapısındaki durum programcı açısından görecelidir. İşlemci açısından kıyaslama ihtiyacı doğuran bir yapısı yoktur.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

pea

Renesas HEW'ın derleyicisi tek tek karşılaştırmayı tercih ediyor:
  29 	switch(command){
     FE2516 39FC                          MOV.W       -4H[FB],R0
     FE2518 DA24                          JEQ         FE253DH
     FE251A E991                          CMP.W       #1H,R0
     FE251C DA64                          JEQ         FE2581H
     FE251E E992                          CMP.W       #2H,R0
     FE2520 9A04                          JNE         FE2525H
     FE2522 CEA700                        JMP.W       FE25CAH
     FE2525 E993                          CMP.W       #3H,R0
     FE2527 9A04                          JNE         FE252CH
     FE2529 CEB800                        JMP.W       FE25E2H
     FE252C E994                          CMP.W       #4H,R0
     FE252E 9A04                          JNE         FE2533H
     FE2530 CE0701                        JMP.W       FE2638H
     FE2533 E995                          CMP.W       #5H,R0
     FE2535 9A04                          JNE         FE253AH
     FE2537 CE2501                        JMP.W       FE265DH
     FE253A CE5701                        JMP.W       FE2692H

Optimizasyon en yüksek seviyedeyken de durum aynı.

Burak B

@pea olabilir vardır bir bildikleri demek ki. Diğer derleyiciler nasıl yapıyor birkaç örnek ile bakalım

x86 - Derleyici Bilinmiyor
jmp     ds:off_10071F28[eax*4] ; switch jump
...
...
                align 4
off_10071F28    dd offset loc_10071D4A ; jump table for switch statement 
                 dd offset loc_10071D5B  
                 dd offset loc_10071D67
                 dd offset loc_10071D89
                 dd offset loc_10071D95
                 dd offset loc_10071DA6
                 dd offset loc_10071DB7
                dd offset loc_10071DC3
                 dd offset loc_10071DD4
                dd offset loc_10071DE5
                 dd offset loc_10071E1F
...
...
...



ARMCC -O3
ER_IROM1:08009890                 PUSH            {R4,LR}
ER_IROM1:08009892                 CMP             R1, #5  ; switch 5 cases
ER_IROM1:08009894                 BCS             def_8009896 ; jumptable 08009896 default case
ER_IROM1:08009896                 TBB.W           [PC,R1] ; switch jump
ER_IROM1:08009896 ; ---------------------------------------------------------------------------
ER_IROM1:0800989A jpt_8009896     DCB 3                   ; jump table for switch statement
ER_IROM1:0800989B                 DCB 0x10
ER_IROM1:0800989C                 DCB 0x13
ER_IROM1:0800989D                 DCB 0x16
ER_IROM1:0800989E                 DCB 0x19
ER_IROM1:0800989F                 ALIGN 2


ARMCC -O0
ER_IROM1:0800A510                 PUSH            {R4-R6,LR}
ER_IROM1:0800A512                 MOV             R6, R0
ER_IROM1:0800A514                 MOV             R4, R1
ER_IROM1:0800A516                 MOV             R5, R2
ER_IROM1:0800A518 pconn = R6                              ; netconn *
ER_IROM1:0800A518 event = R4                              ; netconn_evt
ER_IROM1:0800A518 len = R5                                ; u16_t
ER_IROM1:0800A518                 CMP             event, #5 ; switch 5 cases
ER_IROM1:0800A51A                 BCS             def_800A51C ; jumptable 0800A51C default case
ER_IROM1:0800A51C                 TBB.W           [PC,event] ; switch jump
ER_IROM1:0800A51C ; ---------------------------------------------------------------------------
ER_IROM1:0800A520 jpt_800A51C     DCB 3                   ; jump table for switch statement
ER_IROM1:0800A521                 DCB 0xF
ER_IROM1:0800A522                 DCB 0x14
ER_IROM1:0800A523                 DCB 0x19
ER_IROM1:0800A524                 DCB 0x1E
ER_IROM1:0800A525                 ALIGN 2


ARMv7 (Bilinmeyen Derleyici)
MCU_FLASH:08002570 028 18 F8 01 4B                             LDRB.W  R4, [R8],#1     ; Load from Memory
MCU_FLASH:08002574 028 5B F8 04 7B                             LDR.W   R7, [R11],#4    ; Load from Memory
MCU_FLASH:08002578 028 24 2C                                   CMP     R4, #0x24       ; switch 37 cases
MCU_FLASH:0800257A 028 00 F2 72 80                             BHI.W   def_800257E     ; jumptable 0800257E default case
MCU_FLASH:0800257A
MCU_FLASH:0800257E 028 DF E8 04 F0                             TBB.W   [PC,R4]         ; switch jump
MCU_FLASH:0800257E
MCU_FLASH:0800257E                             ; ---------------------------------------------------------------------------
MCU_FLASH:08002582 028 13                      jpt_800257E     DCB 0x13                ; jump table for switch statement
MCU_FLASH:08002583 028 1E                                      DCB 0x1E
MCU_FLASH:08002584 028 1E                                      DCB 0x1E
MCU_FLASH:08002585 028 1E                                      DCB 0x1E
MCU_FLASH:08002586 028 1E                                      DCB 0x1E
MCU_FLASH:08002587 028 1E                                      DCB 0x1E
MCU_FLASH:08002588 028 1E                                      DCB 0x1E
MCU_FLASH:08002589 028 1E                                      DCB 0x1E


C18  (PIC18F2550)
740:               switch (g_lcdinfo.index) {
19C8  0105     MOVLB 0x5
19CA  51C0     MOVF 0xC0, W, BANKED
19CC  0A05     XORLW 0x5
19CE  E014     BZ 0x19F8
19D0  0A06     XORLW 0x6
19D2  E017     BZ 0x1A02
19D4  0A07     XORLW 0x7
19D6  E00B     BZ 0x19EE
19D8  0A04     XORLW 0x4
19DA  E004     BZ 0x19E4
19DC  0A01     XORLW 0x1
19DE  E002     BZ 0x19E4
19E0  0A03     XORLW 0x3
19E2  E10F     BNZ 0x1A02



XC8 (PIC18F4520)
0712  6E1F     MOVWF data, ACCESS
317:           {
318:               switch (data)
0714  D00B     BRA 0x72C
072C  501F     MOVF data, W, ACCESS
072E  0AC7     XORLW 0xC7
0730  B4D8     BTFSC STATUS, 2, ACCESS
0732  D7F3     BRA 0x71A
0734  0A17     XORLW 0x17
0736  B4D8     BTFSC STATUS, 2, ACCESS
0738  D7F6     BRA 0x726
073A  0A06     XORLW 0x6
073C  B4D8     BTFSC STATUS, 2, ACCESS
073E  D7EB     BRA 0x716
0740  0A0A     XORLW 0xA
0742  B4D8     BTFSC STATUS, 2, ACCESS
0744  D7EE     BRA 0x722
0746  0A01     XORLW 0x1
0748  B4D8     BTFSC STATUS, 2, ACCESS
074A  D7E5     BRA 0x716
074C  0A03     XORLW 0x3
074E  B4D8     BTFSC STATUS, 2, ACCESS
0750  D7E6     BRA 0x71E
0752  0A39     XORLW 0x39
0754  B4D8     BTFSC STATUS, 2, ACCESS
0756  D7E7     BRA 0x726
0758  0A17     XORLW 0x17
075A  B4D8     BTFSC STATUS, 2, ACCESS
075C  D7E2     BRA 0x722
075E  0A06     XORLW 0x6
0760  B4D8     BTFSC STATUS, 2, ACCESS
0762  D7DD     BRA 0x71E
0764  0A0A     XORLW 0xA
0766  B4D8     BTFSC STATUS, 2, ACCESS
0768  D7DC     BRA 0x722
076A  0A01     XORLW 0x1
076C  B4D8     BTFSC STATUS, 2, ACCESS
076E  D7D5     BRA 0x71A
0770  0A03     XORLW 0x3
0772  B4D8     BTFSC STATUS, 2, ACCESS



ARM EABIv5 (Derleyici muhtemelen RVCT )
ROM1:10021A26                 MOVS            R3, R1  ; Rd = Op2
ROM1:10021A28                 BLX             $Ven$AA$L$$__ARM_switch8 ; switch 8 cases
ROM1:10021A28 ; ---------------------------------------------------------------------------
ROM1:10021A2C                 DCB 7
ROM1:10021A2D                 DCB 5, 0xA, 0xE, 0x11, 0x15, 0x1A, 0x20, 0x23 ; jump table for switch statement
ROM1:10021A35                 ALIGN 2
ROM1:10021A36
ROM1:10021A36 loc_10021A36                            
ROM1:10021A36                 MOVS            R4, R2  ; jumptable 10021A28 case 0
....

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

Case ile ele alınacak durumlarda hız uğruna romdan çok kaybedilebilir.

0,1,2,5,10 için ya da 50 51 52 55 gibi durumlar için tablo çok mantıklı fakat

0,1,2,5,10, 60, 100, 250 için tablo çok büyür.


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