我正在努力解决2D数组参数

时间:2019-10-27 22:55:25

标签: c++

我必须使用户定义的函数随机化2d矩阵的值,并让另一个用户定义的函数将其打印出来。我在参数方面遇到问题,其他地方都给我带来困惑/反对的答案。

我尝试过

-int antcolony[SIZE][SIZE]
-int antcolony[][SIZE]
-int antcolony[][]
-int antcolony[SIZE,SIZE]

和其他我不记得的。请帮助

#include <iostream>
#include <cstdlib>
#include <ctime>
 using namespace std;

/*  Function: colonizePhermones
 * Parameters: int Size, const int antColony[][SIZE]
 * Return: n/a
 * Description: randomize the values in antColony
 */
void colonizePhermones(int SIZE, int antColony[SIZE][SIZE]);

/*  Function: printPhermones
 * Parameters: const int antColony[][SIZE]
 * Return: n/a
 * Description: print the values in antColony
*/
void printPhermones(int SIZE, int antColony[SIZE][SIZE]);


int main() {
    //declaring variables
    const int SIZE = 10;
    int colonyPath[SIZE];
    int antColony[SIZE][SIZE];
    int pathCounter = 0;
    colonyPath[pathCounter]= 0;

    //test caling functions
    colonizePhermones(SIZE, antColony[SIZE][SIZE]);
    printPhermones(SIZE, antColony[SIZE][SIZE]);

    return 0;
}

void colonizePhermones(int SIZE, int antColony[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            if ( i == j) {
                antColony[i][j] = 0;
            }
            else {
                antColony[i][j] = ((rand() % 19) +1);
            }
        }
    }
}

void printPhermones(int SIZE, int antColony[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            cout << antColony[i][j] << " ";
        }
        cout << endl;
    }
}

除了给我错误消息外,它什么也没做。我需要它来打印数组。

2 个答案:

答案 0 :(得分:2)

其他信息:

如果要将普通的旧C数组传递给函数,则有两种可能。

  1. 通过引用传递
  2. 通过指针传递

您似乎想通过引用传递。但是您使用的语法错误。

请参阅:

void function1(int(&m)[3][4])   // For passing array by reference
{}
void function2(int(*m)[3][4])   // For passing array by pointer
{}

int main()
{
    int matrix[3][4]; // Define 2 dimensional array

    function1(matrix);  // Call by reference
    function2(&matrix); // Call via pointer 
    return 0;
}

传递给函数的是指向int数组的衰减指针。

只需更正语法即可使用。

其他提示:

请勿在C ++中使用纯C样式的数组。决不。请使用STL容器。

答案 1 :(得分:1)

以下行无效:

void colonizePhermones(int SIZE, int antColony[SIZE][SIZE]);

通常,通过具有数组的数组,C风格的数组可能是多维的。这意味着指向外部数组元素的指针将是指向数组的指针。

但是,为了声明一个指针,必须知道该指针的确切类型,即该指针指向的元素的类型。为了声明一个指向数组数据类型的指针,因此,您还必须指定指针指向的数组的大小。该大小必须是在编译时已知的恒定值。但是,在函数声明的情况下,它不是常数,因为您将数组的大小指定为第一个函数参数(“ SIZE”)的值。函数参数始终是变量,并且永远都不是编译时常量,因为编译器必须假定可以使用不同的参数来调用函数(即使程序中从未发生过)。

因此,为了修复程序,建议您将上面引用的行更改为以下内容:

void colonizePhermones(int array_size, int antColony[SIZE][SIZE]);

这样,第二个参数中的数组大小不再引用第一个参数。但是现在未声明变量SIZE。因此,我建议您现在移线

const int SIZE = 10;

从函数main到全局范围,使其成为全局变量。之后,数组的大小现在将是一个编译时常量,并且您将不再收到错误消息。

现在功能colonizePheromones已修复。要修复功能printPhermones,您必须执行相同的操作。

但是,您的程序中还有另一个错误。以下几行是错误的:

colonizePhermones(SIZE, antColony[SIZE][SIZE]);
printPhermones(SIZE, antColony[SIZE][SIZE]);

作为两个函数中的第二个参数,必须传递数组decayed to a pointer to the first element of the outer array。相反,您传递的是内部数组的单个元素的值。该元素甚至不存在,因为您正在访问多维数组。如果SIZE为10,那么您将通过以下方式访问数组:

antColony[10][10]

但是,有效索引为0-9,因为数组的两个维度的大小均为10。

因此,我上面引用的两行应如下所示:

colonizePhermones(SIZE, antColony);
printPhermones(SIZE, antColony);

整个程序将如下所示,并且编译没有错误:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

const int SIZE = 10;

/*  Function: colonizePhermones
* Parameters: int Size, const int antColony[][SIZE]
* Return: n/a
* Description: randomize the values in antColony
*/
void colonizePhermones( int array_size, int antColony[SIZE][SIZE] );

/*  Function: printPhermones
* Parameters: const int antColony[][SIZE]
* Return: n/a
* Description: print the values in antColony
*/
void printPhermones( int array_size, int antColony[SIZE][SIZE] );



int main()
{
    //declaring variables

    int colonyPath[SIZE];
    int antColony[SIZE][SIZE];
    int pathCounter = 0;
    colonyPath[pathCounter] = 0;

    //test caling functions
    colonizePhermones( SIZE, antColony );
    printPhermones( SIZE, antColony );

    return 0;
}

void colonizePhermones( int array_size, int antColony[SIZE][SIZE] ) {
    for ( int i = 0; i < SIZE; i++ ) {
        for ( int j = 0; j < SIZE; j++ ) {
            if ( i == j )
            {
                antColony[i][j] = 0;
            }
            else
            {
                antColony[i][j] = ((rand() % 19) + 1);
            }
        }
    }
}

void printPhermones( int array_size, int antColony[SIZE][SIZE] ) {
    for ( int i = 0; i < SIZE; i++ ) {
        for ( int j = 0; j < SIZE; j++ )
        {
            cout << antColony[i][j] << " ";
        }
        cout << endl;
    }
}

使用这些C样式数组的替代方法是使用std::vector,它的优点是长度不必是编译时常量,而是可以在运行时动态更改。