-2

次の関数をObjective-Cに変換しようとしています:

private static byte[] convertByteArray(int p_int) {
         byte[] l_byte_array = new byte[4];
         int MASK_c = 0xFF;
         for (short i = 0; i <= 3; i++) {
                l_byte_array[i] = (byte) ((p_int >> (8 * i)) & MASK_c);
         }
         return l_byte_array;
   }

私はすでに試しました:

-(char *)convertByteArray:(int)p_int
{
    const char *l_byte_array[4];
    int MASK_c = 0xFF;
    for (short i = 0; i <= 3; i++) {
        l_byte_array[i] = (char *) ((p_int >> (8 * i)) & MASK_c);
    }
    return l_byte_array;
}

しかし、それは正しくないと思います...

アップデート:

constなしで試してみると:

-(char *)convertByteArray:(int)p_int
{
    char *l_byte_array[4];
    int MASK_c = 0xFF;
    for (short i = 0; i <= 3; i++) {
        l_byte_array[i] = (char *) ((p_int >> (8 * i)) & MASK_c);
    }
    return l_byte_array;
}

Return Statement で 2 つの警告が表示されます。

  1. ローカル変数 '' に関連付けられたスタック メモリのアドレスが返されました
  2. char[4] を返す互換性のないポインタ型 * 結果型が char の関数から *
4

2 に答える 2

2

問題は、対応するバージョンのこれらの 2 行にあると思います。

ジャワ:

byte[] l_byte_array = new byte[4];

Objective-C

const char *l_byte_array[4];

constオブジェクトが宣言された後にオブジェクトを編集できないことを意味すると思います。これは、 for ループが期待どおりに機能しないことを意味します。削除constして、何が起こるかを確認してください。

あなたのエラーについて:

 1. address of stack memory associated with local variable '' returned
 2. incompatible pointer types returning char[4] * from a function with result type char *
  1. 変数はローカルであるため、メソッドが終了すると、変数はスタックから解放されます。おそらくグローバル変数を設定して、データを失わないようにするか、ポインターを渡さないようにします。
  2. どうやら、戻り値をキャプチャするために使用している変数が正しく宣言されていません。問題#1を修正すると、この問題も修正されることを願っています。宣言が同じであること、または少なくともオブジェクトを適切な型にキャストできることを確認してください。
于 2014-02-25T13:57:16.730 に答える
1

ローカル変数 '' に関連付けられたスタック メモリのアドレスが返されました

関数が戻るとすぐにポインターが無効になるため、関数のローカル変数へのポインターを返すことはできません。解決策は、バイト配列にメモリを割り当てて返すことです。

char[4] を返す互換性のないポインタ型 * 結果型が char の関数から *

char *l_byte_array[4]は、4 の配列ではなく、への 4 つのポインターの配列です。charchar

実用的なソリューションは

-(char *)convertByteArray:(int)p_int
{
    char *l_byte_array = malloc(4);
    int MASK_c = 0xFF;
    for (short i = 0; i <= 3; i++) {
        l_byte_array[i] = (char) ((p_int >> (8 * i)) & MASK_c);
    }
    return l_byte_array;
}

そのメソッドの呼び出し元は、free()不要になったときにメモリを保持する必要があることに注意してください。

char *byte_array = [self convertByteArray:some_int];
// … do something with the byte array ...
free(byte_array);

また、負の数の右シフトは実装に依存するため、unsigned int代わりにパラメーターを使用することを検討してください。

于 2014-02-25T15:04:10.807 に答える