编译时我一直遇到同样的错误。简要介绍,该程序从用户获取两个整数(比如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;
}
答案 0 :(得分:0)
二维数组(矩阵)不是指针数组(你的形式参数)。
另请注意此代码,
struct mult_div_values table [m][n];
无效C ++,因为m
和n
不是编译时常量。它被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;
}