問題タブ [pointer-arithmetic]

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.

0 投票する
2 に答える
1379 参照

c++ - C++ でのベクトルのポインター演算

私は std::vector を持っています。

mdata ベクトルから GSL 関数にデータを渡したい

あなたのように。私はすでに次のようなことができることを理解しました

固定 i,j の mdata から gsl_spline_init() にデータを渡したい場合は、これで問題ありません。

ただし、ここでは、mdata の最初の次元を渡す必要があるため、j、k を固定します。

任意の 2 つの固定インデックスについて、残りの次元に沿ったすべてのベクトルが同じ長さであることを知っているので、私のベクトルは「通常の立方体」です。したがって、必要なすべての値の間のオフセットは同じでなければなりません。

もちろん、一時的なベクトルを作成することもできます

しかし、これは複雑すぎるようです。おそらく、ポインター演算で私の目標を達成する方法はありますか?

どんな助けでも大歓迎です:)

0 投票する
6 に答える
1830 参照

c++ - C ++クラスでポインタ演算を行う:それは「レギット」ですか?

あほい、ほい、

次のようなことをしても大丈夫かどうか疑問に思います。

ただ好奇心が強い、ダンO

0 投票する
2 に答える
2339 参照

c# - システム算術例外: Delphi が C++/CLI ラッパー経由で C# DLL を呼び出す

XML 操作に XslCompiledTransform クラスを使用する C# DLL があります。C# DLL の C++/CLI ラッパーを盗みました。

Delphi 5 を使用して C++/CLI ラッパーを実装すると、システム演算エラーが発生します。Delphi 5 の宣言は次のとおりです。

C# public メソッドの本体は新しい XslCompiledTransform オブジェクトを作成し、新しく作成されたオブジェクトがそのloadメソッドを実行するとすぐに例外がポップアップします。例えば:

前述のように、.NET DLL からスローされる例外はシステム算術例外です。これは、Delphi 実行可能ファイルから呼び出された場合にのみ発生します。

I guess I should mention calling the object's load method again works fine. So catching the exception and running the method for a second "pass" acts like a popup blocker. But for exceptions, of course.

0 投票する
7 に答える
1201 参照

c++ - バイト オフセットを使用した操作のためのよりクリーンなポインター算術構文

pm次のコード行では、フィールドの 1 つでバイト単位のオフセットによってポインターを調整する必要があります。ポインタ演算がうまくいくように絶え間なく前後にキャストするよりも、これを行うためのより良い/簡単な方法はありchar *ますか?PartitionMap *

コードから理解できない人のために、から継承するバッファ内の可変長記述子をループしていますPartitionMap

また、関係者のために、 partitionMapLength は、こ​​れが実行されるシステムでサポートされている長さを常に返します。トラバースしているデータは、UDF仕様に準拠しています。

0 投票する
1 に答える
771 参照

c# - Win32FileWriteの実装

私はこれを署名付きのWrite(..)メソッドを介して実装しています:

これを見て学んだように(読み取りの対応物の使用について説明します)、バッファーの書き込み/読み取りが一度に実行されない可能性があるため、コードにwhileループを実装する必要があります。ここから問題が始まります。

バイト*がバッファーのパラメーターとして受け入れられるリンクされた読み取りの例とは異なり、void *を受け入れるようにC#メソッドの署名を保持したい場合。

これは、WriteFileを1回パスした後、まだ書き込まれていないバッファの先頭にvoid*を移動する必要があることを意味します。書き込まれたバイト数を保持するuintでvoid*をインクリメントするだけでは、どうやらこれを行うことはできません... void *には所定のサイズがないため、インクリメントできないことは理解していますが、どうすれば達成できるのでしょうか。私はやろうとしています。

0 投票する
8 に答える
9548 参照

c - void のサイズが不明な場合のポインター演算

Visual Studio C++ バージョン 9 (およびおそらく他のバージョンも) では、次のコード:

次の エラーが生成されます。

このコードは GCC で動作しsizeof(void)1 .

char *ポインター演算の目的で明示的にキャストすると混乱が生じるため、この制限を回避する方法はありますか(void *生メモリへの型なしポインターとしてよく認識され、使用されます)。

Update0

  • 注意してください、私は標準の存在をよく知っています。
  • 生のポインタ演算を行いたい
  • それが問題の原因でsizeof(void)はないという事実を十分に認識していることを示します。1
  • コード例は、エラーを生成するために何が必要かを示すためのものです。
  • これが を使用する「通常の」方法ではないことはわかっていますvoidが、これは C であり、これらのことが起こります。
  • はい、人々はこれを低レベルで行う必要があります。私は理由を求めているのではなく、方法を求めています。理由を知りたい場合は、カーネル ソースまたは使いやすい glibc を参照してください。

アップデート1

この質問は多くの混乱を引き起こしたようです。問題は、なぜ持つことが標準的でないのかということsizeof(void) == 1ではなく、標準的でない場合にどうするかということです。

1 バイトのポインター演算が行われる場合、 にキャストすることchar *が正しい答えであることがわかります。*(void *)これは、 サイズがないからではなく、標準が実際に*(char *)は常にであると保証しているため1です。したがって、 の使用は常に正しく、生のポインター演算の目的で GCC 拡張char *と一致します。void *

ポイントをさらに強化するために、型のvoid *ないメモリへのポインターの正しい選択であり、生のポインター演算のchar *キャスト先の正しい型です。

0 投票する
7 に答える
3653 参照

c - sizeof(char) != 1 の場合の C でのバイト精度ポインタ演算

単一バイト精度でポインタ演算を移植可能に実行するにはどうすればよいですか?

それを念頭に置いて:

  • charすべてのプラットフォームで 1 バイトではない
  • sizeof(void) == 1GCC の拡張機能としてのみ利用可能
  • 一部のプラットフォームではポインター deref ポインターのアラインメントに制限がある場合がありますが、算術演算には最小の基本 POD 型のサイズよりも細かい粒度が必要な場合があります。
0 投票する
2 に答える
136 参照

pointer-arithmetic - ポインタ型の算術/

数値ポインタと文字ポインタを使用して、同様に型指定されたポインタを加算および減算するいくつかの例をお願いします。Cを使用します。

ありがとう。

0 投票する
5 に答える
5742 参照

c - C ポインター演算

このコードを考えると:

何がq - pどのように?