我的多维数组函数出了什么问题?

时间:2015-06-04 16:56:28

标签: c++ arrays function

我有一个问题。我想操纵以下矩阵

矩阵A = 1 --------- 2 ---------- 3

4 --------- 5 ---------- 6

7 --------- 8 ---------- 9

7 --------- 8 ---------- 9

4 --------- 5 ---------- 6

1 --------- 2 ---------- 3

#include<iostream>
using namespace std;

void f(int ArrayName, int Size);
int main()
{

    int x[3][3]={{1,2,3}, {4, 5,6},{7,8,9}};

    f(x, 3);

    system("pause");

}

void f(int ArrayName, int Size)
{
     int holder;
     for(int i=0; i<Size; i++){
             for(int j=0; j<Size; j++)
             {
                     holder=ArrayName[i][j];
                     ArrayName[i][j]=ArrayName[i+2][j+2];
                     ArrayName[i+2][j+2]=holder;
             }
             }


     for(int k=0; k<Size; k++)
             for(int l=0; l<Size; l++)
             {
                  cout<<ArrayName[k][l];  
                  if(l=3) cout<<"\n";
             }

}



Errors:
 E:\Semester 2\CPrograms\Array2.cpp In function `int main()':
10 E:\Semester 2\CPrograms\Array2.cpp invalid conversion from `int (*)[3][3]' to `int'
10 E:\Semester 2\CPrograms\Array2.cpp   initializing argument 1 of `void f(int, int)'
 E:\Semester 2\CPrograms\Array2.cpp In function `void f(int, int)':
22 E:\Semester 2\CPrograms\Array2.cpp invalid types `int[int]' for array subscript
(Last error repeated for five times)

3 个答案:

答案 0 :(得分:3)

一切都在我们面前完成。:)

您可以使用标头std::reverse

中声明的标准算法<algorithm>快速完成作业

例如

#include <iostream>
#include <algorithm>
#include <iterator>

int main() 
{
    int a[3][3] =
    {
        { 1, 2, 3 }, 
        { 4, 5, 6 },
        { 7, 8, 9 }
    };

    for ( const auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    std::cout << std::endl;

    std::reverse( std::begin( a ), std::end( a ) );

    for ( const auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}

程序输出

1 2 3 
4 5 6 
7 8 9 

7 8 9 
4 5 6 
1 2 3 

至于你的代码那么已经有了这个函数声明

void f(int ArrayName, int Size);

错了。

第一个参数应该是对数组的引用或指向其第一个元素的指针。

例如

void f( int ( &ArrayName )[3][3] );

void f( int ( *ArrayName )[3], int Size );

如果您想自己编写函数,那么它可以采用以下方式

#include <iostream>

void reverse( int ( *ArrayName )[3], size_t Size )
{
    for ( size_t i = 0; i < Size / 2; i++ )
    {
        for ( size_t j = 0; j < 3; j++ )
        {
            int tmp = ArrayName[i][j];
            ArrayName[i][j] = ArrayName[Size - i - 1][j];
            ArrayName[Size - i - 1][j] = tmp;
        }
    }
}

int main() 
{
    int a[3][3] =
    {
        { 1, 2, 3 }, 
        { 4, 5, 6 },
        { 7, 8, 9 }
    };

    for ( const auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    std::cout << std::endl;

    ::reverse( a, 3 );

    for ( const auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}

程序输出与上面相同。

答案 1 :(得分:2)

你的功能的原型和声明应该是:

void f(int ArrayName[][3], int Size)

将代码修改为:

#include<iostream>
using namespace std;
void f(int ArrayName[][3], int Size);   //change here
int main()
{

int x[3][3]={{1,2,3}, {4, 5,6},{7,8,9}};

f(x, 3);

system("pause");

}

void f(int ArrayName[][3], int Size)   //change here
 {
 int holder;
 for(int i=0; i<Size/2; i++){            //change here
         for(int j=0; j<Size; j++)
         {
                 holder=ArrayName[i][j];
                 ArrayName[i][j]=ArrayName[size-i-1][size-i-1]; //change here
                 ArrayName[size-i-1][size-i-1]=holder;     //change here
         }
         }

答案 2 :(得分:0)

尝试以下代码中的解决方案。它使用矩阵作为向量,但在f()函数原型中没有维度依赖性。

您的代码中存在一些错误:

  • 数组x[][]必须通过引用/指针而不是值传递,然后函数f()必须接收指向int的指针(或引用),而不是int !

  • for循环扫描矩阵行不一定是for(int i=0; i<Size; i++),而是for(int i=0; i<Size/2; i++)。使用i<Size您将所有行交换两次,然后似乎没有任何反应!

  • 以下代码:

ArrayName[i][j]=ArrayName[i+2][j+2];
ArrayName[i+2][j+2]=holder;

应该是:

ArrayName[i][j]=ArrayName[Size-i-1][j];
ArrayName[Size-i-1][j]=holder;
  • 以下代码:
if(l=3) cout<<"\n"; 

l = 3指定一个值,不做比较。

应该是:

if(l==Size-1) cout<<"\n";
#include<iostream>

using namespace std;
void f(int * ArrayName, int Size);

int main()
{
    static const int Size=4;
    int x[Size][Size];

    //Loads the numbes into the matrix
    for(int i=0;i<Size;i++)
        for(int j=0;j<Size;j++)
            x[i][j]=i*Size+j+1;

    f(&x[0][0], Size);
}

void f(int *ArrayName, int Size)
{
    int holder;
    cout << "Input\n";
    for(int k=0; k<Size; k++) {
        for(int l=0; l<Size; l++)             
            cout<<ArrayName[k*Size+l]<<" ";  
        cout << "\n";
    }

    // Elaborate the matrix
    // ----------------------------------------
    for(int i=0; i<Size / 2; i++){
        for(int j=0; j<Size; j++) {
            holder=ArrayName[i*Size+j];
            ArrayName[i*Size+j]=ArrayName[(Size-i-1)*Size+j];
            ArrayName[(Size-i-1)*Size+j]=holder;
        }
    }
    // ----------------------------------------

    cout << "----------\n" << "Output\n";

    for(int k=0; k<Size; k++) {
        for(int l=0; l<Size; l++)             
            cout<<ArrayName[k*Size+l]<<" ";  
        cout << "\n";
    }

}