我试图切换行和列的位置,换句话说,我试图将4乘5的矩阵旋转90度。
#include <stdio.h>
#include<iostream>
using namespace std;
#define r
#define c
void rotate(char src[r][c], char dest[c][r]);
int main()
{
char dest[5][4];
char src[4][5]={{'A','B','C','D','E'},
{'A','B','C','D','E'},
{'A','B','C','D','E'},
{'A','B','C','D','E'}};
cout<<dest[5][4];
}
void rotate(char src[r][c], char dest[c][r]){
int i,j;
for (i=0; i<r; i++){
for(j=0; j<c; j++){
dest[i*c+j]=src[j*c+i];
}
}
}
答案 0 :(得分:1)
此代码有几个错误。
在下面的代码部分中,您只是在定义它们,而没有给它们分配值。因此,预处理器可以完全填充正在使用的位置。
#define r
#define c
如果您想针对这种样式的数组正确使用宏,则需要按以下步骤进行操作。
#define r <value>
#define c <value>
在这种情况下,甚至应使用constexpr
。首选此原因是因为该变量将具有关联的类型,这将防止该变量被不正确地使用。与使用constexpr
变量生成的错误消息相比,使用定义生成的错误消息要难得多。
constexpr std::size_t r = <value>;
constexpr std::size_t c = <value>;
使用模板是更好的选择,因为它们可以处理多个不同的数组输入。 (基本上,编译器将为每个可以给出的r和c值对生成不同的代码段),或者传递参数也可以工作(这样可以避免为函数的每个不同变体生成额外的代码)。在下面的固定版本中,我使用了模板,因为您只有一个要转置的 matrix 。
void rotate(const char** src, char** dest, std::size_t r, std::size_t c) {
// ...
}
此外,您访问数组的方式似乎有些混乱。由于将数组视为2D数组,因此需要在数组上具有2个索引。和您的行/列顺序是混合的。将其更改为此可以解决该问题。
template <std::size_t r, std::size_t c>
void rotate(char src[r][c], char dest[c][r]) {
// Moved the variables within the scope of for loops
// Changed type from int to size_t.
// Swapped c and r in the condition for both loops.
for (std::size_t i = 0; i < c; i++){
for(std::size_t j = 0; j < r; j++){
dest[i][j] = src[j][i];
}
}
}
您也永远不会调用您的rotate函数,因此该函数是在程序终止之前在完成输出之前添加的。
您还试图通过访问单个值来打印数组,因此将cout << dest[5][4]
更改为以下内容。
for(int i = 0; i < 5; ++i) {
for(int j = 0; j < 4; ++j)
cout << dest[i][j];
cout << endl;
}
上面突出显示了更改,代码应产生此输出
AAAA
BBBB
CCCC
DDDD
EEEE
我已向您提供了修复代码所需的所有信息。