• ベストアンサー

switch文かif文か?

スイッチ(SW50~SW80)を押したら、それに対応したコマンドを送る。というものを作っています。 スイッチはスライドスイッチなので、 1)ON(0)の間だけコマンドを出して、OFF(1)は止める。 2)ONしている間に別のスイッチが入ったら止める。 という風に組みたいのですが、中々上手くいきません。 8ピンのスライドスイッチなのですが、1~4はIDとして、5~8をコマンドとして使います。 なので、1~4は絶対にONになります。とすると、2)にしたいとき、defaultが使えなくて…if文を入れたらややこしくなりました。 もっと簡潔に、かつ解りやすく書くにはどうしたらいいでしょうか? #define SW1 input(PIN_C0) // ID #define SW2 input(PIN_C1) // ID #define SW3 input(PIN_C2) // ID #define SW4 input(PIN_C3) // ID #define SW50 PIN_C4 #define SW60 PIN_C5 #define SW70 PIN_C6 #define SW80 PIN_C7 uchar LED_ON(void){ uchar DATA; DATA=0x50; DATA+=0x4F; DATA+=0x4E; return(DATA); } uchar LED_OFF(void){ uchar DATA; DATA=0x50; DATA+=0x4F; DATA+=0x46; return(DATA); } void LED(void){ ulong n; uchar DATA; while(1){ WriteFSKbyte(DATA); switch(n){ case SW50:DATA=LED_ON(); if((SW50||SW60||SW80)==0){ DATA=LED_OFF(); } break; case SW60:while(SW60==0){ DATA=LED_ON(); DelayMs(1000); DATA=LED_OFF(); DelayMs(1000); if((SW50||SW70||SW80)==0) break; } break; case SW70:while(SW70==0){ DATA=LED_ON(); DelayMs(500); DATA=LED_OFF(); DelayMs(500); if((SW50||SW60||SW80)==0) break; } break; case SW80:DATA=LED_OFF(); if((SW50||SW60||SW80)==0){ DATA=LED_OFF(); } break; } } }

noname#85552
noname#85552

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.7

> sw1234=input_c(); これだと、sw1234には、SW5~SW8のデータも入ってしまいます。 > sw1234=input_c() & 0x0f; とすることで、下位4bit=SW1~SW4のデータだけが入れられます。 あと、スイッチと入力値の対応が「ON=0、OFF=1」だとのことですから、 > case 0x01:WriteFSKbyte(0x01);break; これだと逆に「SW1がOFFでSW2~4がONの時」って条件になってしまいます。 SW1だけがONな場合の条件は、SW1だけ0でSW2~SW4を1にした「case 0x0E:」になります。 で、話を戻しますが > SW1~4のどれかが入っていないと、SW5~8は出力しない この条件は「どれか」でいいのでしょうか? SW1~SW4が二つ以上入ってもかまわないが、 「SW1~SW4が全てOFFの場合」(sw1234が0x0Fの時)は処理しない でいいのだったら、   while (1) {     sw1234 = input_c() & 0x0f;     sw5678 = input_c() & 0xf0;     switch(sw5678) {     case 0xe0: /* SW5~SW8 のうち、SW5だけON */       if (sw1234 != 0x0F) LED_ON();       break;     case 0xd0: /* SW5~SW8 のうち、SW6だけON */       if (sw1234 != 0x0F) LED_ON();       break;     … と記述できます。 SW1~SW4のうちでも「一つだけしかONにしてはいけない」だったら、 > SW1(ON)+SW5(ON)=LED_ON > SW2(ON)+SW5(ON)=LED_ON > SW1(ON)+SW8(OFF)=LED_OFF こういう条件を全てリストアップしたうえで、 以下のように、複数のスイッチの状態をまとめて判断するという方法もあります。 (switch文では、break せずに case を複数並べることで、複数の条件に対し処理をまとめることができます)   int sw;   while(1){     sw = input_c();     switch(sw){     case 0xEE: /*二進11101110、SW1(ON)+SW5(ON) */     case 0xED: /*二進11101101、SW2(ON)+SW5(ON) */     case 0xEB: /*二進11101011、SW3(ON)+SW5(ON) */     case 0xE7: /*二進11100111、SW4(ON)+SW5(ON) */       /* SW1~SW4のうちどれか1つだけONで、SW5~SW8 のうちSW5だけがONの場合 */       LED_ON();       break;     case 0xDE: /*二進11011110、SW1(ON)+SW6(ON) */     case 0xDD: /*二進11011101、SW2(ON)+SW6(ON) */     case 0xDB: /*二進11011011、SW3(ON)+SW6(ON) */     case 0xD7: /*二進11010111、SW4(ON)+SW6(ON) */       /* SW1~SW4のうちどれか1つだけONで、SW5~SW8 のうちSW6だけがONの場合 */       LED_ON();       break;     …

noname#85552
質問者

お礼

再三にわたり、ありがとうございます。 > case 0x01:WriteFSKbyte(0x01);break; の部分、書き込みした後で気づきました…これじゃ逆でしたね。 SW1~4ですが、 ・SW1のみONの時~SW1-4がONの時 までの15通り(全OFFも含めれば16ですね)がありますので、最初に提示して頂いたサンプルがぴったりでした。 SW1234をいれてからという概念が強すぎたので、SW5678の中に入れる事を考えていませんでした。勉強になります。 以下、実機で動かしたものになります。サンプルそのままですが… void LED(void){   int sw1234,sw5678;   set_tris_a(0x00);   set_tris_c(0xFF);   set_tris_d(0xFF);   output_low(PIN_A0);   while(1){     sw1234=input_c()&0x0F;     sw5678=input_c()&0xF0;     switch(sw5678){       case 0xE0:         if(sw1234 != 0x0F)         output_high(PIN_A0);         break;       ~~ 略 ~~       case 0x70:         if(sw1234 != 0x0F)         output_low(PIN_A0);         break;       default:         output_low(PIN_A0);         break;     }   } } output(PIN_A0)の出力が、設計上の都合で low(0)=OFF、high(1)=ON になっています。

その他の回答 (6)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.6

たぶん PIN_C0 とかの表記はPIC用のCコンパイラの一つ、 CCS-C の独自の表記ですね。 そのあたりの状況説明無しでは話が見えません。 あと、行き当たりばったりに書くのではなく、C言語の仕様とPICの制御をちゃんと把握してコードを書かないといけません。 ○switch 文の構文について switch文の構文では、 > switch(n){ > case SW50: …(a)… break; > case SW60: …(b)… break; > … > } という表記は、 > if (n == SW50) { >   …(a)… > } else if (n == SW60) { >   …(a)… > } else … という表記と同じ意味です。 質問者さんのコードでは、変数nに何の値も代入してないため、意味のある分岐になりません。 あと、ここで case に指定する値は「定数」でなければいけませんが、 だからといって、SW50 とかを入れてますけど、それではポートの入力チェックにもなりません(後述) ○SW50~SW70(PIN_C4~PIN_C7) これらは(おそらく)「ピン番号」を意味する「定数」です。ですから、 > if((SW50||SW60||SW80)==0){ > while(SW60==0){ これらのコードは、ポートの入力値の調査はまったく行わない「定数の比較」です。 0でない定数を0と比較してますから、if文が実行されることはありませんし、whileループもまったく回りません。 ○LED_ON / LED_OFF 関数 > uchar LED_ON(void){ > uchar DATA; > DATA=0x50; > DATA+=0x4F; > DATA+=0x4E; > return(DATA); > } この関数は、 > uchar LED_ON(void) { > return 0xED; > } と等価です。(0xED= 0x50 + 0x4F + 0x4E) 単にそういう計算を行っているだけで、ポートの入出力は何もしていません。 また、変数 DATA に代入した値は、全体の while ループの冒頭で1度だけ WriteFSKbyte 呼び出しに使っているだけですので、 その中の 変数 DATA への代入は、大半が意味のないものになってます。 推測ですが、おそらく > void LED_ON(void){ >   WriteFSKbyte(0x50); >   WriteFSKbyte(0x4F); >   WriteFSKbyte(0x4E); > } というのが、お望みのコードじゃないですか? ○複数のスイッチの状態をまとめて処理する方法 以上のことを踏まえて、多分に推測が入ってますが、質問者さんのコードの意図を、 私の最初の回答に述べたようなswitch の使い方で、CCS-C 向けに書き直すと、 void LED_ON(void){   WriteFSKbyte(0x50);   WriteFSKbyte(0x4F);   WriteFSKbyte(0x4E); } void LED_OFF(void){   WriteFSKbyte(0x50);   WriteFSKbyte(0x4F);   WriteFSKbyte(0x46); } void LED(void) {   int sw5678;   while (1) {     sw5678 = input_c() & 0xf0;     /*0xf0は2進数で 11110000b、ポートCの上位4bitのみ取り出し (sw5678 の上位4bitはポート入力値そのままで、sw5678の下位4bitは0になる)*/     switch(sw5678) {     case 0xe0:       /* 2進数で1110000b 、上位4bit中5bit目だけが0 =SW5~SW8のうち、SW5だけがオンの時の処理をここに*/       LED_ON();     case 0xd0:       /* 2進数で1101000b 、上位4bit中6bit目だけが0 =SW5~SW8のうち、SW6だけがオンの時の処理をここに*/       LED_ON();       DelayMs(1000);       LED_OFF();       DelayMs(1000);     case 0xb0:       /* 2進数で1011000b 、上位4bit中7bit目だけが0 =SW5~SW8のうち、SW7だけがオンの時の処理をここに*/       LED_ON();       DelayMs(500);       LED_OFF();       DelayMs(500);     case 0x70:       /* 2進数で0111000b 、上位4bit中8bit目だけが0 =SW5~SW8のうち、SW8だけがオンの時の処理をここに*/       LED_OFF();     default:       /* スイッチが全部オフか、2つ以上がオンの場合 の処理をここに*/       LED_OFF();     }   } } といった感じになるんじゃないでしょうか。

noname#85552
質問者

お礼

再度ありがとうございます。 C言語を始めて日が浅いのですが、入りがccs-cなのでこれが当たり前のものだと認識していました…申し訳ありません。 知識も経験も無い中で、早く組まねばという焦りだけできてしまっているので、意味の無いモノが出来上がってしまったと痛感しています。御忠告ありがとうございます。もっとよく考えようと思います。 そんな中で、的確に答えて頂いてとてもありがたいです。 if文・switch文にそのような相互関係があると初めて理解しました。凄く解りやすく、助かります。 LED_ON、_OFFの関数ですが、まさにその通りだと思われます。 transmitterとreceiverでタイミングを合わせないとわかりませんが、サンプルに近いのでいけるのでは、と。 LED関数も、少し変えて(WriteFSKbyteがまだ使えないので、output_low・high(PIN)で代用して)実機で動かしてみました。 動かして、プログラムの内容が理解できました。 SW1(ON)+SW5(ON)=LED_ON SW2(ON)+SW5(ON)=LED_ON SW1(ON)+SW8(OFF)=LED_OFF ・・・・・・ SW1~4(全OFF)+SW5~8(どれかON)=出力なし というふうになるんですが、SW1~4のどれかが入っていないと、SW5~8は出力しないようにしたいのです。とすると、>上位4bitのみ取り出しという部分は使えなくなりますよね?11110000bだと、下位4bitは入力では認識されないということで合っていますか?

noname#85552
質問者

補足

ちなみに、提示していただいたサンプルを使って、別体で考えるとsw1~4はこうなったのですが… void Switch_C(void){   int sw1234;     while(1){       sw1234=input_c();       switch(sw1234){       case 0x01:WriteFSKbyte(0x01);break;       case 0x02:WriteFSKbyte(0x02);break;    ~~ 略 ~~       case 0x0F:WriteFSKbyte(0x0F);break;       default:break;     }   } }

回答No.5

ハードウェアとか組み込み系はよくわからないので、どう難しいのかわからないのですが、 素直にスィッチ一つずつを関数にして強制的に実行するようにしてみてはだめなのですか? スイッチ一つを一つの機能だと考えて設計すると幸せになれそうな気がするのですが。。。 僕のイメージはこんな感じです。 void LED() {   uchar DATA;   void send_SWnn()   {     if( ON判定 )     {       DATA=LED_ON();       DelayMs(500);       DATA=LED_OFF();       DelayMs(500);     }   }   send_SW50();   send_SW60();   send_SW70();   send_SW80(); } 上はコマンドを送信するというフローイメージがわかないので、 とりあえず、順番に垂れ流しですが、その辺は調整してください。

noname#85552
質問者

お礼

回答ありがとうございます。 提示していただいたサンプルを使うとすると、 send_SWnn()がスイッチ一つ一つの関数になり、それを組み合わせたときの動作をそれぞれ決める。 という事で合っていますか?

回答No.4

No.1です。 >試しに書いてみたのですが、このような書き方でよいでしょうか? 一つ目(外側)のswitch文と二つ目(内側)のcaseが同じ定義を使用しているようですが、 外側は「今現在の『状態』」で内側は「発生したイベント(この質問ならキーのON/OFF?)」になりますから、同じ定義はそのまま使用することはできないと思います。 また、「キーの同時押し」というイベントも考えられますよ。

noname#85552
質問者

お礼

再度ありがとうございます。 同じ定義を使用…とは、どの部分を指しているのでしょうか? 同時押しも考えてみたのですが、私はどうも考えが固着してしまっているようで、これ以外にわかりません…

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

LED関数内でのnへの代入がどこにもないし、 SW50~SW80の定義がよくわからない(switchのcaseには定数しか使えませんが、if文中ではポートの入力データかのように使ってる)ので、 元のコードの意味が読み取れないというか、私が取り違えてるかもしれませんが、 ポートからの入力で、8bitのうち上位4bitを見たい。下位4bitは無視したい。ということだったら、 擬似コードで書くと、 int data; while (1) {   data = ポート入力値 & 0xf0; /*0xf0は2進数で 11110000b、上位4bitのみ取り出し (data の上位4bitはポート入力値そのままで、下位4bitは0になる)*/   switch(data) {   case 0xe0: /* 2進数で1110000b 、上位4bit中5bit目だけが0 =5bit目のスイッチだけがオン*/     …   case 0xd0: /* 2進数で1101000b 、上位4bit中6bit目だけが0 =6bit目のスイッチだけがオン*/     …   case 0xb0: /* 2進数で1011000b 、上位4bit中7bit目だけが0 =7bit目のスイッチだけがオン*/     …   case 0x70: /* 2進数で0111000b 、上位4bit中8bit目だけが0 =8bit目のスイッチだけがオン*/     …   default: /* スイッチが全部オフか、2つ以上がオンの場合 */     …   } } といった感じで処理を簡潔化できます。

noname#85552
質問者

お礼

回答ありがとうございます。 ulong n; はswitch(n)として使っているのですが、それだけでは駄目でしょうか?どこかに出力させた方がいいのでしょうか? SW50~SW80 については、PICを使っていまして、PICのポートCの4PINから7PINを割り当てています。最初はSW1~SW8(input付)・SW10~SW80(PINのみ)まであったのですが、使わないので省略しました。 PIN番号で書くとcaseに使えないし、他の場所でもSWが出てくるので、解りやすくするために定義しています。 下位4bit(ID)につてですが、例えば SW1(ID側)のみONの時、かつSW5(コマンド側)のみがONの時、SW5に割り当てられた動作をする。 ということで、ID側は全てが常にONになっているわけではなく、1つずつ使いたいのです。 説明も理解も足らず、申し訳ありません。

  • wathavy
  • ベストアンサー率22% (505/2263)
回答No.2

スイッチの状態と、そのスイッチ自身の変化をスイッチ読み込みに使おうとすると、非常に難しいと思います。 1個だけ、トリガーとして、ON のときの立ち上がりで、(あるいはOFFへの立下り)他のスイッチを読み込み、それを変数(ビット数がわからないので答えにくいのですが)に入れて、スイッチ文で処理するとすっきりしませんか?

noname#85552
質問者

お礼

回答ありがとうございます。 実は、これは送受信無線(SPI通信)で使うものなのですが、その時にtransmitter側から送る一部なんです。 無線で送るときにクロックの立下りでデータ送信しているのですが、実のところよく理解できてません。 >一個だけトリガとして~ というのは、どういったことなのでしょうか? 理解が足らず、申し訳ありません…

回答No.1

>もっと簡潔に、 「簡潔」=「簡単」=「ソースを短く」には無理です。 >かつ解りやすく書くにはどうしたらいいでしょうか? 一例として「ステートマシン」という手法があります。 何らかの動作を行っている状態に対してそれぞれ番号を振り管理する方法です。 質問文に当てはめれば 各SWが「押されている状態」、「押されていない状態」をそれぞれ「状態(ステート)」とします。 SWの入力状態に変化があった場合を「イベント」とします。 それぞれの状態に対して、どのイベントが発生したかによって処理を分けることによって実現する方法です。 但し、構造自体は大きくなります。 例) switch( 現在の状態 ) {  case SW5_ON中:    switch( 発生したイベント )    {     case SW_6が押された       送信の停止       状態を停止状態にする      break;     case SW_8が押された      break;    }     break;  case SW6_ON中:   ・   ・ }

noname#85552
質問者

お礼

回答ありがとうございます。 試しに書いてみたのですが、このような書き方でよいでしょうか? エラーにはなりませんでした。 while(1){    WriteFSKbyte(DATA);      switch(sw){        case SW50:           DATA=LED_ON();           switch(asw){              case SW60:              case SW70:              case SW80:DATA=LED_OFF();break;           }           break;        case SW60:           while(SW60==0){              DATA=LED_ON();              DelayMs(1000);              DATA=LED_OFF();              DelayMs(1000);              switch(asw){                 case SW50:                 case SW70:                 case SW80:DATA=LED_OFF();break;              } 以下続く…

関連するQ&A

  • if else文

    ドットマトリクスLEDを3個のスイッチで切り替えて点灯できるようにしたいのですが、うまく動作できません。プログラムのPORTA、C,D,EのところでLEDが点灯する形を決めています。 PORTB0,1,2でスイッチの制御をしています。 たぶん if~else のところがおかしいと考えているのですがいろいろ調べたのですが原因がわかりません。 何か解決のヒントでも気になったとこでもいいのでよろしくおねがいします。 #include<pic.h> __CONFIG,_CONFIG1 , _DEBUG_ON , _LVP_OFF , _FCMEN_OFF , _IESO_OFF , _BOREN1_OFF , _BOREN0_OFF , _CPD_ON , _CP_ON , _MCLRE_ON , _PWRTE_OFF , _WDTE_ON , _FOSC2_OFF , _FOSC1_ON , _FOSC0_OFF; __CONFIG,_CONFIG2 , _WRT1_ON , _WRT1_ON , _BOR4V_OFF; void ioport(void); void main() { ioport(); while(1) { if(RB0 == 0)         {    PORTA = 0b111000; PORTB = 0b00000111; PORTD = 0b11111110; PORTC = 0b11111111; PORTE = 0b001; break; } else if(RB1 == 0) { PORTA = 0b111000; PORTB = 0b00000111; PORTD = 0b11111100; PORTC = 0b00111111; PORTE = 0b001; break; } else if(RB2 == 0) { PORTA = 0b111000; PORTB = 0b00000111; PORTD = 0b10101010; PORTC = 0b01010101; PORTE = 0b001; break; } else { PORTA = 0b111000; PORTB = 0b00000000; PORTD = 0b11111111; PORTC = 0b11111111; PORTE = 0b001; break; } } } void ioport(void) { TRISA = 0; TRISB = 0b00000111; TRISC = 0; TRISD = 0; TRISE = 0; }

  • ヘッダ(*.h)に定義したテーブルでの出力制御について

    現在、いわゆる組み込み制御の技術者としてC言語によるマイコン制御のソフトウェア開発を行っていて、スイッチの出力を制御する仕組みを考えています。 状態(2状態):S00、S01 スイッチ(2スイッチ):SW1、SW2 出力:ON、OFF 実際には状態もスイッチも出力もこれより多く複雑なのですが、簡単に説明させていただきます。 自分としては簡単にswitch文で制御すればいいだろうと思い、設計していたのですが、それでは無駄にコーディングが必要になってしまうのでダメだと上司に言われ、ヘッダ(sw_out.h)でテーブルを持って、Cソース(sw_out.c)では簡単なコードにできないか?と言われました。その方が後のメンテナンスが簡単だと言われました。 上司の言っていることは分かるのですが、実際にコードとしてどのように記述したらいいのか分かりません。 そこで、このような制御を実現するC言語(*.h,*.c)の記述の方法を分かる方、御教授よろしくお願いします。 以下に、スイッチ出力の判定を行うテーブルと自分の最初の考え方のソースコードを記します。 ******S00****S01** SW0*SW_ON**SW_OFF* SW1*SW_OFF*SW_ON** [sw_out.h] #define S00 0x00 /* 状態0 */ #define S01 0x01 /* 状態1 */ #define SW0 0x00 /* スイッチ0 */ #define SW1 0x01 /* スイッチ1 */ #define SW_OFF 0x00 /* 出力OFF */ #define SW_ON 0x01 /* 出力ON */ [sw_out.c] #include "sw_out.h" int sw_out(int state, int sw) { int out; out = SW_OFF; switch(state){ case S00: switch(sw){ case SW0: out = SW_ON; break; case SW1: out = SW_OFF; break; } break; case S01: switch(sw){ case SW0: out = SW_OFF; break; case SW1: out = SW_ON; break; } break; } return out; }

  • C言語プログラミングについて…Arduinoを用い

    C言語プログラミングについて…Arduinoを用いて、以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを作りました。次にその使用した「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、いろいろと変えてみたのですが、シリアルモニタを見るとif文を用いた時に「RedSwitch」が押された「回数」ではなく連続的に?押した「秒数」をカウントして困ってます。どうやったら改善できるのでしょうかか?ご教授お願いしたします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void) { digitalWrite(13,LED_ON); delay(500); digitalWrite(13,LED_OFF); delay(500); } void loop() { unsigned char SW_CNT=0,SW_TIME=0,i; while( (SW_TIME<100) || (SW_CNT==0) ) { sw_check(); if ( SW_RedSwitch==2 ) { SW_RedSwitch=0; SW_CNT++; SW_TIME=0; } SW_TIME++; delay(20); } for (i=1 ; i<=SW_CNT ; i++) { blink(); } }

  • Ardinoについて…

    C言語プログラミングについて…以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを「switch case」文で作ったものがある。この「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、うまくスイッチの押した回数が読み込めません。となたか解説お願いします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void)

  • H8-3048 LED点灯プログラムについて

    初歩的な質問で申し訳ございません。 H8-3048でスイッチ入力によってLEDを点灯させたいのですが、 スイッチの押されたタイミングによって LEDの点灯状況が変化してしまいます。 何故でしょうか?回路側の問題?ご助言お待ちしています。 参考までに下にLED点灯ソースコードを示します。 #include <3048f.h> #define led P1.DR.BYTE /*P1.DR.BYTEをledに割り当て*/ #define sw1 PA.DR.BIT.B2 #define sw2 PA.DR.BIT.B3 void initport(void) /*入出力端子設定*/ { P1.DDR = 0xff; PA.DDR = 0x00; } int main( void ){ initport(); led = 0x00; /*初期値設定*/ while(1){ if( sw1 == 1 ){ /*sw1が押された時LED点灯*/ led = 0xff;} else if( sw2 == 1 ){ /*sw2が押された時LED消灯*/ led = 0x00;} else{ led;} /*それ以外はLEDの状態保持*/ } }

  • stringのデータではswitch文は使えない?

    String^ id_data_str というのに、"313131313131"というデータを入れて、下のGet_idというクラスを作って、”111111”というデータをとれるようにしたいと思ったのですが、 Get_id^ Get_id; Get_id_get(id_data_str); switch文は整数型出ないとダメだというエラーが出てきたのですが、このようなクラスのプログラムはダメなんでしょうか?何か解決方法などいただけませんでしょうか? namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Get_id { private: public: String^ ID_str; String^ ID_str_complete; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Get_id() { ID_str = "test"; ID_str_complete = "test"; } void Get_id_get(String^ ID_str) { int i; String^ test_str; String^ str_data; Get_id(); ID_str_complete = ID_str; for(i=0;i<6;i++) { test_str = ID_str->Substring( i*2, 2 ); switch(test_str) { case "30": str_data = "0"; break; case "31": str_data = "1"; break; case "32": str_data = "2"; break; case "33": str_data = "3"; break; case "34": str_data = "4"; break; case "35": str_data = "5"; break; case "36": str_data = "6"; break; case "37": str_data = "7"; break; case "38": str_data = "8"; break; case "39": str_data = "9"; break; case "61": str_data = "A"; break; case "62": str_data = "B"; break; case "63": str_data = "C"; break; case "64": str_data = "D"; break; case "65": str_data = "E"; break; case "66": str_data = "F"; break; default; str_data = "_"; break; } if(i==0) ID_str_complete = str_data; else ID_str_complete += str_data; } } }; }

  • switch文について

    お世話になります。switch文について教えてください。 分岐の条件を複数使用することは出来ますか。 たとえば switch(a) [ case "1": if (x == "0") { document.write(1x0); } else if (x == "1") { document.write(1x1); else { document.write(1x); break; } case "2": if (x == "0") { document.write(2x0); } else if (x == "1") { document.write(2x1); else if (y == "0") { document.write(2y0); else { document.write(2x); break; ] という構文は可能ですか。 case 2でx yの二分岐しても可能ですか。 教えてください。

    • ベストアンサー
    • Java
  • if文で困っています。

    define A 5 void main(void) int i; scanf("%d", &i); if (i <= A){ このような形をつくったのですが、if文のところで質問があります。 「数字をいくつか入力し、その入力したデータ数が5つより少ないときに・・・」というようなプログラムにしたいのですが、この場合、「入力した数値が5.0以下であるときに・・・」というプログラムになっているのではないかと、困っています。どちらが正しいのでしょうか?

  • トグルスイッチについて

    トグルスイッチについて。 単極3投、2極3投、3極単投、3極双投、3極4投、4極双投等の 詳しくわかりやすい説明をお願いしたいです。 わかりやすい図等を載せているHPとかもご存知でしたら 宜しくお願い致します。 あと、LED2列を下記ABCまたはDも含めたような点灯制御をしたい時 A---LED1…on LED2…on B---LED1…on LED2…off C---LED1…off LED2…off D---LED1…off LED2…on(出来ればこれも) 1個のトグルスイッチで可能でしょうか? 可能な場合、どのようにすれば良いかご教授お願い致します。 また、上記をもう1セット増やして2セットの場合に 全ての動作を1個のスイッチで制御は不可能でしょうか? 宜しくお願い致します。

  • スイッチの接続 LEDの点灯

    先ほど同様の質問をさせていただきましたが、図や説明に誤りが ありましたので訂正して再質問させていただきます。 車にとある機器を取り付け、そのON/OFFスイッチを付けるのですが、 訳あってその機器の電源ON時にスイッチ付属のLEDランプをOFF、 電源OFF時にLEDランプをONにしたいと思っております。 ひとつだけ条件があって、今持っているスイッチをどうしても 使いたいのです。(当方の車に合わせたい為) http://www.amon.co.jp/seihi/seihi_data.php?id=12291 恐らくリレーもしくはインバータのような物を使うことになると 思うのですが、どうすればいいのか分からず困っております。 スイッチ自体は単純な2接点、3端子のON/OFFスイッチです。 よろしくお願いします。 添付した図の配線は通常(電源ON時にLEDもON)の状態です。