注册 登录
编程论坛 C++教室

用多维数组名作为函数参数时,如果数组的行和列均是变量,怎么办?

UCU月祭 发布于 2012-12-03 12:59, 965 次点击
我们老师叫写一个幻方的程序,需要动态申请一个空间。我想把奇数阶的幻方生成用一个用户自定义的函数写。但是参数是一个变量。这个该怎么办?
void huanfang(???)
{
    for(int y=0;y<n;y++)
    {
        for(int x=0;x<n;x++)
            k[y][x]=0;
    }
    int m,c;
    m=0,c=(n-1)/2;
    k[m][c]=1;
    for(int j=2;j<=n*n;j++)
    {
        if(m-1<0&&c+1<n&&c+1>=0)
        {
            m=n-1;c++;
        }
        else if(m-1>=0&&c+1>n-1)
        {
            m--;c=0;
        }
        else if(m-1<0&&c+1>n-1)
        {
            m++;
        }
        else if(p[m-1][c+1]!=0)
        {
            m++;
        }
        else
        {
            m--;c++;
        }
            k[m][c]=j;
    }
}
8 回复
#2
mmmmmmmmmmmm2012-12-03 13:27
从楼主的程序来看
void huanfang(int k[][10])


[ 本帖最后由 mmmmmmmmmmmm 于 2012-12-3 14:39 编辑 ]
#3
azzbcc2012-12-03 14:42
calloc
#4
rjsp2012-12-03 14:53
说得不清不楚,我只能猜你的意图
void huanfang( int* k, int n )
然后将所有的 k[行][列] 改为 k[(行)*n+(列)]
但其中有个 else if(p[m-1][c+1]!=0),不知道你这个p是个啥屁
#5
rjsp2012-12-03 14:53
调用事例
int buf[5][5];
huanfang( &buf[0][0], 5 );
#6
rjsp2012-12-03 15:36
我根据你的思路重写了一个
代码还是罗嗦了点儿,但我用下班了,没时间优化了
程序代码:
#include <iostream>
#include <cassert>

template<size_t N>
void huanfang( size_t (&arr)[N][N] )
{
    assert( N>0 && N%2==1 );

    for( size_t r=0; r<N; ++r )
        for( size_t c=0; c<N; ++c )
            arr[r][c] = 0;

    size_t r=0, c=N/2;
    for( size_t i=0; i<N*N; ++i )
    {
        arr[r][c] = i+1;

        if( arr[(r+N-1)%N][(c+1)%N] == 0 )
            r=(r+N-1)%N, c=(c+1)%N;
        else
            r=(r+1)%N;
    }
}

template<typename T, size_t R, size_t C>
void printarray( const T (&arr)[R][C] )
{
    for( size_t r=0; r<R; ++r )
    {
        for( size_t c=0; c<C; ++c )
        {
            std::cout << '\t' << arr[r][c];
        }
        std::cout << '\n';
    }
    std::cout << std::endl;
}

int main()
{
    size_t buf[5][5];
    huanfang( buf );
    printarray( buf );

    return 0;
}


#7
lyj1232012-12-04 20:09
用多维数组名作为函数参数时,如果数组的行和列均是变量,怎么办?
代码没时间看了,这个问题
    作为C++来说可以选择略显歪门邪道的方法。  首先,用变量得到数组空间的大小如  要申请int a[x][y]的动态存储区,而x,y是变量则
    const int x1=x,y1=y;
        int a[x1][y1];

这个方法虽然比较歪,但是很好用。
    也可以选择 new 建立正规的动态存储区
#8
wuxia1111112012-12-04 23:28
是想传给n一个值吧。可以在主函数里这样写程序:
int main()
{
  int n;
  cout<<"请输入一个整数:";
  cin>>n;
  huanfang(n);

  return 0;
}
这样变量也可以传过去了。
#9
rjsp2012-12-05 08:31
回复 7楼 lyj123
不可以的
如果是C++,必须要求是编译期常量
如果是C,本身支持变长数组

我怀疑你用的是g++,g++将C99的变长数组带入了C++中,但那不是标准的C++语法
1