アプリ版:「スタンプのみでお礼する」機能のリリースについて

2次元配列を関数に渡すときは、引数に渡す2次元配列と同じサイズを指定、もしくは2次元目のサイズのみ合わせて渡す方法がありますが、両方とも違うサイズで同じ関数を使いたいです。
最初は中身が同じで引数で受け取る2次元配列のサイズだけ、それぞれに合わせた引数を持つ関数を2つ作っていたのですが、なんだか冗長な気がしました。
そこで、2次元配列の先頭ポインタとサイズを受け取るようにすればいいのかと思い、テストとして次のプログラムを作成してみました。
#include <stdio.h>

void func(unsigned char *a, int y, int x);

int main(void)
{
unsigned char a[10][10];

func(a, 10, 10);

printf("%d\n", a[7][4]);

return 0;
}

void func(unsigned char *a, int y, int x)
{
int i, j;

for (i = 0; i < y; i++) {
for (j = 0; j < x; j++) {
*(a + i*y + j) = i * j;
}
}
}

もちろんこれでも動くのですが、やはりこういう書き方はルールにはないので、コンパイルで警告が出ます。
a.c: In function ‘main’:
a.c:10: warning: passing argument 1 of ‘func’ from incompatible pointer type
a.c:4: note: expected ‘unsigned char *’ but argument is of type ‘unsigned char (*)[10]’

このような書き方はやはりやめたいいのでしょうか。
また、その際はサイズ別に関数を作るしかないのでしょうか。
他にいい方法があれば教えていただけると助かります。

A 回答 (5件)

>もちろんこれでも動くのですが、やはりこういう書き方はルールにはないので、コンパイルで警告が出ます。



それがプログラマ側で意図した使い方であって、そのような警告が出ることがわかってたなら問題はないです。
警告を出したくないなら出ないように対策すればいいだけですし。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

必ずだめというわけではないんですね。
なるほど、警告の対策の仕方はまた調べてみます。

お礼日時:2014/12/13 03:10

「先頭要素のアドレス」なら


&a[0][0]
だよね.

それはそれとしてちょっと注意が足りないかな.
    • good
    • 0

ああそうだ, 引数の順番はどうしても


unsigned char *a, int y, int x
じゃないとダメ?

この回答への補足

No.2、No3の回答ありがとうございます。

確かに2次元配列の先頭アドレスを&演算子を使って送ればよかったですね…。
引数の順番は変えても問題ないです。
今試してみたらできました、順番変えてもできるとは気づかなかったです。
実際、関数内でポインタの演算によってやるのではなく、配列の方が見やすいためにそれでできる方法はないかと探っていました。
&a[0][0]か引数の順番を変えることによってやりたいと思いますが、どちらがいいでしょうか。
といってもどちらも変わりはしないのですが・・・。

補足日時:2014/12/13 03:18
    • good
    • 0

引数の順番を変えてもいいなら


void func(int y, int x, unsigned char a[x][y])
かな。(C++では不可、C99以降限定)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

やはり引数をポインタで書くよりは配列の方が見やすく、どのような大きさのものが必要かもすぐにわかるためいいですよね。
こちらを使わせていただきます。

お礼日時:2014/12/15 23:26

警告を消したいだけなら


void func(void *aa, int y, int x)
{
unsigned char *a=(unsigned char*)aa;
以下変更なし
とすればできます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

なるほど、voidへのポインタ型で一度受け取るという方法もあったんですね。
今回はvoid func(int x, int y, unsigned char a[y][x])という方法で進めることにしましたが、勉強になります。
ありがとうございました。

お礼日時:2014/12/15 23:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!