【问题标题】:cannot convert `char (*)[((unsigned int)((int)Tlength))]' to `char** [duplicate]无法将 `char (*)[((unsigned int)((int)Tlength))]' 转换为 `char** [重复]
【发布时间】:2012-10-19 02:55:46
【问题描述】:

可能重复:
passing 2d arrays

我的代码中有一个问题。谁能帮帮我?

void print(char S[], char * * path, int i, int j) {
    if (i == 0 || j == 0) return;
    if (path[i][j] == 'c') {
        print(S, path, i - 1, j - 1);
        cout << S[i];
    }
    else if (path[i][j] == 'u') print(S, path, i - 1, j);
    else print(S, path, i, j - 1);
}
int LongestCommonSubsequence(char S[], char T[]) {
    int Slength = strlen(S);
    int Tlength = strlen(T); /* Starting the index from 1 for our convinience (avoids handling special cases for negative indices) */
    int i, j;
    char path[Slength][Tlength];
    int common[Slength][Tlength];
    for (i = 0; i <= Tlength; i++) {
        common[0][i] = 0;
    } /*common[i][0]=0, for all i because there are no characters from string T*/
    for (i = 0; i <= Slength; i++) {
        common[i][0] = 0;
    }
    for (i = 1; i <= Slength; i++) {
        for (j = 1; j <= Tlength; j++) {
            if (S[i] == T[j]) {
                common[i][j] = common[i - 1][j - 1] + 1;
                path[i][j] = 'c';
            }
            else if (common[i - 1][j] >= common[i][j - 1]) {
                common[i][j] = common[i - 1][j];
                path[i][j] = 'u';
            }
            else {
                common[i][j] = common[i][j - 1];
                path[i][j] = 'l';
            }

        }
    }
    print(S, path, Slength, Tlength); // it gives an Error!!!!
    return common[Slength][Tlength];

}

我的错误在于:

print(S,path,Slength,Tlength);

它给出了:

无法将参数“2”的“char ()[((unsigned int)((int)Tlength))]' to \``char**”转换为“void print(char, char*” *, int, int)'`

我该怎么办?

【问题讨论】:

  • path 衰减为指向数组的指针,而不是指向指针的指针。
  • 您假设char[W][H] 衰减为char**,这根本不是真的。它们甚至不兼容。
  • 我不知道为什么人们这么快就对笨拙的初学者问题投反对票而不留下任何评论?!? OP 在这里显示了太多代码,无法归结为真正的问题,但至少没有理由在没有最低限度地指出这一点的情况下投反对票!!!
  • @LightnessRacesinOrbit 为什么?奇美拉不是有自己认为合适的投票权吗??
  • @LightnessRacesinOrbit 这是我认为合适的投票权。期间。

标签: c++ c algorithm


【解决方案1】:

正如一些评论者已经提到的char [][](如char[],或char [][][],......也会)如果传递给一个函数会衰减到char *

所以要真正解决代码问题,只需更改

void print(char S[], char * * path, int i, int j) 

成为

void print(char S[], char * path, int i, int j) 

【讨论】:

    【解决方案2】:

    这是你的问题:

    char path[Slength][Tlength];
    int common[Slength][Tlength];
    

    (其中SlengthTlength 是非常量表达式)

    变长数组是非法的。 C++ 标准要求常量整数表达式用于声明中的数组边界(在new[] 表达式中,最外层边界可以是变量)。

    选民注意:OP 将他的问题标记为 C++,其他人更改了标签,不知道实际使用的是什么编译器。

    【讨论】:

    • 那么第二个参数类型char **在这种情况下有效吗?
    • 这在 C++11(或 C99 及更高版本)中不成立。
    • @slavik262:C++11 引入了 VLA?这对我来说是个新闻。而char**仍然不兼容。
    • @slavik262 不,C++11 没有 VLA。只有 C99 及更高版本可以。
    • 啊,it's a g++ extension。我很抱歉。
    猜你喜欢
    • 2018-08-22
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2011-12-15
    • 2015-01-20
    • 2016-08-24
    相关资源
    最近更新 更多