switch文のcaseがたくさんあるため、ソースファイルとして外だししたいと思っています。
ただ、switch文そのものはきちんと記述し、caseの部分だけを外だしできればと考えています。
例
switch (a)
{ case 1:
case 2:
:
:(たくさん続く)
処理A;
case 100;
case 101;
:
: (これまたたくさん続く)
処理B;
}
を
switch (a)
{
A_WO_SURU_JOUKEN /* この記述を外だししたい */
処理A;
B_WO_SURU_JOUKEN /* 同じく */
処理B;
}
といった具合にしてみたいということです。
ヘッダファイルを使う、defineでの記述で可能といったものを教えていただければ幸いです。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
defineを使用するのではなく、
分岐を判断する関数を作って
使用する方法はどうでしょうか?
以下 if文とswitch文を使用してみました。
-- 分岐を判断する関数 --
IsCaseA(int a)
{
switch(a)
{
case 1:
case 2:
・・・
return 1;
}
return 0;
}
IsCaseB(int a)
{
switch(a)
{
case 100;
case 101;
・・・
return 1;
}
return 0;
}
-- 本文 --
if( IsCaseA(a) )
{
処理A;
}
else if( IsCaseB(a) )
{
処理B;
}
これだと本文が短くなりますし、
将来 case の追加する場合も、行追加で容易に対応できます。
No.4
- 回答日時:
★アドバイス
・いろいろと分け方がありますが処理A、処理Bなどの部分をマクロ関数や普通に関数として
分離する方法が私が良く取る方法です。
例えば:
switch ( a ){
case 1:
case 2:
:
処理A;
:
case 100;
case 101;
:
処理B;
:
}
ならば
#define ShoriA()\
{\
:\
処理Aの本体;\
:\
}
#define ShoriB()\
{\
:\
処理Bの本体;\
:\
}
switch ( a ){
case 1: case 2: ShoriA(); break;
case 100: case 101: ShoriB(); break;
:
同様にする
:
}
その他:
・処理A、処理Bを関数にするよりは define で関数と同じような感じで定義します。
これを専用のヘッダファイルにでも保存するか、switch 文のある関数よりも上の方に
まとめて定義すればいいと思います。マクロ関数にする理由は変数スコープを考えて
関数よりも良いと思っただけです。C++ で『参照』を使えば関数やinline関数でも良い。
・またマクロ関数にするときに行末に必ず『\』文字を追加します。
このマクロ関数内で変数を宣言して利用することも出来ます。
あとマクロ関数の終わりのブロックで『break』を記述して switch 文の break を
なくしても見やすくなります。私の場合は次のキーワードを定義して利用しています。
#define CASE break;case
#define DEFAULT break;default
この2行を良く利用するヘッダに記述して include して次のように使っています。
switch ( a ){
CASE 1: case 2: ShoriA();
CASE 100: case 101: ShoriB();
:
CASE 200: case 201: ShoriZ();
DEFAULT: ShoriElse();
}
・switch文の case、default の多くは break を記述する分岐ですから break 付きの
CASE、DEFAULT を記号定数で定義して利用するわけです。ただ今回のような使い方は
CASE、case を2つ記述する事になるため case で統一した方が良いでしょう。
・break付きのCASE、DEFAULTを使うときは条件式が1つの場合に限ります。
つまり
switch ( a ){
CASE 条件式1: 処理;
CASE 条件式2: 処理;
CASE 条件式3: 処理;
:
CASE 条件式n: 処理;
DEFAULT: 残りの処理;
}
こんな感じの分岐です。
・以上。
defineにする時は\が必要なのですね。勉強になりました。
今回はcase文が多くなるパターンですので、もう少し見てみようと思います。
No.3
- 回答日時:
a の値が連番になるのであれば関数ポインタを使えますが?
関数ポインタ
http://wisdom.sakura.ne.jp/programming/c/c54.html
#include <stdio.h>
void kitty(void);
void sakura(void);
void hina(void);
int main() {
void (*po[])() = { kitty , sakura , hina };
int i;
printf("実行する関数の番号を指定してください 0~2>");
scanf("%d" , &i);
if ((i < 0) | (i > 2)) return 0;
(*po[i])();
return 0;
}
void kitty() {
printf("Kitty on your lap\n");
}
void sakura() {
printf("Card Captor SAKURA");
}
void hina() {
printf("LOVE HINA");
}
関数ポインタというのもあるのですね。
なかなか奥が深いです。
ただ今回は、上記であれば入力値が多くの種類があるので、どちらかといえば、iを用意する必要があるので、量は多くなりそうです。
勉強になりました。
ありがとうございます。
No.2
- 回答日時:
--
#define A_WO_SURU_JOUKEN \
case 1: case 2: case 3: case 4: case 5: \
case 6: case 7: case 8:
--
上記でquothさんのしたいことは出来るかと・・・
A_WO_SURU_JOUKEN をソースコードに組み込むと
case 1~8 で解釈されます。
因みにそんなにケースが大量にあるのならif文で範囲指定をする、
配列を使う・・・など別の方法を考えた方がスマートですね。
やはり大量にある場合は、if文か配列をつかった方が早い気がしてきました。(配列のほうがわかりやすいかな。)
ただ、difineを\でつなげないといけないというのは勉強になりました。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- JavaScript switch文は、if文みたいに最初の()内に式を2つ以上設定できませんか。 1 2022/07/27 14:07
- TOEFL・TOEIC・英語検定 This has not yet been proven to be the case for an 2 2022/06/20 13:56
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 先ほど、回答者様によって教えていただいたのですがどうしたらいいか分かりません。 ユーザーフォーム上に 2 2023/02/21 22:25
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
【Excel】特定の文字を含むセル...
-
メルカリのメルカードで買い物...
-
VBAでループ内で使う変数名を可...
-
switch の範囲指定
-
EXCEL VBA マクロ 実行する度に...
-
DoEventsがやはり分からない
-
VBA SaveChanges 上書きされない
-
VBの質問#if 0 then ってどう...
-
C言語 b += a ? 1 : 0; の意味
-
UMLでの例外処理
-
リョウ・・・量?料?
-
月度は何て読みますか?
-
iD
-
findは動くがfindnextがマクロ...
-
VBAでGetAsynckeyStatekのエラー
-
TextBoxに日付を自動的に入れる
-
ビープ音を連続して鳴らす
-
VB.NET Excelを読み込んでDataT...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
メルカリのメルカードで買い物...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
EXCEL VBA マクロ 実行する度に...
-
DoEventsがやはり分からない
-
UMLでの例外処理
-
月度は何て読みますか?
-
switch の範囲指定
-
VBの質問#if 0 then ってどう...
-
セルの値が0はクリアするマクロ
-
VB.NET Excelを読み込んでDataT...
-
Do~Loopした回数をカウントしたい
-
Loadイベント中にほかのイベン...
-
Select Case文でこのようなこと...
-
findは動くがfindnextがマクロ...
-
緊急です。 知り合いから50kgの...
-
リョウ・・・量?料?
-
理不尽、行き場のないイライラ...
おすすめ情報