【问题标题】:Array being filled with garbage数组被垃圾填满
【发布时间】:2015-11-11 00:06:35
【问题描述】:

我正在研究一个最长的公共子序列程序,由于某种原因,即使我将其中的所有内容都初始化为 NULL,我的数组仍然被垃圾填满。

    #include "main.h"

    int main()
    {
        //Provided char arrays containing sequences
        char X[] = { ' ', 's', 'k', 'u', 'l', 'l', 'a', 'n', 'd', 'c', 'r', 'o', 's', 's', 'b', 'o', 'n', 'e', 's' };
        char Y[] = { ' ', 'l', 'u', 'l', 'l', 'a', 'b', 'i', 'e', 's', 'f', 'o', 'r', 'b', 'a', 'b', 'i', 'e', 's' };

    //Char array that will contain the directions
    //for the longest subsequence
    char b[ARRAY_ROW][ARRAY_COL];

    int c[ARRAY_ROW][ARRAY_COL];

    //Envoking LCS function
    LongestCommonSubsequence(X, Y, b, c);

    int row = ARRAY_ROW;
    int col = ARRAY_COL;

    //Envoking traverse function
    Traverse(b, X, row, col);

    cout << "END PHASE" << endl;

    return 0;
}

void LongestCommonSubsequence(char x[], char y[], char b[ARRAY_ROW][ARRAY_COL], int c[ARRAY_ROW][ARRAY_COL])
{
    //hardcoded length look back here
    int m = ARRAY_ROW - 1;
    int n = ARRAY_COL - 1;

    for (int i = 0; i <= m; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            c[i][j] = 0;
            b[i][j] = 0;
        }
    }

    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (x[i] == y[j])
            {
                c[i][j] = c[i - 1][j - 1] + 1;
                b[i][j] = '\\';
            }
            else if (c[i - 1][j] >= c[i][j - 1])
            {
                c[i][j] = c[i - 1][j];
                b[i][j] = '|';
            }
            else
            {
                c[i][j] = c[i][j - 1];
                b[i][j] = '-';
            }
        }
    }

    return;
}

void Traverse(char b[][ARRAY_COL], char x[], int i, int j)
{

    if (i == 0 || j == 0)
        return;
    if (b[i][j] == '\\')
    {
        Traverse(b, x, i - 1, j - 1);
        cout << x[i];
    }
    else if (b[i][j] == '|')
    {
        Traverse(b, x, i - 1, j);
    }
    else
    {
        Traverse(b, x, i, j - 1);
    }
    return;
}

在我的 LongestCommonSubsequence 函数中,我做的第一件事是使用硬编码大小将 2D 数组初始化为 NULL。但是,在我初始化数组之后,它仍然充满了垃圾。因此,当我点击 Traverse 函数时,没有任何 if 语句被命中,因为它从不等于那些字符。

【问题讨论】:

  • 当您使用调试器时,哪个语句导致了问题?语句使用的变量的值是多少?
  • for (int i = 0; i &lt; 50; i++) for (int j = 0; j &lt; 50; j++) cout &lt;&lt; b[i][j]; 你为什么要去50?你确定你的二维数组中有这么多元素吗?
  • @A.S.H 抱歉,这只是为了测试,我刚刚删除了。
  • @ThomasMatthews 对于横向函数,它填充了诸如“skullandcrossbone”之类的东西,而它应该只填充 / |或 -
  • 嗯,垃圾可能是由于打印到 50 造成的。如果你修复它,你不会有垃圾,但你可能还有其他问题要继续让你的算法工作。

标签: c++ arrays subsequence


【解决方案1】:

我找到了解决方案!当我调用 Traverse 函数时

int row = ARRAY_ROW;
int col = ARRAY_COL;

//Envoking traverse function
Traverse(b, X, row, col);

我为最后两个参数传递了 19 和 19。然后在我的 Traverse 函数中

void Traverse(char b[][ARRAY_COL], char x[], int i, int j)
{
    if (i == 0 || j == 0)
        return;
    if (b[i][j] == '\\')
    {
        Traverse(b, x, i - 1, j - 1);
        cout << x[i];
    }
    else if (b[i][j] == '|')
    {
        Traverse(b, x, i - 1, j);
    }
    else
    {
        Traverse(b, x, i, j - 1);
    }
    return;
}

我们试图从读取不存在的 b[19][19] 开始,因为我们的数组只有 b[0-18][0-18]。

然后我们通过添加来修复它

int row = ARRAY_ROW - 1;
int col = ARRAY_COL - 1;

//Envoking traverse function
Traverse(b, X, row, col);

现在我们能够找到最长的公共子序列。

【讨论】:

  • 然后@M.M 的直觉就出现了 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
相关资源
最近更新 更多