我的转置矩阵代码有什么问题?

时间:2019-08-12 00:11:48

标签: c++

我试图切换行和列的位置,换句话说,我试图将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];
        }
    }
}                          

1 个答案:

答案 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函数,因此该函数是在程序终止之前在完成输出之前添加的。

打印2D阵列

您还试图通过访问单个值来打印数组,因此将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

我已向您提供了修复代码所需的所有信息。