【问题标题】:Process returned - 1073741819 (0xC0000005)进程返回 - 1073741819 (0xC0000005)
【发布时间】:2023-03-25 00:33:02
【问题描述】:

我是 C 的初学者。我遇到了这个错误,我不知道如何解决它。我正在使用 Code:blocks 和 GNU GCC 编译器。这是一个简单的矩阵,必须使用 Shaker 排序进行排序。在我完成这项工作之前,我无法继续。请帮帮我。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(NULL));
    int r=11, s=23, m[r][s], i, j, pom;

    printf("Generated matrix:\n\n");
    for(i=0;i<r;i++)
    {
        for(j=0;j<s;j++)
        {
            m[i][j]=rand()%100;
            printf("%3d", m[i][j]);
        }
        printf("\n");
    }

    i=0;
    j=0;
    do{
        if(m[i][j]>=m[i+1][j+1])
        {
            pom=m[i+1][j+1];
            m[i+1][j+1]=m[i][j];
            m[i][j]=pom;
        }

        if(j==s)
        {
            i++;
            j=0;
        }

        if(i==r&&j==s)
            break;
        j++;
    }while(1);

    for(i=0;i<r;i++)
    {
        for(j=0;j<s;j++)
        {
            m[i][j]=rand()%100;
            printf("%3d", m[i][j]);
        }
        printf("\n");
    }

    printf("\n\n");
    return 0;
}

编辑:

是的,伙计们,我完全错了。现在我不再收到此错误,但我不明白为什么我无法将最高数字设为 m[r][s]。我总是得到完全相同的矩阵。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(NULL));
    int r=11, s=23, m[r][s], i, j, pom;

    printf("Generated matrix:\n\n");
    for(i = 0;i<r;i++)
    {
        for(j = 0;j<s;j++)
        {
            m[i][j] = rand()%100;
            printf("%3d", m[i][j]);
        }
        printf("\n");
    }
    printf("\n\n");
    i=0;
    pom=0;

    for(j=0;j=s;j++){
        if(m[i][j]>=m[i][j+1])
        {
            pom = m[i][j+1];
            m[i][j+1] = m[i][j];
            m[i][j] = pom;
        }

        if(i==r&&j==s)
            break;

        if(j==s)
        {
            i++;
            j=0;
        }
    }

    for(i = 0;i<r;i++)
    {
        for(j = 0;j<s;j++)
        {
            printf("%3d", m[i][j]);
        }
        printf("\n");
    }

    printf("\n\n");
    return 0;
}

【问题讨论】:

  • man 3 exitman 2 exit 结果是位掩码,只有低位构成实际的exit() 值,其余由进程退出的原因构成。顺便说一句:在“=”运算符周围使用一些空格。
  • 这是访问冲突的错误代码。在你的 do-while 循环中,仔细查看i==r &amp;&amp; j==s 时会发生什么。提示:你先打第二个if,这对ij 有影响...
  • 从排序逻辑来看,完全可以想象你退出的访问冲突是准确的。使用集成的gdb 会有所帮助,尽管仅在纸上走算法并记住维度为 N 的数组可以从 0..N-1 开始索引。如果您对 if (j==s) 的测试是真的,则意味着您已经违反了该索引前提并且您的程序格式不正确(确实如此)。
  • j 在 do-while 循环结束时递增,并且在下一次迭代中使用它之前不检查。而对i 的唯一检查是j 也处于限制状态,if(i==r&amp;&amp;j==s) break;。这永远不会发生,因为当您增加i 时,您会重置j。最后,您的矩阵操作被初始随机化的重复所挫败。
  • 在您的新编辑中,交换循环现在是for(j=0;j=s;j++),它在执行循环之前测试结束条件j=s。但是j=s 不是一个测试,而是一个赋值,它不仅将j 设置为超出矩阵数组的范围,而且对循环计算为true。每次迭代,j 超出矩阵范围,i 递增,直到循环仅在break 被命中时结束。我可以说你需要for(j=0;j&lt;s;j++),但这也不对。在循环中,当您应该使用两个嵌套循环时,您错误地摆弄ij

标签: c matrix


【解决方案1】:

您仍然在25 行包含基本错误:

// for(j=0;j=s;j++){

应该是:

for(j=0;j<s;j++){

在启用 警告 的情况下编译会立即披露此错误。每当您使用gcc 编译代码时,最低您应该启用-Wall -Wextra 警告。他们会为你节省很多时间。示例:

gcc -Wall -Wextra -o bin/mtrxerr mtrxerr.c

仅纠正该错误,提供以下输出,其中矩阵按应有的变化。但是,您的排序仍然需要额外的工作。以下是输出示例:

输出:

$ ./bin/mtrxerr
Generated matrix:

 69 41 30 55 44 78 67 30 81 14 92 62 21 91 66 21 28 98 69 30 90 43 57
 12 35 85 21 49 45 31 40 14 24 70 22 68  0 89 50 81 56 42 44 77 33 62
 98 14 61 19 96  3 14 54 15 50 91 88 51 36 71 91 50 95 62 24 15 62 66
 66 96 22  8 40 51 94 54  1  8 67 21  4 70 35 10 37 85  1 78 36 37 49
 80 40 97 42 64 12 56 30 78 52  4 39 44 55 85 51 57 93 18 78 49 41 65
 60 78 51 13 56 39 51 58 19 91 55 13  7 67 22 90 98 74 94 89 71  2 74
 22 59 19 92 89 68 33 54 80 12 57 94 20 49 97 78 20 40 33 34 47 53  8
 89  3 82 84 92  5 38 66 79 97 85 72 38  5 57 44 38 21  2 84 42  3 81
 72 23 21  6  9 20 11 17 10 14 52 46  6  9 84 24 89 33 61 13 71 66 70
 67 56 92 69 40 86 24 21 58  0 94 16 61 15 27 79 77 93 83 23 99 92 59
 75 33 92 36 46 15 55 69 82 11 13  4 52 99 28 73 57 80 68 26 42 35 53


 41 30 55 44 69 67 30 78 14 81 62 21 91 66 21 28 92 69 30 90 43 57 12
 98 35 85 21 49 45 31 40 14 24 70 22 68  0 89 50 81 56 42 44 77 33 62
 98 14 61 19 96  3 14 54 15 50 91 88 51 36 71 91 50 95 62 24 15 62 66
 66 96 22  8 40 51 94 54  1  8 67 21  4 70 35 10 37 85  1 78 36 37 49
 80 40 97 42 64 12 56 30 78 52  4 39 44 55 85 51 57 93 18 78 49 41 65
 60 78 51 13 56 39 51 58 19 91 55 13  7 67 22 90 98 74 94 89 71  2 74
 22 59 19 92 89 68 33 54 80 12 57 94 20 49 97 78 20 40 33 34 47 53  8
 89  3 82 84 92  5 38 66 79 97 85 72 38  5 57 44 38 21  2 84 42  3 81
 72 23 21  6  9 20 11 17 10 14 52 46  6  9 84 24 89 33 61 13 71 66 70
 67 56 92 69 40 86 24 21 58  0 94 16 61 15 27 79 77 93 83 23 99 92 59
 75 33 92 36 46 15 55 69 82 11 13  4 52 99 28 73 57 80 68 26 42 35 53

您已在 cmets 中被告知排序算法将需要嵌套循环。查看您的排序例程并更正逻辑。例程Cocktail (shaker) Sort 的示例可在网络上的许多地方找到。另一个例子是:Cocktail Sort Algorithm or Shaker Sort Algorithm

修复您的排序例程后,如果您仍有问题,请发表评论,我们很乐意提供更多帮助。

【讨论】:

  • 谢谢你,但我现在真的很绝望。我意识到我们只能使用一个外循环和一个内循环。我们也只能使用一个数组。我在解决这个任务时遇到了很大的麻烦。我接受任何建议。
猜你喜欢
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多