問題タブ [function-pointers]
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++ - 関数ポインタの定義
内部 Windows NT API 関数 NtOpenProcess を呼び出そうとしています。内部 API を呼び出すのはよくない考えですが、この特定のツールでは、この API が提供する低レベルのアクセスが必要です。
私の問題は、このような内部 API を使用するには、この記事で指定されているように、ランタイム ダイナミック リンクを使用する必要があることです。
そのためには、NtOpenProcess への関数ポインターを定義する必要があります。これが私の宣言です:
問題は、明らかに上記の typedef にエラーがあることです。コンパイラは次を返します。
エラー C2059: 構文エラー: '__stdcall'
IDE (Visual Studio 2008) の便利な「定義へ移動」機能を使用したところ、宣言内の NTAPI が __stdcall として定義されていることがわかりました。
残念ながら、宣言から NTAPI を削除すると、次のようになります。
別のエラーが発生します。
エラー C2065: '_NtOpenProcess': 宣言されていない識別子
この時点で、私は「もちろん未定義です。だから typedef なのです!」と言っています。
宣言に私のエラーが表示されますか?
c++ - ランタイムチェックの失敗#0kernel32.dllからQueryFullProcessImageNameをロードしています
WinXPとVista64の両方で実行する必要があるアプリケーションがあります。私のプログラムでは、Vistaで動作するためにQueryFullProcessImageName()が必要ですが、XPでは動作しません。
同じ実行可能ファイルをWinXPとVistaの両方で実行できるように、kernel32.dllを介して(静的にリンクするのではなく)QueryFullProcessImageName()をロードしようとしています。それをロードするコードは次のとおりです。
typedefは
残念ながら、関数ポインタが逆参照されると、Vistaで実行時エラーが発生します。
実行時チェックの失敗#0-ESPの値は、関数呼び出し全体で適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。
typedefは.hファイルから直接取得されるため、混乱している理由がわかりません。何か助けはありますか?私はたくさんの変種を試しましたが、運がありません。
c++ - 関数ポインタ引数を変換できません
私が得ているエラー:
関連する定義:
typedef と実際の関数シグネチャは同一のように見えます。
編集:宣言を1つ忘れました:
c - C で任意のビット数を持つ 2 つの値を比較する
異なるビット幅の値を含むことができる辞書を作成するために、C で動的型付けシステムを作成しました。動的オブジェクトの構造は次のとおりです。
A2D 読み取り値を保持するこれらのダイナミクスのうちの 2 つを比較し、その差をデルタ値と比較して、変化が発生したかどうかを判断する必要があります。私が思いついた解決策の 1 つは、それらを char 配列にキャストし、バイトごとに比較することですが、それは正しくありません。また、Dynamics が占めるバイト数 (またはおそらく型) に基づいて関数ポインターの配列を作成し、サポートされている型ごとに比較関数を作成するというアイデアもあります。誰かが別のアプローチを提案できますか? 何かが足りないような気がします。
アップデート:
memcmp について教えていただきありがとうございます。しかし、2 つの値のデルタを取得するにはどうすればよいかという問題がまだ残っています。私が知る限り、 memcmp はどちらの値が大きいかの指標を返すだけであり、それらの差ではありません。
更新する更新:
私がコンパイルしようとしているアーキテクチャがリトル エンディアンであるため、memcmp は役に立たないことがわかりました。
自分で bignum の実装を行う場合は、ephemient が正しい方法のように感じますが、値を可能な限り最大の型 (つまり、unsigned long long) に memcpy することに決めました。それらを使って計算するだけです。これが機能しない理由は思いつきませんが、C/直接メモリ操作は私の得意分野ではないため、非常に間違っている可能性があることは認識しています。
c - C の関数ポインタに関する質問
次の宣言があります。
次に、プログラムのどこかに次の呼び出しがあります。
(最初の 3 つの引数と は無視してくださいnumeric
)。
これは何ですか?
4番目の引数として「2つのポインターを取得して返すqsort
関数へのポインター」を期待していることは理解していますが、上記の内容はどのようにそれを満たしていますか? 2 つの括弧で構成されているため、ある種のキャストのように思えますが、それは非常に奇妙なキャストです。関数を取り、この関数を「2つのポインターを取得して返す関数へのポインター」にするためです。これは無意味です。(ここでは、変数の前の括弧内の型が変数をその型に昇格させるという
規則に従いました)。void
int
void
int
type
だから私はそれを間違っていると思う. 多分誰かがこれを読む方法を教えてくれる. 順序は何ですか?
c - 関数のキャストはCで実際にどのように機能しますか?
課題の評価では、実際に何が行われますか?
foo
キャスト型と;には違いがあります。キャスト型はポインタでfoo
あり、関数です。では、コンパイラは ' (foo)
' の内容をポインタに変換しfoo
てからキャストを行うのでしょうか? 他に意味がないように見えるからです。もう1つのオプションは、関数自体が を取得してを返す関数へのポインターに変換されることです。私が知る限り、関数はメモリ内のコードのラベルであるため、ポインターになることはできません。変数。void*
int
c - 独自の型の関数を引数として取る関数ポインタをtypedefするにはどうすればよいですか?
例:関数(関数(that ...)とintを受け取る)とintを受け取る関数。
どこで再帰的に爆発し(...)
ます。これができない根本的な理由はありますか、それとも別の構文がありますか?キャストなしでも可能だと私には思えます。私は本当にディスパッチテーブルを渡そうとしていますが、この1つのタイプだけを渡すことができればそれを理解できました。
c++ - C++ 関数ポインタの問題
何らかの理由で、この関数へのポインターを varadic 関数に渡そうとすると、次のエラーが発生します。
テンプレート関数にはオーバーロードがなく、テンプレートパラメーターは明示的に定義されているため、どの関数にポインターを渡すかについては疑問がありません...
引数変換関数ごとに多くのバージョンを作成する必要はありませんが、エラーが発生した場合に例外に引数番号を含めることができる方法はありますか? (引数番号をパラメーターとして渡す方法がさらに良いので、dllに関数の複数のコピーがありません。)
EDIT:これもコンパイルエラーになるようです。テンプレート関数への関数ポインタを作成する方法はありませんか、それとも通常の関数とは異なる方法で行う必要がありますか?
関数は次のように宣言されます。
EDIT2:オペレーターのアドレスを追加すると、さらに別の異なるエラーが発生しました...
c - Cの関数ポインタはどのように機能しますか?
私は最近、C で関数ポインターを使用した経験がありました。
そこで、自分自身の質問に答えるという伝統を守りながら、このテーマについて簡単に知りたい人のために、非常に基本的なことの簡単な要約を作成することにしました。