ホーム>source

確かに、私はここで何か間違ったことをしましたが、これを見て、なぜこれらの警告を受けているのか理解できません。

<前>ウィズウィズ

私の小さなコードセグメント:

<前>ウィズウィズ

配列への中間ポインタを使用し続けたいと思います。

warning: incompatible pointer types passing '__int16_t *' (aka 'short *') to parameter of type '__int16_t *(*)[4]' [-Wincompatible-pointer-types] hammingDistance2d(ptr0, ptr1);
あなたの答え
  • 解決した方法 # 1

    これらの変数

    <前>ウィズウィズ

    タイプ __int16_t *ptr0 = &src0[0][0]; __int16_t *ptr1 = &src1[0][0]; として明示的に宣言されている 。

    しかし、対応する関数パラメーター

    <前>ウィズウィズ

    実際にはタイプ __int16_t *

    最初のタイプから2番目のタイプへの暗黙の変換はありません。したがって、コンパイラはエラーを発行します。

    どういう意味か

    ウィズウィズ
    

    そして、関数呼び出しは次のようになります

    <前>ウィズウィズ

    関数の引数として使用される中間ポインタを宣言したい場合は、次のように書く必要があります

    <前>ウィズウィズ

    のような関数を呼び出す

    <前>ウィズウィズ

  • 解決した方法 # 2

    void hammingDistance2d(__int16_t *src0[N][N], __int16_t *src1[N][N]){ の2D配列を渡しています 、しかしあなたの関数は __int16_t * ( * )[N] へのポインタを期待しています 。

    関数定義を修正して、送信するものを処理します。

    <前>ウィズウィズ

    そしてそれを次のように呼びます:

    <前>ウィズウィズ

  • 解決した方法 # 3

    関数は次を期待しています:

    <前>ウィズウィズ

    (コンパイラーが示唆するように)タイプを持っているもの void hammingDistance2d(__int16_t src0[N][N], __int16_t src1[N][N]){ int i, j; __uint16_t Hdis[N][N] = {0}; for (i=0 ; i<N; i++){ for (j=0; j<N; j++){ __uint16_t z = src0[i][j] ^ src1[i][j]; while (z > 0) { Hdis[i][j] += z & 1; z >>= 1; } } } } 、または、英語で:[pointer to [pointer to [array of 4 hammingDistance2d( src0, src1 ); ]](強調のために使用している角括弧に注意してください)。

    ここにあるもの:

    <前>ウィズウィズ

    タイプは __int16_t ( *ptr0 )[N] = src0; __int16_t ( *ptr1 )[N] = src1; です 、つまり:[4 hammingDistance2d( ptr0, ptr1 ); の配列へのポインタ ]。

    あなたはおそらく宣言するつもりでした:

    <前>ウィズウィズ

    これは次と同じです:

    <前>ウィズウィズ

    そのような場合にはあなたがしない  __int16 を逆参照する必要があります   __int16_t の使用  オペレーター。

    void hammingDistance2d(__int16_t src0[N][N], __int16_t src1[N][N]){ int i, j; __uint16_t Hdis[N][N] = {0}; for (i=0 ; i<N; i++){ for (j=0; j<N; j++){ __uint16_t z = src0[i][j] ^ src1[i][j]; while (z > 0) { Hdis[i][j] += z & 1; z >>= 1; } } }

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ Excel VBA:複数のExcelファイルからデータを抽出します