ページ 11

二次元配列のポインタはどうやってやるんですか?

Posted: 2013年1月25日(金) 18:54
by Santasan

コード:

 
#include<stio.h>
main()
{
           void point(int **a);
           int a[8][8];
           
           point(&a);
           
           for(int i=0; i<8; i++)
           {
                      for(int i=0; i<8; i++)
                      {
                                   printf("%d, ",a[i][j]);
                      }
           }
}
void point(int **a)
{
           a[4][4] = 1;
}

このようにポインタを使って関数に渡して関数で二次元配列を変更するプログラムを作りたいんですけど
これでは動きません。
改善策をお願いします

Re: 二次元配列のポインタはどうやってやるんですか?

Posted: 2013年1月25日(金) 19:17
by softya(ソフト屋)
2次元配列はダブルポインタでは処理出来ません。
1次元配列はポインタで処理出来るんですが、これがややこしいところです。
って事で次のように書きます。※他のコンパイルエラーも直してあります。

コード:

#include<stdio.h>
main() {
	void point( int (*a)[8] );
	int a[8][8] = {0};
	int i,j;

	point( a );

	for( i = 0; i < 8; i++ ) {
		for( j = 0; j < 8; j++ ) {
			printf( "%d, ", a[i][j] );
		}
		printf( "\n" );
	}
}
void point( int (*a)[8] ) {
	a[4][4] = 1;
}
あるいは、
void point( int a[][8] )
と書いても良いです。

Re: 二次元配列のポインタはどうやってやるんですか?

Posted: 2013年1月25日(金) 20:25
by Santasan
できました
ありがとうございました

Re: 二次元配列のポインタはどうやってやるんですか?

Posted: 2013年1月25日(金) 20:32
by salsaww

コード:

#include <iostream>
#include <vector>

typedef std::vector<int> oneD;
typedef std::vector< oneD > twoD;
void pointReset(twoD& t)
{
	t[4][4]=99;
}
int main(int argc,char* argv[])
{
	twoD array(8, oneD(8,1));
	pointReset(array);

	for(twoD::iterator iter= array.begin();iter != array.end();iter++)
	{
		for(oneD::iterator inner = iter->begin();inner != iter->end();inner++)
			{	std::cout<< *inner <<", ";}
		std::cout<<std::endl;
	}
	return 0;
}
書き上げてから、c++じゃなくて、Cか…と思ったけど、折角書いたので。
Visual C++ 2008とかでも、動くようにauto変数とかfor range-based loopsとかは使ってません。
Visual C++ 2012とか、clang++ の新しいのとか、gccの新しいのなら
したのでも可能かと。

コード:

#include <iostream>
#include <vector>

typedef std::vector<int> oneD;
typedef std::vector< oneD > twoD;

void pointReset(twoD& t)
{ t[4][4]=99; }

int main(int argc,char* argv[])
{
	twoD array(8, oneD(8,1));
	pointReset(array);

	for(auto outer: array)
	{
		for(auto inner: outer)
			{	std::cout<< inner <<", ";}
		//range-based for loopsだと、
		//Iteratorじゃなくて実体が来るのでinnerの前の* が消える。
		std::cout<<std::endl;
	}
	return 0;
}