問題タブ [indirection]
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.
computer-science - あらゆる問題を解決する間接性のレベル
コンピュータサイエンスにおける「間接性のレベルがすべての問題を解決する」という言葉はどういう意味ですか?
language-agnostic - 3 つのレベルの間接化の理由を見つけたことがありますか?
私のお気に入りの本 (Ellen Ullman の The Bug) をパラパラとめくるだけで、あるプログラマーが別のプログラマーに 3 つのレベルの間接性で直面している小さな部分があります。
二重間接参照のアイデアが浮かびました。これは、ポインタを関数に渡し、関数内で作成されたオブジェクトを指すようにする方法です。
しかし、3 つ (またはそれ以上) のレベルの間接化を使用する理由はありますか?
c++ - VisualC++に間接参照を含める
コンパイルするためにBoostが必要なアプリケーションがあるとしましょう。Boostは外部ライブラリであり、定期的に更新され、アプリケーションには複数のバイナリと複数のバージョンがあります(「Letthem grow and multiply」のように「複数」...質問しないでください...)、簡単に更新する必要があります/各アプリのバージョンリンクが適切なBoostバージョンになるように間接参照を維持します。
例えば:
- MyApp8.0=>ブースト1.34
- MyApp8.1=>ブースト1.35
- MyApp9.0=>ブースト1.35
- MyApp10.0=>ブースト1.37
Linuxファイルシステムでは、適切なブーストディレクトリにリダイレクトするシンボリックリンクを作成します。
- MyApp 8.0 => MyAppBoostLink_8.0 => Boost 1.34
- MyApp 8.1 =>MyAppBoostLink_8.1=>ブースト1.35
- MyApp 9.0 =>MyAppBoostLink_9.0=>ブースト1.35
- MyApp 10.0 =>MyAppBoostLink_10.0=>ブースト1.37
これにより、シンボリックリンクを置き換えるだけで、MyApp10.0をBoost1.38とリンクするように簡単に更新できます。
しかし、Windowsでは、これは機能しません(または私が何かを逃した)。
Boost自体はその考えをあきらめているようです。BJamでは、シンボリックリンクがWinNTで機能しなかったため、BJamがlibファイルをコピーしているという警告が表示されたことを思い出します。Visual C ++を使用しているため、別の方法を試しましたが、この問題を解決するプラグマはありません(ヘッダーインクルードとライブラリリンクのデフォルトの検索ディレクトリを追加するプラグマを検索しましたが、見つかりませんでした)。
スクリプトを起動してVCPROJファイル(Visual C ++ XML makefile)をチェックアウトし、Boostインクルードを更新してから変更をチェックインする必要があるとは信じられませんが、Windowsがシンボリックリンクを機能させる(またはそれらを作成する方法を発見する)。
より良いアイデアはありますか?
編集
コンパイラをVisualC++2003からVisualC++ 2008に更新すると、問題は解消されました。どうやら、Visual C++2008ではネットワーク間のシンボリックリンクが表示されます。
c++ - 間接演算子をオーバーロードする方法は?(C ++)
リストクラスのメンバークラスとしてイテレータクラスを作成しようとしています。また、間接演算子(*)をオーバーロードして、それが指しているリストにアクセスしようとしています。
ここlstptr
で、はリストへのcurrent
ポインタ、はノードクラスへのポインタ、ノードクラスにdata
はタイプ。のデータメンバーが含まれていますT
。
イテレータは次のように宣言されます。
オーバーロードされた演算子*の関数定義を正常にコンパイルできますが、次のようなことをしようとすると、次のようになります。
表示されるエラーは、<1>は不正な間接参照を使用していること、<2>はlist::iteratorからintに変換できないことを示しています。両方のエラーは14行目で発生します。
誰かが私が間違っていることと、間接演算子を正しくオーバーロードする方法を知っていますか?
注意:さらにコードを表示する必要がある場合は、どの部分を教えてください。コード全体をここに配置したくないのは、205行であり、そのうちの204行にはエラーがないためです。
c# - C# P/Invoke: 構造化パラメーターのフィールドに対して二重の間接参照を実現する方法
C# からネイティブ dll を呼び出しています。問題の特定の関数について、必要なパラメーターの 1 つは、二重間接フィールド (ポインターへのポインター) を含む構造体です。
たとえば、次の C プロトタイプと構造体を取り上げます。
次の C# コードは、AnotherStruct フィールドに対して単一レベルの間接化のみを提供しますが、これは正しくありません。
ここで必要な二重間接化を実現するにはどうすればよいですか? 関数への二重間接パラメーターの場合の方法は知っていますが、構造体に埋め込まれているという事実に混乱しています。
AnotherClass フィールドを IntPtr として宣言してから、アンセーフ コードを使用して適切な値を割り当てる必要があるかもしれません。それは有効なアプローチですか?他に/より良いオプションはありますか?
c++ - 構造体からの変数へのアクセス
構造体の変数にどのようにアクセスできますか? 私は構造体を持っています:
私の他のクラスにはメソッドがあります:
**表示とはどういう意味ですか? 私が使用した構造体の変数にアクセスするに->
は、他の方法もありますか?
c - C でポインターをパラメーターとして逆参照する目的
私は最近、このコード行に出くわしました:
そして、私はそうではないと思いました:
以下のシンタックスシュガーのみ:
それを念頭に置いて、この行は次のように書き直すことができます。
だとしたら、渡して何の意味があるの?
&(*a) をパラメータとして、単なる a? ではありません。-(-a) に相当するポインターが渡されているようですが、これには何らかのロジックがありますか?
ありがとうございました。
c - Cでの直接呼び出しと間接呼び出し
私はCを初めて使用し、ポインターが別の変数のアドレスを「指す」方法について読んでいました。そのため、間接呼び出しと直接呼び出しを試しましたが、同じ結果が得られました(C / C ++開発者なら誰でも予測できたはずです)。これは私がしたことです:
だから私は、ポインタを使った間接的な呼び出しが直接的な呼び出しよりも利点があるのか、またはその逆なのか疑問に思っていますか?いくつかの長所/短所には、速度、操作を実行するために消費されるメモリの量(おそらく同じですが、私はそれをそこに出したかっただけです)、安全性(ダングリングポインタなど)、優れたプログラミング手法などが含まれ
ます。 GNU Cコンパイラ(gcc)を使用しても、returnステートメントなしでコンパイルされ、すべてが期待どおりに実行されます。おそらく、C ++コンパイラは、忘れた場合にreturnステートメントを自動的に挿入するためです。
c++ - タフ:C++で深くネストされたポインターを処理する
私はこの構造を定義します:
およびこれらの構造:
次に、コードでs_moleculeへのポインターを返します(t_moleculeにtypedefしますが、それでも)。
このポインタを使用して、このコードを機能させることができます。
私がそれを置き換える場合:
私は今、厄介なsegfaultsを取得します...
ここにあまり多くを入れないでください、しかし私がこれをしようとしたとき、私はまたsegfaultsを得ています:
繰り返しになりますが、current_moleculeはs_molecule構造体へのポインターであり、構造体の配列が含まれています。構造体の配列には、直接varsがあるか、ポインターがあります。これらの間接参照の複数のレイヤーを機能させることができません。これらのsegfaultsを修正するための提案。
参考までに、g++を使用してLinuxCentos 5.4でコンパイルし、カスタムmakefileシステムを使用しています。
c++ - C++ での奇妙なポインターの問題
私は非常にイライラするポインターの問題に遭遇しています。以前ここに投稿しました: TOUGH: C++ で深くネストされたポインターの処理
しかし、その投稿は長くなりすぎて古くなっているため、詳細を記載して再投稿することにしました。
私のタイプを定義するヘッダーファイルは次のとおりです。
そして、分子の配列に t_molecule タイプの var (t_molecule の定義については上記のヘッダーを参照) を追加するための呼び出しを次に示します。
これは完全に機能します... resname 文字列が出力され、結合ベクトルの最後の結合に関する情報が出力されます。次に、すべての分子を追加したら。私はこれを次のように呼びます:
これは、bonds 行でのセグメンテーション違反です。
追加ステップで印刷したインデックスから、ベクターにプッシュしている分子を上書きしていないことがわかります (サイズが大きくなっています)。
言い換えれば、何が起こっているように見えるかは次のとおりです。サブベクターの読み取り(機能)->親ベクターにいくつかのアイテムを追加->サブベクターの再読み取り(セグフォールト)
これらの関数は、分子変数をベクターに追加するための唯一の手段であり、分子変数は一度だけ追加され、現在のテストでは死後に変更されません。
何か案は????前もって感謝します!!