配列の次元のキャストについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
REF

配列の次元のキャストについて

#1

投稿記事 by REF » 11年前

c,c++での配列の次元のキャスト(?)の実現の仕方がわからなかったので質問させて下さい。

例えば、以下のようなコードがあります。

コード:

int array1[6] = { 0, 1, 2, 3, 4, 5 };
int array2[3][2] = { {0, 1}, {2, 3}, {4, 5} };

void func( int array[][2] ){
    for( int i=0; i<3; ++i )
        printf( "%d,%d\n", array[i][0], array[i][1] );
}

int main(){

    //func( array1 );
    func( array2 );

    return 0;
}
ここで、func( array1 ) は型の違いからコンパイルエラーになります。
しかし、array1とarray2はメモリ上では同じように確保されているはずであり、ならばキャストすれば上手く関数に渡せると思うのです。

これで意図が上手く説明出来ているか自信がないのですが・・・
解決法をご存知の方、どうかご教示願います。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列の次元のキャストについて

#2

投稿記事 by みけCAT » 11年前

REF さんが書きました:array1とarray2はメモリ上では同じように確保されているはずであり、ならばキャストすれば上手く関数に渡せると思うのです。
そう思ったら、まずは単純にキャストしてみるといいと思います。

コード:

#include <cstdio>

int array1[6] = { 0, 1, 2, 3, 4, 5 };
int array2[3][2] = { {0, 1}, {2, 3}, {4, 5} };

void func( int array[][2] ){
  for( int i=0; i<3; ++i )
    printf( "%d,%d\n", array[i][0], array[i][1]);
}

int main(){

  func((int(*)[2])array1);
  // func( array2 );

  return 0;
}
とりあえずIdeone.comでは通りました。

エラーメッセージを見て、変換できないと主張されている型へのキャストを入れただけです。

そもそも、C言語では引数はそのままでもコンパイルが通りました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

REF

Re: 配列の次元のキャストについて

#3

投稿記事 by REF » 11年前

まさに欲しかった情報です!
ありがとうございます!

ちなみに、自分はvc++で動作確認をしており、その際のエラーメッセージは次のようになっていました。

error C2664: 'func' : 1 番目の引数を 'int [6]' から 'int [][2]' に変換できません。

それで、(int [][2])array1 などと書いてエラーを吐かれていました。

また、C言語ではコンパイルしていなかった為、そのまま通るというのは気づきませんでした・・・
勉強になりました。

閉鎖

“C言語何でも質問掲示板” へ戻る