Golang - 構造体、初期化とmemcpy - 正しい方法は何ですか? -- arrays フィールド と struct フィールド と go フィールド と initialization フィールド と custom-type フィールド 関連 問題

Golang - structs, initializing and memcpy - what is the proper way?












1
vote

問題

日本語

私は行くのが大丈夫です、そして私が行かなければならないC / C ++コードを翻訳したいのですが、私はできなかった。問題は2つの場所にあります:定義した構造体を初期化する方法と「Memcopy」

の実行方法

私が話しているコードはこれです: http://play.golang.org/p/ E8N255QEAK 69と74。

私が行くように「翻訳」したいと思ったC / C ++コードはこれです:

<事前> <コード> typedef char xchr; typedef int xint; typedef double xdob; typedef float xflt; typedef struct { xint p; xdob lat_lon_ele[3]; xflt psi_the_phi[3]; xflt gear_flap_vect[3]; }VEH1; avio.p = 0; avio.lat_lon_ele[0] = 47.460058; avio.lat_lon_ele[1] = -122.32104; avio.lat_lon_ele[2] = 8000.000; avio.psi_the_phi[0] = 110.5; avio.psi_the_phi[1] = 0.0; avio.psi_the_phi[2] = 0.0; avio.gear_flap_vect[0] = 1.0; avio.gear_flap_vect[1] = 0.0; avio.gear_flap_vect[2] = 0.0; VEH1* av = &avio; xchr data_send[6]; data_send[0]='V'; data_send[1]='E'; data_send[2]='H'; data_send[3]='1'; data_send[4]=0; memcpy(&data_send[5],av,sizeof(VEH1)); // load in the data

GOコードはこのように見えます:

<事前> <コード> type xchr int8 type xint int type xdob float64 type xflt float32 type VEH1 struct { p xint lat_lon_ele [3]xdob psi_the_phi [3]xflt gear_flap_vect [3]xflt } type VEHA struct { num_p xint lat_lon_ele [10][3]xdob psi_the_phi [10][3]xflt gear_flap_vect [10][3]xflt lat_view, lon_view, ele_view xdob psi_view, the_view, phi_view xflt } var avio VEH1 avio = &VEH1{0, {47.460058, -122.32104, 8000.000}, {110.5, 0.0, 0.0}, {1.0, 0.0, 0.0}} data_send := [6]xchr{'V', 'E', 'H', '1', 0, 0} copy(data_send[5:5], avio);

ありがとうございました!

英語

I'm new to Go and I wish to translate some C/C++ code I have to Go but I haven't been able to. The problem resides in 2 places: how can I initialize a struct I've defined and how to do a "memcopy"

The code I'm talking about is this: http://play.golang.org/p/e8N255qEAk line 69 and 74.

The C/C++ code I wanted to "translate" to Go is this:

            typedef char xchr;             typedef int xint;             typedef double xdob;             typedef float xflt;             typedef struct             {                xint p;                 xdob lat_lon_ele[3];                xflt psi_the_phi[3];                xflt gear_flap_vect[3];             }VEH1;              avio.p = 0;             avio.lat_lon_ele[0] = 47.460058;             avio.lat_lon_ele[1] = -122.32104;             avio.lat_lon_ele[2] = 8000.000;              avio.psi_the_phi[0] = 110.5;             avio.psi_the_phi[1] = 0.0;             avio.psi_the_phi[2] = 0.0;              avio.gear_flap_vect[0] = 1.0;             avio.gear_flap_vect[1] = 0.0;             avio.gear_flap_vect[2] = 0.0;              VEH1* av = &avio;              xchr data_send[6];             data_send[0]='V';             data_send[1]='E';             data_send[2]='H';             data_send[3]='1';             data_send[4]=0;              memcpy(&data_send[5],av,sizeof(VEH1)); // load in the data 

The Go code looks like this:

            type xchr int8             type xint int             type xdob float64             type xflt float32              type VEH1 struct {                 p              xint                 lat_lon_ele    [3]xdob                 psi_the_phi    [3]xflt                 gear_flap_vect [3]xflt             }              type VEHA struct {                 num_p xint                  lat_lon_ele    [10][3]xdob                 psi_the_phi    [10][3]xflt                 gear_flap_vect [10][3]xflt                  lat_view, lon_view, ele_view xdob                 psi_view, the_view, phi_view xflt             }               var avio VEH1             avio = &VEH1{0, {47.460058, -122.32104, 8000.000}, {110.5, 0.0, 0.0}, {1.0, 0.0, 0.0}}              data_send := [6]xchr{'V', 'E', 'H', '1', 0, 0}             copy(data_send[5:5], avio); 

Thank you!

</div
              

回答リスト

2
 
vote
vote
ベストアンサー
 

は基本的にこれらの基本的な種類を与えられています:

<事前> <コード> type xchr int8 type xint int type xdob float64 type xflt float32

次の struct 型の値のバイト(メモリ表現)をコピーします。

<事前> <コード> type VEH1 struct { // 52 bytes total p xint // 4 bytes (READ BELOW) lat_lon_ele [3]xdob // 24 bytes psi_the_phi [3]xflt // 12 bytes gear_flap_vect [3]xflt // 12 bytes }

Go Goの int の長さはプラットフォームに依存していることに注意してください。コンパイルするターゲットアーキテクチャに応じて、32ビットまたは64ビットである可能性があります。これはプラットフォームに依存する動作につながるため、

のために int32 に修正しましょう。 <事前> <コード> type xint int32

上記の 9988777668 のバイトサイズの計算方法です。 int64 が必要な場合は、変更してサイズ計算で4バイト4バイトを追加してください。

次に、要素型が secret_word = "" while True: secret_word = input("You're stuck in an infinite loop! Enter a secret word to leave the loop.") if secret_word == "chupacabra": print("You've successfully left the loop.") break 0 のアレイに結果が必要です。十分に大きな配列が必要です。これは、 secret_word = "" while True: secret_word = input("You're stuck in an infinite loop! Enter a secret word to leave the loop.") if secret_word == "chupacabra": print("You've successfully left the loop.") break 1 の後に上記の int3212 のデータが続く「プレフィックス」です。そのため、<コード> secret_word = "" while True: secret_word = input("You're stuck in an infinite loop! Enter a secret word to leave the loop.") if secret_word == "chupacabra": print("You've successfully left the loop.") break 4 の secret_word = "" while True: secret_word = input("You're stuck in an infinite loop! Enter a secret word to leave the loop.") if secret_word == "chupacabra": print("You've successfully left the loop.") break 3 のサイズが必要です。

1タイプのバイトを別のタイプのメモリスペースにコピーするには、 <コード> secret_word = "" while True: secret_word = input("You're stuck in an infinite loop! Enter a secret word to leave the loop.") if secret_word == "chupacabra": print("You've successfully left the loop.") break 5 パッケージとその一般 <コード> int3216 タイプ。 secret_word = "" while True: secret_word = input("You're stuck in an infinite loop! Enter a secret word to leave the loop.") if secret_word == "chupacabra": print("You've successfully left the loop.") break 7 および secret_word = "" while True: secret_word = input("You're stuck in an infinite loop! Enter a secret word to leave the loop.") if secret_word == "chupacabra": print("You've successfully left the loop.") break 8 にキャストできます。

は、任意のポインタ型にキャストできます。

type xchr int8 type xint int type xdob float64 type xflt float32 9 secret_word = "" while True: secret_word = input("You're stuck in an infinite loop! Enter a secret word to leave the loop.") if secret_word == "chupacabra": print("You've successfully left the loop.") break 9 のアドレスを取ることができ、それを 99887776621 に変換し、結果 type xchr int8 type xint int type xdob float64 type xflt float32 2 < / code>ターゲットデータ型へのポインタへ。間接参照ポインタと今はもう一方のタイプの値があります。

組み込み <コード> スライスでのみ使用できます。そうすれば、最初にデータ配列をスライスする必要があります。<コード> type xchr int8 type xint int type xdob float64 type xflt float32 4 。

このようにすることができます:

<事前> <コード> type xchr int8 type xint int type xdob float64 type xflt float32 5

出力、画面に合うように包まれた:

<事前> <コード> type xchr int8 type xint int type xdob float64 type xflt float32 6

遊び場。

結果を type xchr int8 type xint int type xdob float64 type xflt float32 7

として有する

type xchr int8 type xint int type xdob float64 type xflt float32 8 の結果(結果を type xchr int8 type xint int type xdob float64 type xflt float32 9 )を使用してから、<コード> struct0 型for 998877631 、およびもちろんCast 998876632 を使用します。コード> struct3

 <コード> struct4  
 

So basically given these basic types:

type xchr int8 type xint int type xdob float64 type xflt float32 

You want to copy the bytes (memory representation) of a value of the following struct type:

type VEH1 struct { // 52 bytes total     p              xint    // 4 bytes (READ BELOW)     lat_lon_ele    [3]xdob // 24 bytes     psi_the_phi    [3]xflt // 12 bytes     gear_flap_vect [3]xflt // 12 bytes } 

Note that the length of int in Go is platform dependent, it may be 32 bit or 64 bit depending on the target architecture you compile to. That would lead to platform dependent behavior, so let's fix it to int32 for now:

type xint int32 

This is how the byte sizes of the above struct is calculated. If you need int64, just change it and add 4 additional bytes in size calculation.

Next you want the result in an array whose element types are xchr. You need a big enough array, which is the "prefix" being "VEH1" followed by the data of the above struct. So it must have a size of 4+sizeof(VEH1) which is 56.

In Go to copy the bytes of one type to the memory space of another type, you can do it the unsafe package and its general Pointer type. Any pointer can be cast to unsafe.Pointer and unsafe.Pointer can be cast to any pointer type, so this is your "gateway" between different pointer types.

You can take the address of a struct value of VHE1, convert it to Pointer, and convert the result Pointer to a pointer to the target data type. Dereference the pointer and now you already have the value of the other type.

The builtin copy() can only be used with slices, so first you need to slice your data arrays to be able to pass them to copy().

You can do it like this:

avio := VEH1{0, [3]xdob{47.460058, -122.32104, 8000.000},     [3]xflt{110.5, 0.0, 0.0}, [3]xflt{1.0, 0.0, 0.0}} fmt.Printf("%+v ", avio)  pavio := unsafe.Pointer(&avio) pavio_arr := *((*[52]xchr)(pavio))  data_send := [56]xchr{'V', 'E', 'H', '1'} n := copy(data_send[4:], pavio_arr[:]) fmt.Printf("Copied %d bytes ", n)  fmt.Printf("%+v ", data_send) 

Output, wrapped to fit in screen:

{p:0 lat_lon_ele:[47.460058 -122.32104 8000] psi_the_phi:[110.5 0 0]     gear_flap_vect:[1 0 0]} Copied 52 bytes [86 69 72 49 0 0 0 0 0 0 0 0 -81 33 56 46 -29 -70 71 64 77 45 91 -21 -117     -108 94 -64 0 0 0 0 0 64 -65 64 0 0 -35 66 0 0 0 0 0 0 0 0 0 0 -128 63 0 0 0 0] 

Try the working demo on the Go Playground.

Having the result as []byte

If you want []byte result (e.g. you want to write the result to an io.Writer), then use [56]byte type for data_send and of course cast pavio to *[52]byte:

pavio := unsafe.Pointer(&avio) pavio_arr := *((*[52]byte)(pavio))  data_send := [56]byte{'V', 'E', 'H', '1'} n := copy(data_send[4:], pavio_arr[:]) 
</div
 
 
         
         

関連する質問

6  テストしようとしているエンティティを使用してSymfony2カスタムフォームタイプ  ( Symfony2 custom form type using entity trying to test it ) 
私は、クラスエンティティを持つフィールドを使用するフォームタイプをテストしようとしています これはフォームの作成です。 <事前> <コード> $builder ->add('name', 'text') ->ad...

2  メンバーとしての一般的なコレクションを備えたPowerShellのカスタムタイプ  ( Custom type in powershell with generics collection as a member ) 
PowerShellスクリプトに次のタイプを宣言したいと思います。 <事前> <コード> Add-Type @' public class VirtualMachine { string Name; string HostName; ...

-1  カスタム休止タイプの実装  ( Implementing custom hibernate type ) 
Oracleのデフォルトのインストールによって提供されるサンプルスキーマ(順序入力)への休止状態マッピングを実装しようとしています OrdeEntryスキーマには、カスタマイト型列として列がほとんどないカスタマテーブルが複数のテーブルテーブルがあります。 カ...

13  数字を使用して列挙型を作成するにはどうすればよいですか。  ( How can i create an enum using numbers ) 
C#で数字だけを使用して列挙をすることは可能ですか?私のプログラムでは、1,2,4、および8にのみ設定できる変数、ゲインがあります。この値を表示および設定するには、PropertyGridコントロールを使用しています。私がこのような列挙体を作成することだった...

0  Symfony 2コンソールで無効なタイプエラーが発生しました  ( Invalid type error occasionally in symfony 2 console ) 
私はDoctrineのMongoDB ODMマッピングを使用してカスタムデータ型を使用しているSymfony 2環境を持っています。これは時々除いて、すべてが動作します。キャッシュをクリアするか、アセットをインストールするには、次のエラーが発生することがありま...

0  トランスフォーメーションでダウンロード可能なファイルタイプフィールドを作成する方法-kentico  ( How to make downloadable file type field in transformation kentico ) 
はKentico 6.0の操作を常に始めました。 管理者はファイルをアップロードできる「ファイル」タイプのフィールドを使用してカスタム文書タイプを構築しました。 これで、サイトユーザーがこのファイルをダウンロードできる場所からの変換を構築しようとしています。 ...

0  IEQUALITYCOMPARERER <T>とカスタムタイプ  ( Iequalitycomparert and custom type ) 
2つの List<T> でカスタムタイプを比較し、 Intersect / <コード> Except メソッドを使用しようとしています。平等はこのタイプの3つのフィールドによって決まります。平等は通常の条件(すべてのフィールドに同じデータを含む)に基づいて...

2  Hibernateでユーザーデータ型(コンポジットタイプ)をマッピングする方法  ( How to map user data type composite type with hibernate ) 
私は休止世界にとって非常に新しいです。 私はMy Case Tool(Toad)をモデル化しています。私のデータベース(Toad)My Databaseを定義しました。たとえば、PostgreSQL でフォローとして宣言されたタイプの連絡先があるとするとします...

1  セット数の要素を持つ基本タイプの配列を常に表すためのカスタムタイプを作成する方法は?  ( How can i create a custom type to always represent an array of some basic type w ) 
この可能なタイプをどのように作成するかを知りたいのですが。このアイデアは、3つの要素のみの整数配列を表すタイプを持つことですが、通常の配列のように括弧を使用してアクセスできるようになります。 私は本質的にを変換したいです <事前> <コード> int[] my...

11  「java.sql.SQLException:Streamは既に閉じられている」を避けるためのカスタムタイプの休止状態  ( Hibernate custom type to avoid caused by java sql sqlexception stream has al ) 
次のエラーを回避するために、Oracleの長い値を処理するためのカスタムロングクラスを作成しますか? によって引き起こされた:java.sql.sqlexception:streamはすでに閉じています。 ありがとう ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有