問題タブ [unsafe-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.

0 投票する
0 に答える
614 参照

swift - Swiftにコールバック関数をインストールする方法

DiskArbitration を使用して、DADiskAppearedCallback である最初のコールバック関数をインストールしようとしていますが、次のエラーで DARegisterDiskAppearedCallback ステートメントでスタックしています:

「DeviceManager」は「UnsafeMutablePointer<()>」に変換できません

内部に配列を設定するには、DeviceManager インスタンスをコールバックに渡す必要があります...

これが私のコードです:

助けてくれてありがとう。

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

swift - 関数が UnsafeMutablePointer を返す場合、破棄して解放するのは私たちの責任ですか?

たとえば、次のコードを書くとします。

...次のことも行う必要がありますか?

それとも、メモリを割り当てなかったので、破棄する必要はありませんか?


更新 #1:

を返す関数を想像すると、次のようになりますUnsafeMutablePointer

この関数を呼び出すと、自分で汚い仕事をしない限り決して破棄されないオブジェクトへのポインタになります。

私がここで尋ねている質問localtime():呼び出しから受け取ったポインタは何か違いますか?
シミュレーターとプレイグラウンドの両方dealloc(1)で、返されたポインターに 1 つの呼び出しを送信することができますが、これを行う必要がありますか?それとも、後で別のメソッドによって返されたポインターの割り当て解除が行われるのでしょうか?

現時点では、破棄して割り当てを解除する必要があるという仮定に誤りがあります。

更新 #1.1:

最後の仮定は間違っていました。オブジェクトを作成していないため、解放する必要はありません。


更新 #2:

Apple dev フォーラムで同じ質問に対する回答をいくつか受け取りました。

一般的に、あなたの質問に対する答えはイエスです。C で解放する責任があるメモリへのポインタを受け取った場合でも、swift から呼び出すときにそれを解放する責任があります... [しかし]この特定のケースでは、何もする必要はありません。(JQ)

ルーチン自体が結果用の静的メモリを維持するため、それらを解放する必要はありません。(そうすると、おそらく「悪いこと」になるでしょう)...一般に、UnsafePointerが指す何かを解放する必要があるかどうかはわかりません....それは、そのポインターがその値を取得する場所によって異なります。(ST)

UnsafePointer の dealloc() は free() と互換性がありません。alloc() と dealloc() および malloc と co をペアにします。free() で。前に指摘したように、呼び出している関数は、結果を解放するための応答であるかどうかを通知する必要があります... destroy() は、ポインターが参照するメモリに重要なコンテンツ* がある場合にのみ必要です。強い参照または Swift 構造体または列挙型。一般に、C からのものであれば、おそらく destroy() する必要はありません。(実際、それは Swift によって初期化されていないため、おそらく destroy() すべきではありません。) ... * 「重要なコンテンツ」は Swift の公式用語ではありません。私はこれを C++ の「自明にコピー可能」という概念との類推で使用しています (ただし、必ずしも「自明」とは限りません)。(ステ)


最終更新:

StackOverflow、Apple Dev Forums、Twitter、およびメモリの割り当てとリリースに関する Apple の古いドキュメント (ARC 以前) からオンボード情報を取得する安全でないポインタのリリースに関する調査結果と仮定の概要を説明するブログ投稿を書きました。ここを参照してください。

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

c# - 実行時に型がわかっているバイナリ ファイルからの値の読み取り

バイナリ ファイルから一連の値を読み込もうとしていますが、実行時まで値の型がわかりません。

簡単な例

長さが 10 バイトのバイナリ ファイルがあります。バイトは、順に an int、 a float、および a を表しますshort。私はコンパイル時にこれを知りませんが、実行時には次のような配列でこれを知っています:

質問

このリストを取得したので、この情報を使用してファイルから値をすばやく読み取る方法はありますか? 私が考えることができる唯一の方法は、大きなifブロックを使用することですが、それは本当に醜いです:

しかし、これは醜く面倒です。Type配列内の情報を使用して、types何らかの形でこれを「自動化」できるかどうか疑問に思っています。

私が試したこと

私が考えたアイデアの 1 つは、生のバイトを配列に読み込んでから、バイト配列で変換を実行することでした。それでは、私の配列が次のようになっているとしましょう:

これにはint、、、floatおよびshort値 123456、123.456、および 12345 がそれぞれ含まれます。これで、次のことができます。

これはうまく機能しているように見えますが、次の 2 つの問題があります。

  1. *ipマネージド ドメインにマーシャリングする方法がわかりません。
  2. 次のように、タイプリストをまだ使用できません。

    /li>

これにより、次の行で 2 つのコンパイル時エラーが発生します。

試してみようと思ったのはここまでです。

誰かが助けてくれることを願っています。人生をずっと楽にしてくれるシンプルなものが欠けているように感じます。

アップデート

ifPeter Duniho の提案を試してみましたが、大きなブロックに比べてパフォーマンスの低下はわずかですが、うまく機能しているようです。

〜 100 MB のファイルからのいくつかの結果を次に示します (すべての時間はミリ秒単位です)。

ピーターの方法:

ifブロック:

ifそれほど重要なことはありませんが、私ははるかに大きなファイル (GB 範囲) で作業する予定なので、これらの数百ミリ秒が加算されるため、同じくらい高速なものが見つかるまで、醜いブロックを使い続けるつもりです。

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

ios - Swift UnsafeMutablePointer?> 割り当てと印刷

私はswiftが初めてで、管理されていないCFString(またはNSString)のポインターを処理するのにいくつかの困難があります。この関数でわかるように、UnsafeMutablePointer?> の使用を意味する CoreMIDI プロジェクトに取り組んでいます。

私の問題は、プロパティ (_str) の内容を受け取るためのバッファーを割り当て、上記の関数を呼び出し、最後に println を使用してコンソールに内容を出力することです。

現時点で私はこれを書いた:

インターネット上ではなく、アップル開発者ライブラリで CoreMIDI 関数を使用するためのサンプル コードが見つかりませんでした。私はcppから来て、swiftでは状況が大きく異なるため、本当に混乱しました。

編集 :

Rintaro と Martin が私にまだ問題があると答えた後、私のテストはすべて iOS 8.1 で行われました。

「管理されていない」という結果は、「MIDIObjectRef」に変換できません。MIDIObjectRef は UnsafeMutablePointer<void> なので、「&」を追加しました。

現在: 'Unmanaged<MIDIEndpoint>' は '@lvalue inout $T2' に変換できません。最後に、理由を理解せずに、最初の let を var に変更する必要がありました?!?

コードはコンパイルおよび実行されますが、MIDIObjectGetStringProperty は IOW または MacErros.h に対応する OSStatus err -50 を返します。

そのため、パラメーターは MIDIObjectGetStringProperty が待機しているものではないようです。

MIDIGetNumberOfSources() が 1 を返すため、ソース "0" は私の iPad に存在します。完全なコードは次のとおりです。

ディスプレイ:

私は本当に何も理解していません...

アップデート :

最後に、Martin は解決策を見つけました。32 ビットと 64 ビットのアーキテクチャには、MIDIObjectRef の 2 つの異なる定義があるようです。古い iPad 2 でコードを実行すると、私のコードは、MIDIGetSource(i) の戻り値が MIDIObjectRef に変換できない 32 ビット モードでコンパイルしようとしました。解決策は、32 ビット アーキテクチャで midi エンドポイントを「安全でないキャスト」することです。

... または、新しい 64 ビット デバイスを購入するには ...

貴重な助けをありがとう

0 投票する
4 に答える
384 参照

c# - 文字列ポインタの位置が異なるのはなぜですか?

アプリケーションを実行するたびに文字列ポインターの位置が異なるのはなぜStringBuilderですか?

出力:

40907812
178488268

次の時間:

40907812
179023248

次の時間:

40907812
178448964

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

ios - Swift で NSData から読み取るときの EXC_ARM_DA_ALIGN

私は次のクラスを持っています:

カスタム形式のバイナリ ファイルから読み取るために iOS アプリで使用します。たとえば、Intオフセット 5 を読み取るには、次を使用します。

let foo = rawData.read(5) as Int

これは私の iPad Air のシミュレーターで動作し、ベータ テストのレビューに合格しました。しかし、私の外部テスターは iPad 2 および 4 を使用しており、EXC_ARM_DA_ALIGNエラーが発生しています。

入力ファイルの構造を変更できません。readオブジェクトが適切に配置されたメモリ位置から構築されるように関数を修正する方法はありますか?

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

string - String または Character 型で UnsafeMutablePointer を使用する場合の矛盾

DynamicArray現在、Swift で独自のデータ型を実装しようとしています。そのために、ポインターを少し使用しています。私のように、私はジェネリック型のrootを使用しています:UnsafeMutablePointerT

ご覧のとおり、capacity現在割り当てられているメモリの量を示すプロパティも実装しましたroot。したがって、適切な量のメモリを割り当て、プロパティを設定するイニシャライザをDynamicArray使用してインスタンスを作成できます。 しかし、その後、イニシャライザも実装しました。これは、最初に を使用して必要なメモリを割り当てます。次に、メモリのその部分の各セグメントを に設定します。init(capacity:)capacity
init(count:repeatedValue:)init(capacity: count)repeatedValue

、、またはinit(count:repeatedValue:)などの数値型で初期化子を使用すると、完全に正常に機能します。次に、を使用するか、クラッシュしますが。ただし、一貫してクラッシュするわけではありませんが、ここで見られるように、数回コンパイルすることで実際に機能することがあります。IntDoubleFloatCharacterString

なぜこうなった?異なる長さの値を保持する必要がStringありますか?Character


更新 #1:

今@AirspeedVelocityは問題に対処しましたinit(count:repeatedValue:). ただし、 には別のDynamicArrayイニシャライザが含まれており、最初は と同様の方法で機能しましたinit(count:repeatedValue:)。@AirspeedVelocity で説明されているように、動作するように変更しましinit(count:repeatedValue:)た。

here でinitializeFrom(source:)説明されている方法を使用しています。それに準拠しているため、正常に動作するはずです。 私は今、このエラーが発生しています:collectionCollectionType

これも誤解を招くエラー メッセージですか?