2017-03-01 12 views
0

私はオンラインでコーディングの問題を抱えていますが、私は本当に効率的なテストを行うことができるシステムを考えました。私の計画はファイル名を文字列として使用して任意のsouce .cppファイルから関数を呼び出す

  1. にそれぞれの問題に問題を解決し、
  2. .txtファイルに結果を出力1つの機能を備えた個別の.cppファイルを与えている2コマンドを取る主な機能と.cppファイルを作成します行引数:文字列現在解決している問題のファイル名と、問題に使用するテストケースのファイル名の文字列。

main関数は、最初にテストケースを格納するFILE *と空の出力ファイルを作成する別のFILE *を作成します。次に、コマンドラインで指定された問題の.cppファイルから関数を呼び出します。

各問題のファイルの関数プロトタイプは次のようになります。

静的な無効問題(ファイル*のtest_case、FILEの*出力)。

アイデアは、テストケースを特定の問題に引き渡し、「問題」関数で結果を出力テキストファイルに書き込むことです。

特定の問題のテストケースを実行し、実行ごとに一意の出力ファイルを取得することに成功しました。

しかし、現在の主な問題は、.cppファイル名を引数として使用できるようにすることです。 C++では、ファイル名だけを使ってファイルから関数を呼び出す直接的な方法はないようです。私はプリプロセッサが.cppファイルを解析し、関数名を関数ポインタに変換することを知っています。実行時にこれを行う方法はありますか?つまり、.cppファイルをストリーミングして、関数プロトタイプに一致する行を検索し、その関数へのポインタを返すことができますか?ファイルの名前をその関数に関連付けるためにプリプロセッサをキューに入れるために使用できるマクロがありますか?

これまでの回答を検索してみると、最も簡単な解決策は、機能名と機能が一致するマップを作成することです。これは私にとって面倒で面倒なようです。コマンドラインでファイルの名前を設定するのではなく、問題を切り替えるたびにメインファイル内で関数呼び出しを手動で変更するだけでよいかもしれません。私はどちらもしないことを好む。

+0

これは実際に実行できますが、ロード可能なライブラリのソースコードをコンパイルし、ライブラリをロードし、関数を呼び出して結果を保存することを意味します。これは、ライブラリ内のテスト対象のアプリ全体に動的にリンクし、攻撃に対するテスト可能なアプリを開かないようにセキュリティ上の懸念を管理することを含みます。 これは表面的には簡単ですが複雑さが増したレイヤーやレイヤーを持つ問題の1つです。とにかくそれを追求したいなら、私はオペレーティングシステムの授業を提案します。 –

+0

関数は静的なので、どのプログラムからでも直接呼び出すことはできません。それらがリンクされている場合でも。 –

+0

[Boost.DLL](http://www.boost.org/doc/libs/release/doc/html/boost_dll.html)があります。これにより、テストケースを作成することができます共通のインターフェースを持つ「プラグイン」として。これらのテストケースプラグインは、メインアプリケーションによって動的にロードできます。 [チュートリアル](http://www.boost.org/doc/libs/release/doc/html/boost_dll/tutorial.html)からは、使用するのがかなり簡単です。 – zett42

答えて

0

標準C++では、これを直接行う手段はありません。しかし、ほとんどの実装は、実行時に、ライブラリをロードし、それらのライブラリから名前付き関数を呼び出すための機能を提供します。たとえば、Windowsでは、LoadLibraryを呼び出して名前付きDLLを読み込み、GetProcAddressを呼び出して名前付き呼び出し可能(C)関数へのポインターを取得できます。他のオペレーティングシステムも同様の機能を提供します。これは有用ではないようであり、脆弱なコードになりがちです。

+0

おそらく[Boost.DLL](http://www.boost.org/doc/libs/release/doc/html/boost_dll.html)は、LoadLibraryとGetProcAddressを直接呼び出す代わりに、 "脆弱性"の問題を軽減するための代替手段になる可能性があります。 – zett42

0

ファイルには、静的なグローバルクラスが含まれている可能性があります。そのコンストラクタに関数のアドレスを渡します。このコンストラクタは、メインフレームワークによって呼び出される関数のグローバルベクトルを更新します。入力ファイル名と出力ファイル名が必要な場合は、それらをコンストラクタの引数リストとベクトルに追加します。

関連する問題