プロが教えるわが家の防犯対策術!

お世話になっています。よろしくお願いします。
C言語にあるSwitch case文を、Switch Case を使わずに、SwitchCase関数を作りたいのですが、自分にはハードルが高かったように思い、どのようにすればいいのか、具体的にご指南ご教授願えればと思いました。ほかの言語でも応用が利くほうがいいので、ポインタは使わない方向でお願いいたします。
よろしくお願いいたします。

質問者からの補足コメント

  • どう思う?

    情報不足すいませんでした。
    理想を言えば、オリジナルのSwitch Case文と同じなのが理想ですが、引数は、分岐の個数と分岐の条件式。返り値は、各分岐での演算の結果。でどうでしょうか?分岐の条件式は、分岐の個数に応じて設定します。
    また不備があれば、ご指摘願います。
    よろしくお願いいたします

      補足日時:2015/10/13 20:12
  • どう思う?

    回答くださりありがとうございます。
    同等ではなくてもいいので、似たものでということです。
    よろしくお願いいたします

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/10/13 20:14
  • どう思う?

    情報不足すいませんでした。
    引数は、分岐の個数と分岐の条件式。返り値は、各分岐での演算の結果。でどうでしょうか?分岐の条件式は、分岐の個数に応じて設定します。
    また不備があれば、ご指摘願います。
    よろしくお願いいたします

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/10/13 20:16
  • どう思う?

    Caseは、使わないのではなく、引数がいるのでつけたもので、caseを実装可能でしたらお願いします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/10/13 20:36
  • うーん・・・

    回答くださりありがとうございます。
    x = switchcase(式0, 定数1, 式1, 定数2, 式2, 定数3, 式3);
    ⇒この形にこだわっているわけではありません。ただ、オリジナルと同機能のものが不可能とのコメントをいただいたので、そういう表現をしました。この形でもいいので、実装できれば、どのようにすればいいのかご教授願います。

    No.4の回答に寄せられた補足コメントです。 補足日時:2015/10/13 21:09
  • うれしい

    回答くださりありがとうございます。
    ソースコード助かります。本当にありがとうございます。
    1つだけ質問させてください。
    プロトタイプ宣言は、この場合どう書けばいいでしょうか?
    x = switchcase(式0, 分岐個数, 定数1, 式1, 定数2, 式2, 定数3, 式3, デフォルト値);
    と書けばいいでしょうか?お願いいたします。

    No.5の回答に寄せられた補足コメントです。 補足日時:2015/10/13 22:16
  • どう思う?

    No5.の回答の補足に抜けていました。一般化したい場合の、プロトタイプ宣言です。つまり、分岐個数がn個の場合をお願いいたします。すると、定数n・式n・・・ということになります。
    よろしくお願いいたします。

      補足日時:2015/10/13 22:23
  • うーん・・・

    誤解を招く書き方をしてしまい申し訳ありません。
    このswitchcaseを、サブルーチンのようにして使いたかったのです。ご指示してくださった書き方だと、あらかじめ分岐の個数がわかっている場合になりますよね。分岐がわからない場合でも対応できるといいなと思っていました。私の最初の書き方がわかっていなかったので、申し訳ありません。こういう場合はどうなるのか(話が変わってしまっているように思います。すいません)、たびたびすいませんがご教授願います。

    No.6の回答に寄せられた補足コメントです。 補足日時:2015/10/13 23:07
  • うーん・・・

    回答くださりありがとうございます。
    実は、switch caseがない言語で開発しています。すると必然的に、if else の連発になります。コードが長くなり、非常にわかりにくく、かつ重いのです。そこで、switchcaseを作ろうと思いました。
    本当はマイナーな言語を出して質問したかったですが、社外秘のところもあるのでかけませんでした。そこである程度知っているC言語の場合、として質問をしました。これが理由です。

    No.9の回答に寄せられた補足コメントです。 補足日時:2015/10/14 19:45

A 回答 (11件中1~10件)

こんな感じで。


さっき書いたのは、分岐個数が抜けてました。どれにも一致しなかったらデフォルト値が返ると言うことで。

x = switchcase(式0, 分岐個数, 定数1, 式1, 定数2, 式2, 定数3, 式3, デフォルト値);


#include <stdio.h>
#include <stdarg.h>

int switchcase(int expr, int count, ...){
va_list args;
int i;
int c, v;

va_start(args, count);
for(i=0; i<count; i++){
c = va_arg(args, int);
v = va_arg(args, int);
if(expr==c){
return v;
}
}
return va_arg(args, int);
}


main(){
printf("Enter 0-9:");
printf("%d\n",
switchcase(getchar(),
10,
'0',0,
'1',1,
'2',2,
'3',3,
'4',4,
'5',5,
'6',6,
'7',7,
'8',8,
'9',9,
-1));
}
この回答への補足あり
    • good
    • 0

そもそも switch だって「あらかじめ分岐の個数がわかっている場合」なんだけどなぁと思いつつついでに.



「分岐がわからない場合」というのが「どれだけあるのかプログラムを書いている時点ではわからない場合」というのであれば配列を使うのが自然かな. もちろん線形リストとか B木とかをがんばって作っても構わんけど.
    • good
    • 0

1つ名称について提案したい.



結果的に「ある式の値を評価しそれが x1 なら y1 を, x2 なら y2 を, (以下同様) を返す」ということになるのであれば
selectvalue
のような名前の方が体を表していると思う. 少なくとも switch文のような汎用的な動作は不可能なのだから, 「switch文を思い起こさせるような名前」は避けるべきではないだろうか.

なお, #5 の関数は規格上未定義動作になります (va_start を使った場合, その同じ関数内で va_end を使う必要がある). そのことを合わせると
int selectvalue(int expr, int count, int defaultvalue, ...);
というプロトタイプの方が安全かもしれません (count は unsigned int なり size_t なりにすべきなのかもしれんがとりあえず無視).
    • good
    • 0

>>C言語にあるSwitch case文を、Switch Case を使わずに、SwitchCase関数を作りたいのですが


どうして、このようなことを思いつかれたのでしょうか?

No.7の方が言われているように、No.7のケースではSwitchCase関数は実装できません。
従って、汎用的なSwitchCase関数は作れません。というのが、私の回答になりますが、
どうして、このようなSwitchCase関数を作りたくなったのかということに、非常に興味があります。
差し支えなければ、その理由を教えていただけませんでしょうか。
この回答への補足あり
    • good
    • 0

>このswitchcaseを、サブルーチンのようにして使いたかったのです。



Cにはサブルーチンがないので、関数が他の言語でのサブルーチンの働きをします。
Cの基本文法は一通りご存じかと思っていましたが、そうではないのでしょうか?

>ご指示してくださった書き方だと、あらかじめ分岐の個数がわかっている場合になりますよね。

呼び出す時点では、分岐の個数は分かっていますよね?
個数がわからないと引数を書けないですが。
あるいは、Cをあまりご存じないということで、可変個引数の関数という物をご存じないですか?
printfのように引数の数を何個ででも自由に呼び出せる関数です。
可変個引数の関数でも、個数を示す引数は可変個引数部分の前に必要です。
    • good
    • 0

switch (x) {


default:
y = 1;
case 1:
z = 3;
}
はどうすればいいんだろう.
    • good
    • 1

プロトタイプ宣言は、関数定義のあたまの部分を書けばいいです。


C言語の基本ですが、ご存じないでしょうか。
この場合は、
int switchcase(int expr, int count, ...);
です。
この回答への補足あり
    • good
    • 0

補足の、「分岐の条件式」と「各分岐での演算の結果」というのが意味不明です。



switch(式0){
case 定数1:
x = 式1;
break;
case 定数2:
x = 式2;
break;
case 定数3:
x = 式3;
break;
}
を、
x = switchcase(式0, 定数1, 式1, 定数2, 式2, 定数3, 式3);
と書きたいと言うことだとすると、似たものは出来ると思いますが、すべての式は関数呼び出し時に評価されることが大きな違いです。
この回答への補足あり
    • good
    • 0

C言語をはじめとする殆どの言語は静的コンパイル言語ですから、この場合caseの個数は静的。

これをcaseを使わずにということですから、if に続いて else if をどんどんつなげればよいだけでは?
そういう意味ではなくてですか?

分岐の個数を渡すのであれば、その時点でSwitch文とは異なる機能を求めていることになります。
で、分岐の個数を渡すだけでなくcaseの値に相当する物も配列で渡す必要があるでしょう。場合によっては以上、以下、未満、より大きい、の条件も。
この回答への補足あり
    • good
    • 0

同等の機能は関数では無理です。

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!