结构格式化问题,无法转换

时间:2014-10-03 02:04:02

标签: c++ arrays 2d structure

编译时我一直遇到同样的错误。简要介绍,该程序从用户获取两个整数(比如m,n),创建一个2D数组(m行​​和n列),然后计算并打印这些值的乘法和除法表。

我道歉,因为我睡不着觉(和咖啡)。请你尽可能的善意,因为我上次编写代码已经两年多了。

我收到的错误如下:

test1.cpp: In function ‘void createTable(int, int)’:
test1.cpp:69: error: cannot convert ‘mult_div_values (*)[(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)]’ to ‘mult_div_values**’ for argument ‘1’ to ‘void multArray(mult_div_values**, int, int)’
test1.cpp:70: error: cannot convert ‘mult_div_values (*)[(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)]’ to ‘mult_div_values**’ for argument ‘1’ to ‘void divArray(mult_div_values**, int, int)’

显然,问题在于这个功能,但是我无法弄清楚问题是什么,如果有人能给我一个关于我在寻找什么的提示,我将非常感激。

void createTable(int m, int n)
{
    struct mult_div_values table [m][n]; //Initialize table array

    multArray(table, m, n);
    divArray(table, m, n);

    return;
}

整个代码(如果我的代码让你的专业人员畏缩,我会道歉):

#include <iostream>
#include <string>
#include <stdlib.h> //atoi function
#include <cctype>

using namespace std;

//Declare structure for multiplication and division values
struct mult_div_values {
    int mult;
    float div;
};

//Prototype functions
void multArray(mult_div_values** table, int m, int n);
void divArray(mult_div_values** table, int m, int n);
void createTable(int m, int n);
void checkValues(char* argv[]);
void printMult(mult_div_values** table, int m, int n);
void printdiv(mult_div_values** table, int m, int n);

int main(int argc, char* argv[])
{    
    checkValues(argv); //Passes argument values to check for validity.

    return 0;
}

/*********************************************************************
 ** Parameters: Takes in the 1st and 2nd character arguments from the command line.
 ** Description: Checks that arguments are in fact numbers.  Converts value from character to integer.
 ** Return value: Converted integer values.
 *********************************************************************/
void checkValues(char* argv[])
{   
    //Convert char to int
    int m = atoi(argv[1]);
    int n = atoi(argv[2]);

    //Check that in is 
    if ((m < 1) || (n < 1))
    {
       cout << "Error!" << endl;
    }
    cout << m << n << endl;

    createTable(m, n);

}

/*********************************************************************
 ** Parameters: Takes in column and row values.
 ** Description: Initializes table array.
 *********************************************************************/
void createTable(int m, int n)
{
    struct mult_div_values table [m][n]; //Initialize table array

    multArray(table, m, n);
    divArray(table, m, n);

    return;
}

/*********************************************************************
 ** Parameters: Takes in table array and number of columns/rows.
 ** Description: Computes multiplication values.
 *********************************************************************/
void multArray(mult_div_values** table, int m, int n)
{
    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            table[i - 1][j - 1].mult = i*j;
        }
    }

    return;
}

/*********************************************************************
 ** Parameters: Takes in table array and number of columns/rows.
 ** Description: Computes division values.
 *********************************************************************/
void divArray(mult_div_values** table, int m, int n)
{

    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            table[i - 1][j - 1].div = i/j;
        }
    }

    return;
}

/*********************************************************************
 ** Parameters: Takes in multiplication values and number of columns/rows.
 ** Description: Builds multiplication table and prints.
 *********************************************************************/
void printMult(mult_div_values** table, int m, int n)
{

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << table[i][j].mult << "\t";
        }

        cout << endl;
    }

    return;
}

/*********************************************************************
 ** Parameters: Takes in division values and number of columns/rows.
 ** Description: Builds division table and prints.
 *********************************************************************/
void printdiv(mult_div_values** table, int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << table[i][j].div << "\t";
        }

        cout << endl;
    }

    return;
}

2 个答案:

答案 0 :(得分:0)

二维数组(矩阵)不是指针数组(你的形式参数)。

另请注意此代码,

struct mult_div_values table [m][n];

无效C ++,因为mn不是编译时常量。它被g ++(并且可能是由clang)接受为语言扩展。您最好通过指定-std=c++11-pedantic来解决此问题。

还要注意它是C风格,而不是C ++。

在C ++中,您无需在那里重复struct关键字。

在C ++中使用这个可变大小矩阵的一个好方法是使用std::vector,每个项目为std::vector,或者将2D索引映射到1D索引。你可以轻松地将它包装在一个类中。

答案 1 :(得分:0)

void createTable(int m, int n)
{
//Initialize table array
mult_div_values** table = new mult_div_values*[n]; 
for(int i = 0; i < n ; i++){

    table[i] = new mult_div_values[m];

}

//Call mult and div funtions
multArray(table, m, n);
divArray(table, m, n);

delete [] table; //Clear allocation

return;
}