問題タブ [variadic-functions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 省略記号を別の可変個引数関数に渡す
私は約30個の可変関数を持っています。それぞれが最後の引数としてパスを受け入れます。例:
各関数で、展開された形式が特定のサイズ以下であることを確認する必要があります。そのため、同じコードのチャンクをコピーして貼り付けて、vsnprintf()
印刷されなかった文字数を確認し、errno
それに応じて設定して、書き込みを回避しています。
私がやりたいのは、これを行う関数を作成することです。これは、安全なサイズであることがわかっている静的に割り当てられた (拡張された) 文字列、または失敗時に新しく初期化された文字列を返し、NULL に対してチェックすることができます。チェックでは、文字列が絶対パスか相対パスかを判断する必要もあります。これは、文字列の安全なサイズに影響します。重複コードが多く、臭いがし始めています。
関数のエントリから別の関数に省略記号の内容を渡す方法はありますか? または、最初に呼び出してからヘルパー関数にva_start()
渡す必要がありますか?va_list
編集:
ヘルパーにを渡すことにまったく反対しているわけではありva_list
ません。他に何も存在しないことを確認したかっただけです。コンパイラーは可変引数の開始位置を理解しているように見えるので、それらを渡すようにコンパイラーに指示できるかどうか知りたかっただけです。
java - Javaでvarargsを使用するのはいつですか。
varargsが怖いです。何に使うのかわかりません。
さらに、人々に好きなだけ多くの議論を渡させるのは危険だと感じます。
それらを使用するのに適したコンテキストの例は何ですか?
string - マルチバイト ANSI を varargs に PInvoke できますか? 私は何を間違っていますか?
** 主要な更新 ** 小さな間違いを犯しましたが、正確に何が起こっているのかまだ知りたいです。
私が呼び出している関数は、実際には「fooV」であり、このシグネチャを持つ関数です。
これにより、取得していた AccessViolationExceptions がクリアされますが、マルチバイト ANSI 文字に変換する必要がある文字列を除いて、params パラメーターが他のすべての .NET タイプで機能する理由は説明されていません。DLL の開発者に、実際に使用しているバージョンを公開してもらいます...パラメーター リストで、va_list がパラメーターである場合の PInvoking のヒントはありますか?
** 古い投稿 **
これは関連していますが、私が尋ねた最近の質問とは異なります。
次のシグネチャを持つ C ライブラリ関数を呼び出すには、PInvoke を使用する必要があります。
この関数は、StructType によって異なる方法でリソースを構成します。私が興味を持っているケースでは、varargs が単一の ANSI マルチバイト文字列であることを期待するものを構成します。この PInvoke シグネチャを使用して関数を呼び出しました。
params string[]
私には奇妙に思えましたが、この関数を呼び出す以前の署名は、この関数を他の型などに使用していたのでbool
、パターンに従いました。
これをより使いやすい .NET メソッドでラップします。
最近、署名を変更して、FxCop の提案に準拠するために、DLLImport 属性に「BestFitMapping = false, ThrowOnUnmappableChar = true」を含めました。後で説明するように、これは赤いニシンです。
この変更を行うことで私が期待しているのは、Unicode のサポートが制限されていることです。たとえば、英語のコード ページを持つマシンでは、日本語の文字を含む文字列を渡すと、例外がスローされます。日本語のマシンでは、日本語の文字列を関数に渡すことができると思います。英語のテストは期待どおりに機能しましたが、日本語のテストは HRESULT 0x8007007A で System.Runtime.InteropServices.COMException をスローします。これは、BestFitMapping と ThrowOnUnmappableChar の設定がなくても発生します。
少し調べてみたところ、通常の引数を指定するだけで varargs を PInvoke できることを示唆するサイトをいくつか見たので、次の署名を試しました。
これを英語または日本語のマシンで使用すると、AccessViolationException がスローされます。
この C ライブラリはマルチバイト ANSI のみを想定して処理するため、UTF-8 または別の Unicode エンコーディングを使用できません。この関数に CharSet.Unicode を指定すると機能することがわかりましたが、これは単なる偶然であり、信頼できるものではないのではないかと心配しています。システム コード ページを使用して文字列を byte[] に変換することを考えましたが、varargs パラメーターにバイト配列を渡したいのですが、指定方法がわかりません。
どうしたの?英語のマシンでは、英語の文字は問題なく動作し、日本語の文字は予想どおり ArgumentException をスローします。日本語のマシンでは、英語の文字は正常に機能し、日本語の文字は COMException をスローします。私の PInvoke 署名に何か問題がありますか? 属性を使用してMarshalAs
LPArray のタイプと LPStr のサブタイプを指定しようとしましたが、これも同じように失敗します。UnmanagedType.LPStr は、1 バイトの ANSI 文字列であることを示します。マルチバイト ANSI 文字列を指定する方法はありますか?
** 更新 ** これは、現在のコメントを考慮した内容の追加です。
CDecl の呼び出し規約を指定し、次のような通常のパラメーターを使用する場合:
この仕様を使用すると、AccessViolationException が発生します。だから私はこれを試しました:
これは英語で機能し、日本語の文字を使用すると COMException がスローされます。
一貫して機能することがわかった唯一のことはこれです:
これを機能させるために、Marshal.StringToHGlobalAnsi() を使用してそのポインターを渡します。これは、英語と日本語で機能します。なぜこれが解決策なのか理解できないのは不快ですが、うまくいきます。
c++ - C++ 関数ポインタの問題
何らかの理由で、この関数へのポインターを varadic 関数に渡そうとすると、次のエラーが発生します。
テンプレート関数にはオーバーロードがなく、テンプレートパラメーターは明示的に定義されているため、どの関数にポインターを渡すかについては疑問がありません...
引数変換関数ごとに多くのバージョンを作成する必要はありませんが、エラーが発生した場合に例外に引数番号を含めることができる方法はありますか? (引数番号をパラメーターとして渡す方法がさらに良いので、dllに関数の複数のコピーがありません。)
EDIT:これもコンパイルエラーになるようです。テンプレート関数への関数ポインタを作成する方法はありませんか、それとも通常の関数とは異なる方法で行う必要がありますか?
関数は次のように宣言されます。
EDIT2:オペレーターのアドレスを追加すると、さらに別の異なるエラーが発生しました...
c - Cでマクロを生成するマクロ?
Cプリプロセッサにマクロを生成してもらいたいのですが (つまり、C99 だけを使用しています)。マクロを書きます
そして私が置くとき
コードの後半では、次のように展開されます。
そして、name1 と name2 を (マクロ実装された) 関数として使用できるようになります。私は両方のステップでマクロを使用して立ち往生していると思います.テンプレートを繰り返し再入力するためにマクロを使用することは理にかなっています.マクロを使用しない限り、可変引数の処理は機能しません.
では、これを行うために <...magic here...> プレースホルダーには何が入りますか? この時点で、私は C99 では不可能であると信じ始めていますが、構文の詳細が欠けている可能性があります。
ruby - パラメータ数無制限のRuby関数
明示的なパラメータ数を持たない Ruby 関数を作成するにはどうすればよいですか?
さらに説明が必要ですか?
visual-c++ - Format/printf (および一般的に可変引数) に渡された CString をキャストする必要がありますか?
私は最近、小さな MCF C++ アプリケーションを取り入れましたが、これは明らかに動作状態にあります。始めに、コード上で PC-Lint を実行しています。lint は、CStringT が Format に渡されていると不平を言っています。ネット上では意見が分かれているようです。CSting はこのユース ケースをエラーなしで処理するように設計されていると言う人もいれば、可変引数関数に渡されるときは常にキャストする必要があると言う人もいます (およびMSDN の記事) 。Stackoverflow はこの問題について合意に達することができますか?
java - Java では、2 つの varag メソッド foo(int... ints) と foo(Object... objects) がある場合、呼び出し foo() があいまいではないのはなぜですか?
次のように 2 つの varargs メソッドだけを宣言するとします。
と
そしてコードを持っています:
これは、予想どおりのあいまいさによるコンパイラ エラーです。
ただし、次の 2 つのバージョンの foo しかない場合:
と
次にコード
メソッドの ints バージョンを呼び出します。2 番目の例が同様に曖昧ではない理由と、Object メソッドではなく int メソッドに解決される理由を誰でも説明できますか。ありがとう。
c# - 可変数の printf スタイルの引数を使用してメッセージをログに記録する
フォーマット文字列と可変数の printf スタイルの引数を使用してメッセージをログに記録できる C# メソッドを実装しようとしています。理想的には、以下に貼り付けた C 関数と同じように機能しますが、もちろん C# には慣用的です。
この関数は、次の呼び出しを行うことができるため、私にとって便利です。