問題タブ [ansistring]
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.
string - Delphi の ReadStr() と WriteStr()
文字列をバイナリ ファイルに書き込んでいると推測するために、ReadStr と WriteStr を使用するコードがいくつかあります。
ドキュメントの WriteStr の説明では、生データを AnsiString の形でオブジェクトのストリームに書き込むと記載されていますが、これは理にかなっています。しかし、その後 ReadStr は、文字を読み取ると言います。では、それらは互いに反対ではありませんか?
私が持っているとしましょう、
私はそれに WriteStr を使用していますが、実際には何を書きますか? WriteStr は AnsiString を想定しているので、pName をそのようにキャストしますか? その場合、AnsiString ポインタが長さフィールドではなく最初の要素を指しているため、「長さ」フィールドをストリームに書き込みませんか? 私も探していましたが、最近は String == AnsiString のようですが、長さフィールドに関する私の質問はまだ同じです。
長さフィールドをファイルに書き込まないとしても、データの最後に NULL を書き込むのでしょうか? そのため、'\0' を検索して文字列の末尾を見つけることはできますか? ReadStr は NULL 文字まで読み取りますか?
よろしくお願いします:)
memory-management - bds 2006 C 隠しメモリ マネージャの競合 (class new / delete[] vs. AnsiString)
私はBDS 2006 Turbo C++を長い間使用していますが、より大きなプロジェクト ( CAD/CAM、3D gfx エンジン、および天文計算) の一部で例外がスローされることがあります (たとえば、24 時間 365 日のヘビーデューティー使用で 3 ~ 12 か月に 1 回)。 )。広範なデバッグの後、私はこれを見つけました:
このコードは通常、テンプレート内に_s
あり、クラスにもなる可能性があるため、delete[]
このコードは適切に機能するはずですが、delete[]
構造体では適切に機能しません (クラスは問題ないように見えます)。例外はスローされず、メモリは解放されますが、何らかの形でメモリ マネージャーの割り当てテーブルが破損し、その後、新しい割り当てが間違っている可能性があります (新しい割り当ては、既に割り当てられている領域または割り当てられていない領域と重複する割り当てを作成する可能性があるため、時折例外が発生します)
_s
空のデストラクタを追加すると、突然すべてが正常に見えることがわかりました
さて、奇妙な部分が来ます。AnsiString
これをプロジェクトに更新した後、クラスにも不適切な再割り当てがあることがわかりました。例えば:
このコードdat
にはいくつかの有用なデータが含まれており、後でtxt
行を追加して作成された文字列があるため、txt
数回再割り当てする必要があり、dat
データが上書きされることがありますtxt
(重複していなくても、AnsiString
再割り当てに必要な一時txt
が重複していると思いますdat
)
だから私の質問は:
- code1、code2 で何か間違っていますか?
AnsiString
(再) 割り当てエラーを回避する方法はありますか? (でもまだ使ってる)AnsiString
大規模なデバッグの後 (質問 2 を投稿した後) 、問題を引き起こさないことがわかりました。それらは使用中にのみ発生します。本当の問題は、おそらくOpenGLクライアント間の切り替えにあります。ベクター グラフィックスのプレビューを表示する [開く/保存] ダイアログがあります。これらのVCLサブウィンドウでOpenGLの使用を無効にすると、メモリ管理エラーは完全になくなります。私は何が問題なのかはわかりません ( MFC/VCLウィンドウ間の非互換性、またはコンテキストの切り替えで間違いを犯した可能性が高いため、さらに調査します)。懸念されるOpenGLウィンドウは次のとおりです。AnsiString
- メインVCLフォーム +クライアント領域内のOpenGL
Canvas
- メインMFCの[開く/保存] ダイアログの子 + ドッキングされたプレビューVCLフォーム +クライアント領域内のOpenGL
Canvas
PS
new/delete/delete[]
これらのエラーは、割り当てられたサイズではなく、使用回数に依存します- code1 と code2 の両方のエラーが繰り返されます (たとえば、複雑な ini ファイルをロードするパーサーがあり、ini が変更されていない場合、同じ行でエラーが発生します)。
- これらのエラーは、 と テンプレートを内部動的割り当てと組み合わせて使用する大きなプロジェクト (プレーン ソース コード > 1MB) でのみ検出されます
AnsiString
が、より単純なプロジェクトでも発生する可能性がありますが、まれにしか発生しないため、見逃してしまいます。 - 感染したプロジェクトの仕様:
- win32 noinstall スタンドアロン ( Win7sp1 x64を使用しますが、XPsp3 x32では同じように動作します)
- GDIまたはOpenGl/GLSLを使用する場合は測定しません
- デバイス ドライバーDLLを使用するかどうかを測定しません。
- OCXなし、または非標準のVCLコンポーネント
- DirectXなし
- 1 バイト アラインされたコンパイル/リンク
- RTL 、パッケージ、またはフレームワークを使用しない(スタンドアロン)
悪い英語/文法で申し訳ありません...助け/結論/提案をいただければ幸いです。
delphi - [バイトの配列] を Unicode 変換なしで Variant に割り当てます
次のコード スニペットを検討してください(Delphi XE2 の場合)。
Base64Val
Base64 としてエンコードされたバイナリ値です (したがって、null
バイトはありません)。( OleVariant
) Resultは自動的にマーシャリングされ、クライアント アプリと DataSnap サーバーの間で送信されます。
Wireshark でトラフィックをキャプチャすると、 と の両方が Unicode 文字列として転送されていることがわかりStrVal
ますBase64Val
。できれば、 の Unicode 変換を避けたいと思いBase64Val
ます。私はすべてのタイプを見てきましたが、文字の配列を転送できるVariant
もの以外は見当たりません。varString
バイトのバリアント配列を作成する方法を示すこの質問を見つけました。を使用する代わりに、この手法を使用できると考えていAnsiString
ます。Unicode 文字列に変換せずに非 Unicode 文字データの配列を Variant に割り当てる別の方法はありますか?
delphi - Delphi XE4 で AnsiString を UnicodeString に変換する方法
上記のように変換しましたが、うまくいきませんでした。str1 で一部のデータが失われていることがわかりました。AnsiString を UnicodeString に安全に変換する方法はありますか?
c++ - XE5 Ansi/Unicode-String リンカ エラー (未解決のエクスターナル)
XE5 で次のリンカー エラーの多くのバージョンを取得します。
これまで読んだすべてから、プロジェクト設定のインクルード構造に何か問題があり、すべての文字列メソッドが実際に定義されている場所にアクセスできないようですが、私の人生では、どこにあるのかわかりませんこれらはあるはずです。
delphi - 1251 コードページのコンピューターで 1252 コードページ AnsiString を使用する
DelphiXE アプリケーションは ANSI アルメニア文字を使用します。拡張 ASCII 文字セットのコードを使用し、特別な CodePage はありません。Computer Active Code Page が 1252 の場合、すべて問題ありません。コンピューターの ACP が 1252 (たとえば 1251) でない場合、ANSI アルメニア文字を含む文字列の値が変更され、アプリケーションが適切に機能しません。
これらの変数を AnsiString として設定しようとしました。検索結果はありません。
これにより、文字列変数は、Delphi 2009 で 1251 コードページを使用してエンコードされたものとして Delphi によって解釈されます。
Delphi XE では機能しません。
コンピュータの ACP が 1252 でない場合に、Ansistring 変数が 1252 コードページを使用してエンコードされたものとして Delphi によって解釈されるようにするにはどうすればよいでしょうか?
c++builder - AnsiString を使用してバイナリ データを格納する方法
簡単な質問があります。
AnsiString をバイナリ データのコンテナーとして使用したいと考えています。私はほとんどの場合、TMemoryStream または TFileStream からそのようなデータをロードし、いくつかの処理後に AnsiString から保存します。正常に動作し、問題は見つかりませんでした。
しかし、私が見たところ、そのように使用することで、Sysutils::TBytes
代わりに使用する議論が巻き起こっています。なんで?Sysutils::TBytes
たとえば、内部に格納されているデータを操作するために使用できる便利なメソッドははるかに少ないですAnsiString
。AnsiString と比較すると、明らかに中途半端なコンテナーです。
通常の文字列への変換について気にする必要がある唯一の問題ですか、それとも適切でないものを実際に使用する必要がある他の何かがありますTBytes
か? AnsiString を他の文字列型に変換することはしません。これは、別の場所で考えられる問題として引用されていることです。
データをロードする方法の例:
データを保存する方法の例:
では、バイナリデータを正しく保存しても安全でしょうか?
string - ansistring の使用中に FPC 終了コード 201 が発生しました。文字列はそれをしません
質問があります。私はこの小さなプログラムを書きましたが、変更してから ansistring に変更するまで、完全に機能s
しs2
てstring
いました。255 文字をはるかに超えるため、ansistring を使用する必要があります。ご返信ありがとうございます。
delphi - Delphi - AnsiString が等しくありませんが、理由がわかりません
Tree 反復の比較演算子があります。AnsiString 変数を使用します。私の問題は、値が等しいように見えるときに、等しいインジケーターを取得していないことです (別名、System.AnsiStrings.CompareStr から 0 を取得していません)。デバッガーを介して変数を確認し、コードをステップ実行しました。両方の変数は AnsiString であり、両方とも同じ値で、スペースはありません。CompareStr は、それが役立つ場合は -65 を返します。
私は何を見落とすことができますか?これが私のコードです。