• ベストアンサー

Cでアルゴリズムの差し替えができるようにするには?

C++ならstrategyパターンを実装した経験はあるのですが、Cで同じような事ってできるのでしょうか?開発中のアルゴリズムなので、差し替えや変更に強い設計にしたいのですが、どうすればいいのかわかりません。どなたかお知恵をお願いします。

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

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

関数へのポインタを差し替えればいいだけでは? 例えば、 int (*algorithm)(void); // 関数へのポインタ int algorithmA(void){ 適当に } int algorithmB(void){ これまた適当に } int algorithmC(void){ また別の方法で } に対して、 if( ほげほげ )  alogrithm = algorithmA; else if( ふがふが )  algorithm = algorithmB; else  algorithm = algorithmC; として、条件に応じてアルゴリズムを切り替えて、 algorithm(); これで実行。  引数をとりたい時は、構造体へのポインタにしておきたいですね。 引数を構造体へのポインタにしておけば、引数を増やしたい時構造体をいじるだけで済みますから。

aneja
質問者

お礼

ご回答ありがとうございました。 関数ポインタですか。あまりやったことがないですが、勉強します。参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

ストラテジーパターンの用途が違いますね。 #2でも指摘されていますが、動的に変更する必要がないのならば 関数のモジュール強度をあげるように設計していけばすむ話です。 なぜなら、「差し替えや変更」ができないのは、 モジュール結合度が強くなってしまってモジュール強度が弱くなっているためだからです。 んでストラテジーパターンは、 その場の状況に合わせて処理の組み合わせを構築していくことにありますから 「開発中のアルゴリズムなので、差し替えや変更に強い」なんていうのとは 真逆で、確定した仕様(設計)が必要になります。 # どの場面で何をする必要があるのかというシナリオが必要 というわけで、実現方法についてですが 可能な限り変数を宣言しないようにして、 コーディングしていけばモジュール強度を上げることが出来ます。 # もちろんスコープは最小限に目的なので # グローバル変数や変数の変な使い回しはだめですよ? あとは、関数のポインタを利用するケースですが 構造体で擬似的なクラスを作成して、生成用のファクトリ関数と呼び出しようのdefineマクロがあれば ストラテジーっぽいことが可能じゃないかと思います。 # 関数のポインタ型は tyepdef しておくと使いやすいです。

aneja
質問者

お礼

ご回答ありがとうございました。 質問が説明不足で申し訳ありませんでした。「開発中」というのは、全体処理がまだまだ変わる(改善される)可能性があるという意味で、仕様は現段階で決まっております。今は確定しているAだけ実装するけれど、将来的にある条件下ではBにした方がいい性能が出る、というようになる可能性はあります。関数ポインタの勉強をします。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

動的に差し替えたいわけではなさそうですので、単純に呼び出す関数を変えるだけでよいのでは?

aneja
質問者

お礼

ご回答ありがとうございました。 質問があいまいで、申し訳ありませんでした。おっしゃる通り、動的に選択する必要がなければ置き換えるだけでいいですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 数字並び替え全パターン取得のアルゴリズム

    例えば5つの数字1,2,3,4,5の並び替えのパターンは5!=120通りあると思うのですが、このパターン全て取得するようなアルゴリズムはどういうものになりますでしょうか。 1,2,3,4,5 1,2,3,5,4 1,2,4,5,3 1,2,4,3,5 続く。。。。 これら並び替えのパターンを全て取得したい。 アルゴリズムの説明、又はアルゴリズムの名前が存在するようであれば教えていただけると幸いです。 実際には1000個程度の数字の並び替えパターン全てを何らかのコンピュータ言語を使い、アルゴリズムを実装したいと思っています。 よろしくお願いいたします。

  • タイピングゲームの曖昧入力アルゴリズムについて教えてください。

    こんにちは。 タイピングゲームの曖昧入力のアルゴリズムについて教えてください。 あれはどのように実装しているのでしょうか? すべてのパターンを保存しておくというのはさすがにスマートではないと思うので何かしらで判定してると思うのですが、どのように判定すればいいかわかりません。 わかる方お願いします!

  • アルゴリズムを変えるプログラム

    人工知能的な話です。プログラム自身に、プログラム自身へ(アルゴリズム的な)変更を加えることというのは可能でしょうか? (ある処理に対して、経験的な情報を元に処理の一部を経験に好ましいような処理に変更する) 具体的に実現が難しいとかいうことではなく、不可能であるか、カナリ厳しいかもれないが理論的には可能であるかということです。うまく説明できないのですがよろしくおねがいします。

  • Cプログラミングの関数電卓のアルゴリズムについてですが、

    Cプログラミングの関数電卓のアルゴリズムについてですが、 標準入力からの文字列式を、トークンに区切り、先頭から配列型スタックに格納して、計算を行う処理を考えていて、 a-b-cという処理のアルゴリズムに困っています。 どういった解決策があるのか教えて頂けませんか?? お願いします!! フローチャートを書くほどの事でも無いと思うので、僕が考えていたアルゴリズムを、文で記載しますが、できれば、このアルゴリズムからどうすれば解決できるかを考えて頂けたらとても助かります!! 1. 別のスタックを用意して、元々のをstack1,コピー用をstack2とし、stack1のトップからstack2に格納。(スタックの構造は二次元文字型配列) この場合、cからstack2に格納される。 2. 演算子を見つけると、その前後の数字をその演算子によって処理。 この場合なら、c-bという処理。 3. 計算結果を、cが格納されていた、演算子の前に格納。 4.引き続き、この操作を繰り返す。 これを考えてたんですが、実行すると、(c-b)-aという式になり、違う答えが出てしまいます。加算ならば影響はでません。 きちんと(-c-b)+a の処理をさせるにはどうしたら良いかがわからないです。 お願いします!! ※返事が多少遅れるかもしれませんが、すみません!!

  • Strategyパターンを用いた実装について

    Strategyパターンを用いた実装について 現在Javaを勉強しており、 Strategyパターンを用いた以下の実装を考えています。 public class UseStrategy { private Strategy strategy; public void doSomthing(int num) { switch (num) { case 0: strategy = new AlphaStrategy(); break; case 1: strategy = new BetaStrategy(); break; case 2: strategy = new GammaStrategy(); break; } // 変数strategyを用いて処理を続行していく // ... } private interface Strategy { public abstract void method_1(); public abstract void method_2(); } private class AlphaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } private class BetaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } private class GammaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } } つきましては、以下ご質問させてください。 (1)Strategyパターンの実装において、  上記UseStrayegyクラスのように、あるクラスの入れ子クラスとして  Strategyインターフェース及び、その実装クラスを実装する方法は  普通でしょうか?    それとも、入れ子クラスとしてではなく、Strategyインターフェース、  その実装クラスを全て 別クラスファイルに分けた方が良いのでしょうか? (2)例として、  BetaStrategy.method_2()とGammaStrategy.method_2()の処理が全く  同じだったとします。その場合、共通となる処理を一つのメソッド化し、  そのメソッドをBetaStrategy.method_2()とGammaStrategy.method_2()から  コールしたいと考えております。  その際、共通となる処理メソッドの実装箇所としては、以下のいずれが良いのでしょうか。   (A)Strategyインターフェースを抽象クラス化し、二つの共通処理メソッドを実装する。  (B)UseStrategyクラスに、共通処理を実装する。    それとも、上記の様なケースがある場合Strategyパターンは不適切でしょうか。 文面に分かりづらい面や、Javaのオブジェクト指向・デザインパターンについて 理解の乏しいところがあるかと思いますが、ご回答の程よろしくお願いいたします。

    • ベストアンサー
    • Java
  • pptファイルをswfに変換するアルゴリズム

    pptファイルをswfに変換するものはiSpringやJetsoft P2S Converterなどがありますが、 そのような変換ツールをC++言語などを使って自前で開発したいと考えております。 しかし、アルゴリズムなどがさっぱりわからず、どのように作れば良いかがわかりません。 そこで、どのようにしたら作れるか、仕組み、アルゴリズムなどが分かればご教授いただければとおもいます。 よろしくお願いします。

  • ツリー構造の比較のアルゴリズムを教えてください

    ディレクトリ構造の変更前と変更後の比較を行って、 どのフォルダがどこへ行ったかを判別するプログラムを作成したいのですが、どんなアルゴリズムにすればよいでしょうか? 変更前と変更後でディレクトリは1:1に対応しません。n:mや削除、追加など色んなパターンがあります。 ツリー構造(ディレクトリ構造)とは、以下のようなイメージのものです。 C:. ├─Acrobat │ ├─ActiveX │ ├─Browser │ ├─FileInfo │ ├─HowTo │ │ ├─ENU │ │ │ └─Images │ │ └─JPN │ │ └─Images │ ├─Javascripts

  • アルゴリズム??

    皆様のお知恵を拝借デス! 私はiMac8.6を使用しています。 先日あるオークションサイトで、ID登録等も済み、 いざ入札しようとした時に「不明な不正署名アルゴリズムを使用しています」 というエラー表示が出てそれ以上進める事ができませんでした。 これはどういう設定だから出るのですか? また、設定に問題があるとしたら、どのようにすればそのエラー表示が出なくなりますか? きっとプライバシー保護の為だと思いますが……。 当方、かなりの初心者ですのでわかりやすく教えて下さい!!

    • ベストアンサー
    • Mac
  • アルゴリズム系の問題知りませんか?

    再来週大学院試験を控えている者です。 入試の項目に「プログラミング(アルゴリズム)」と書いてあり、ある程度複雑なアルゴリズムを考えるような問題が出る事が予想されます。 きっと二分探索木やクイックソートのような問題が出るように思います。 アルゴリズムを考えるような問題としていい問題ご存じないでしょうか? アルゴリズムを考えるような問題としてはハノイの塔とかよいように思いますが ちょっと入試の問題としては出ないような気がします。 自分では他に線形リストやスタックなども勉強したんですが、 C,JAVA,Pascal,フォートランなどどの言語で回答してもよい事になっているので言語に限定した問題は出ないように思います。 90分で解く3問あるうちのプログラムは1つですから30分以内に解けるような問題のはずです。 (出題される可能性も考えていただければ幸いです)よい問題をご存知でしたら教えてください。 よろしくお願いします。

  • 組み合わせを作るアルゴリズム

    アルゴリズムについてうまい考えが浮かばず、お知恵を拝借できればと思い質問致しました。 要件は、値が100個ほど入った配列があり、この配列から任意の個数の値を取り出して処理をする、というものなのですが、とにかく全ての組み合わせを取り出したいのです。 例えば @data = (3, 6, 8, 6); という配列から2個取り出すとすれば、 (3, 6) (3, 8) (3, 6) (6, 8) (6, 6) (8, 6) という全6パターンが欲しいのです。(パターンの出現順は無視できます。) 順番違いはなくてよいので、たとえば (6, 3) というリストはなくて結構です。 また (3, 6) のように、全く同じリストが複数出現してもOKです。 取り出す個数が固定ならばforループのネストで処理のしようもあるのですが、任意ということでここの処理方法が浮かびません。 (ちなみにrは最大で10まで取り、できればforのネストも避けたいところなのですが。) このような処理に適した処理方法をご存知の方おられましたら、ぜひともご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • Perl