将值从一个函数传递到另一个C ++

时间:2019-11-25 17:49:51

标签: c++ function-declaration

我正在编写两个函数:其中一个用于用随机值“填充”数组并设置int第二个函数,我必须使用相同的数组,选择一行并找到该行的min元素。

但是问题是我不知道如何将值从一个函数传递给另一个函数。

这是我的代码:

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

void fillarray(int arr[5][5], int rows, int cols) {
    cout << "Static Array elements = \n\n" << flush;

    for(int i = 0; i < rows; ++i) {
        cout << "Row " << i << "  ";
        for(int j = 0; j < cols; ++j) {
            arr[i][j] = rand() % 10;
            cout << arr[i][j] << " " << flush;
        }
        cout << endl;
    }
    cout << " \n\n";
}

void minarray(int a, void fillarray) { // don't know what to write here

there:
    int min = INT_MAX; // Value of INT_MAX is 2147483648.

    if(a > 4) {
        cout << "Invalid input! " << endl;
        goto there;
    }

    for(int counter = 0; counter < 5; ++counter) {
        if(arr[a][counter] < min) min = arr[a][counter];
    }
    cout << "Minimum element is " << min << endl;
}
int main() {
    int z;

    srand(time(NULL));
    const int rows = 5;
    const int cols = 5;
    int arr[rows][cols];
    fillarray(arr, rows, cols);
    cout << "Enter the number of row: ";
    cin >> z;
    minarray(z, fillarray) 
    system("PAUSE");
}

4 个答案:

答案 0 :(得分:0)

对于初学者来说,函数fillarray具有冗余参数cols,因为从第一个参数int arr[5][5]的声明中可以知道此数字。

可以像这样声明函数

void fillarray(int arr[5][5], int rows )

如果未在函数中填充整个数组,则可以提供参数cols

您已经通过此调用填充了数组

fillarray ( arr, rows, cols );

该功能执行了其任务。因此,您无需在尝试时再次引用该函数

minarray(z, fillarray)

函数minarray可以像这样声明

void minarray( const int arr[], size_t n );

并称呼为

minarray( arr[z], cols );

初步检查z小于5。

或者可以将其声明为

void minarray( const int arr[][5], size_t n, size_t row );

并称呼为

minarray( arr, rows, z );

请注意,存在标准算法std::min_element,该算法可以查找数组中的最小元素。要用值填充数组,可以使用标准算法std::generate

每个功能只能执行一项任务。例如,函数fillarray应该用值静默地填充数组。要输出数组,可以编写一个单独的函数。

答案 1 :(得分:0)

我不确定它是否可以编译,但是我猜您想将int arr [x] [y]从fill Array函数传递给minArray函数。为此,您首先需要将arr作为minArray的参数。从那里,您需要通过引用传递它。然后,您可以从fillArray调用minArray。

答案 2 :(得分:0)

您需要做的是调用fillarray来填充数组。所以看起来像

fillarray(arr, rows, cols);

就像您到目前为止一样。现在,您已经全部填写了数组arr。minarray不在乎这是怎么发生的。因此,请不要通过您的填充方法。将其传递给数组。

minarray(cols, arr[z]);

您不需要传递整个数组-只需传递相关行即可。您也在传递宽度。

并更改minarray的定义:

void minarray(int length, int[] array)

现在,您的minarray本身需要更改。首先,摆脱if-check。您现在不需要传递行号,但是您确实需要按长度传递列数。

然后您的for循环如下:

for (int index = 0; index < length; ++index) {
    if (array[index] < min) {
        min = array[index];
    }
}

所以,总结一下:

  • Main声明数据并调用您的两个方法。

  • fillarray填充数组。从主要方式调用它就已经拥有了。

  • minarray在一行上打印最小值。也可以从main调用它,传入数组,而不是填充它的方法。

但是,您还有另外一期。 fillarray将数组大小硬编码为5x5,但是main使用定义的常量。我会将那些内容移到文件的顶部,并在两个地方都使用它们。

移动到顶部,在任何#includes下方:

const int rows = 5;
const int cols = 5;

定义fillarray:

void fillarray(int arr[rows][cols]) {

当您从main调用它时:

fillarray(arr);

答案 3 :(得分:0)

我将让其他答案回答您的问题,并专注于您在评论中询问的goto周围的代码。

main中,您有以下内容:

    cout << "Enter the number of row: ";
    cin >> z;
    minarray(z, fillarray) 

minarray中,您有以下内容:

void minarray(int a, void fillarray) { // don't know what to write here

there:
    int min = INT_MAX; // Value of INT_MAX is 2147483648.

    if(a > 4) {
        cout << "Invalid input! " << endl;
        goto there;
    }

首先,绝对没有理由使用goto。您可以这样做:

void minarray(int a, void fillarray) { // don't know what to write here
    int min = INT_MAX; // Value of INT_MAX is 2147483648.

    while(a > 4) { // loop for as long as "a > 4"
        cout << "Invalid input! " << endl;
    }

删除goto使该错误变得很明显。 a将永远不会在循环内更改,因此,如果您给它输入无效的输入,它将永远打印Invalid input!。一种替代方法是当您实际从用户那里获得输入时(在main中)来验证输入:

    while(true) { // loop forever
        cout << "Enter the number of row: ";
        if(cin >> z) {                  // check that the user inputs an int 
            if(z<0 || z>4)              // validate the input
                cout << "Invalid input!\n";
            else
                break;                  // we got valid input, break out of the while loop
        } else {                        // user did not input an int
            std::cout << "input failed - aborting\n";
            return 1;                   // return from main to exit the program
        }
    } // if the program reaches this point, it'll ask the user for input again
      // and that will only happen if the user gives it an int that is <0 or >4