問題タブ [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++ - C++ でポインターを extern として宣言できますか?
コンパイルされない次のレガシー C++ コードがあります。
GCC (g++) が不平を言う:「'*' トークンの前に初期化子が必要です」
周りを見回すと、次のようにこれらを外部参照として宣言するのがより一般的です。
ポインターが有効ではないのに、参照がこの状況にあるのはなぜですか?
解決:
後述するように、本当の問題は std:: 名前空間指定子が欠落していることです。どうやら、これは古い C++ コードでは一般的でした。
pointers - 参照とポインタの実行速度
私は最近、マネージ言語がネイティブ言語よりも遅い (または速い) かどうか (具体的には C# と C++) に関する議論を読みました。議論に貢献したある人は、マネージ言語の JIT コンパイラーは、ポインターを使用する言語では不可能な参照に関する最適化を行うことができると述べました。
私が知りたいのは、ポインターではなく参照で可能な最適化の種類は何ですか?
議論はメモリ使用量ではなく、実行速度に関するものであることに注意してください。
c++ - stdin を使用した C++ char 配列
標準入力によって設定された配列のサイズを取得しようとしています:
これは、「40905898」など、長さが 4 より大きい文字列を入力すると 4 を返します。
どこが間違っているのですか?
c++ - C++ のポインター型のポイントは何ですか?
と呼ばれるいくつかのポインタがあるとしましょう:
どちらも他の場所を指すメモリアドレスを保持するだけであり、型は特定のポインタが指すメモリの場所の大きさを宣言することを知っています。たとえば、char はシステム上の 1 バイトのサイズであり、int は 4 バイトである可能性があります。
しかし、私がこれを行うとどうなりますか:
ありがとう..ここで説明をいただければ幸いです..ポインタ型は単に ++ 操作のためですか?
編集: avp は私の質問に適切に答えましたが、フォローアップの質問があります。
2バイトコピーしますか?または4バイト?アクセス違反になりますか?
編集: Ryan Fox によると、答えは (void*) に型キャストされているため、2 バイトです。ありがとう!閉まっている!
編集:将来の検索者がこれを見つけることができるように..私が発見した別の情報..
pInt+5bytelocations が指すメモリ ブロックの 2 バイトを pChar+5bytelocations にコピーしません。2 バイトが pInt(4*5)bytelocations から pChar+5bytelocations にコピーされます。アクセス違反が発生したのも不思議ではありません。読んではいけないところを読もうとしていた.. :)
c - 配列の場合、なぜ a[5] == 5[a] になるのですか?
Joel がStack Overflow ポッドキャスト #34で指摘しているように、C プログラミング言語(別名: K & R) では、C の配列のこのプロパティについて言及されています。a[5] == 5[a]
ジョエルはポインタ演算が原因だと言っていますが、私にはまだわかりません。なぜa[5] == 5[a]
ですか?
c++ - C++ でのポインターの定義を確認する
変数、特にポインターが C++ で定義されているかどうかを確認するにはどうすればよいですか? クラスがあるとします:
c++ - スマートポインタ+「これ」は有害と見なされますか?
などのスマート ポインターを使用する C++ プロジェクトでboost::shared_ptr
、" " の使用に関する優れた設計哲学は何this
ですか?
次のことを考慮してください。
スマート ポインターに含まれる生のポインターを後で使用するために保存するのは危険です。オブジェクトの削除の制御をあきらめ、スマート ポインターが適切なタイミングでそれを実行することを信頼します。
非静的クラス メンバーは、本質的に
this
ポインターを使用します。これは生のポインターであり、変更することはできません。
別の変数に保存this
したり、後で保存したり、コールバックでバインドしたりする可能性のある別の関数に渡すと、誰かがクラスへの共有ポインターを作成することを決定したときに導入されるバグが作成されます。
this
それを考えると、ポインタを明示的に使用することが適切なのはいつですか? これに関連するバグを防ぐことができる設計パラダイムはありますか?
python - Python の ctypes を使用して、「struct_name *** param_name」として宣言されたパラメーターを渡したり読み取ったりしますか?
Python の ctypes ライブラリを使用して、スキャン ライブラリSANEのいくつかのメソッドにアクセスしようとしています。これは ctypes の私の最初の経験であり、1 年以上にわたって C データ型を扱わなければならなかったのは初めてなので、ここにはかなりの学習曲線がありますが、この特定の宣言がなくても、この特定の宣言は面倒だと思います:
まず、SANE_Status
(enum) とSANE_Bool
(typedef to c_int
) の処理に成功しました。どちらもシンプルでした。一方、その最初のパラメーターは、私にあらゆる種類の悲しみを引き起こしています. そもそも" " 表記に慣れていない***
ため、これまでのトレーサー弾はガベージ データしか生成しませんでした。Python 構造オブジェクトのリストを読み戻せるように、この関数への入力をフォーマットするにはどうすればよいですか? 参考までに、参照されている C 構造体は次のとおりです。
どこSANE_String_Const
で として定義されていc_char_p
ます。
このオブジェクトの私の Python/ctypes バージョンは次のとおりです。
これから期待される動作(構造オブジェクトのリスト)を取得できるように、何を渡す必要があるかについての提案はありますか?すべての回答に感謝します。
更新 1:
以下を使用して、正しい SANE_Device Python 構造を取得できました。
ただし、1) うーん、2) 結果が 1 つしかない場合にのみ機能するようです。devices.contents.contents
またはで len() を実行できませんdevices.contents.contents.contents
。結果の数を決定するにはどうすればよいですか? SANE のドキュメントでは、「関数が正常に実行された場合、*device_list 内の SANE_Device 構造へのポインタの NULL 終了配列へのポインタを格納する」と指定されています。提案?
更新 2:
10 項目の配列を渡し、次を使用して最初の要素にアクセスできました。
ただし、10 は明らかに恣意的な数であり、実際の結果の数を決定する方法はありません。devices.contents.contents.contents[1].name
デバイスが 1 つしか接続されていないときにアクセスしようとすると、セグメンテーション フォールトが発生します。ctypes では、このような可変長構造を処理する適切な方法が必要です。
.net - VB.NET での参照
VB.NET のクラスへの参照 (ポインタ?) は、私にはやや不明確です。私が尋ねようとしている質問は、少しテストすることで答えることができますが、誰かが適切な説明 (またはリンクも) を投稿できるかどうか疑問に思っていました。
クラスを作成する場合:
そして、実際にこのクラスをプロパティとして使用するクラス:
そして、次のように使用します。
これで、参照が参照ではなく「値によって」新しいクラスに渡されたとしても、関数BooleanCheck
は常に を返します。そのため、クラスのコピーは作成されませんが、 のローカル変数は引き続き のプロパティを参照/ポイントします。true
UsingClass
myReference
UsingClass
Reference
RuntimeOrSomething
これはどのようにエレガントに説明できますか?
c - 初心者の C プログラマーはポインターの助けが必要です (私は思います)
私は初心者プログラマーで、母国語である C を学んでいます。
私は主に Deitel と Deitel の C How to Program の本から学んでいますが、大学のサンプルタスクやものも使用していますが、1 つにこだわっています。
私はポインターの非常に基本的な理解を持っています-変数の前に & を追加するとアドレスが出力され、 * ポインターを使用してそのアドレスなどに格納されている値が使用されます。
私が書いたコードは、2 つの数値の最大 (最大?) 公分母を計算するためのものであり、実際にはポインターを必要とせず、まったく必要としません。2 つの関数を使用しており、メインに戻すのではなく、2 番目の関数から実行すると正しい答えが画面に出力されるため、ロジックはすべて正しいです。ここに問題があります。
2 番目の関数が応答値を返すとき、何らかの理由で、ポインターであるとしか想定できないものを返します。なぜこれを行うのかわかりません。これを操作して値を検索するように変換することはできますが、2 番目の関数のローカル ポインターのようであり、上書きされます。私が見つけることができるウェブ上や私の本の中には、問題を解決する方法を教えてくれるものは何もありませんでした.
ここまで読んでくれてありがとう。ぶらぶらしすぎました。
これが私のコードと出力です。ヘルプやポインタ(しゃれを許して)をいただければ幸いです。2番目の関数で出力するだけでよいことはわかっていますが、希望する値を返さない方法と理由を知りたいです。
コード
出力 (12 と 15 を使用 - 答えは 3 である必要があります)
frankodwyer からのこのような単純なソリューション。それは私が見つけられない、または知らないような小さなものです。では、返されたのはポインターではなく、ただのジャンクだったのでしょうか?
どうもありがとう。