3

我是一名新手程序员,可能有大约 8-9 周的 C 编程经验。目前我正在创建一个程序,该程序将从文本文件中读取一些行,将它们存储在一个结构中,计算一些东西,然后将数据打印出来。我正在使用 Microsoft Visual 2010 Express

每当我尝试运行该程序时,它都会立即给我一条错误消息:

Lab 7 Part B.exe 中 0x777915de 处的未处理异常:0xC0000005:访问冲突读取位置 0x00460310。

我的问题 - 我能做些什么来追踪这个问题的根源吗?

我不能 100% 确定我是否可以将我的整个代码发布到这里,因为这可能被认为是一个懒惰的人,而不是自己解决问题。由于我也不知道它来自哪里,我也无法发布我的代码的特定块。对不起。

如果我尝试再次运行它,则会出现此错误:

Lab 7 Part B.exe 中 0x777915de 处未处理的异常:0xC0000005:操作成功完成。

然后,每当我尝试多次运行该程序时,它就会停留在那里。这两个错误都要求我“中断”或“继续”。

如果它有任何帮助,第二个错误始终在这行代码处停止。

SetLastError(TL_LastError);

return(ptd);

绿色箭头指向返回。伴随错误的文件称为“tidtable.c”。如果我能够发现任何有助于解决此问题的方法,我会尽快更新。

谢谢。

编辑:所以我发现了 F10 并最终只是通过了代码,并以某种方式发现当黄色箭头指向该getdata行时错误正在出现。然后当我再次按 F10 时,错误开始并停留在那里。我发布了我认为是罪魁祸首的代码块,希望能解决问题。

这是我的主要功能:

void main()
{
    SCARADATA data;

    getdata(&data);
}

这是功能:

void getdata (SCARADATA *data)
{
    int i;

    FILE *file;
    char fName [MAX];

    sprintf (fName, "(exactfilepath)");

    file = fopen(fName, "r");
    if(file==NULL)
    {
        printf("\nInvalid File.");
        system ("pause");
    }
    else
    {
        for (i=0; i<=10; i++)
        {
            fscanf (file, "%s\t%lf\t%lf\t%d", data[i]->stringname, data[i]->x, data[i]->y, data[i]->elbow);  
        }
    }
    fclose (file);
}

这是我用来存储读取数据的结构:

typedef struct
{
    char stringname[40];
    double x, y;
    int elbow;
    double ang1, ang2;
    bool isValid;
} SCARADATA [20];

以及程序正在读取文本文件的示例。这有10行。(点 1 - 点 10)

点 1 -400 400 1

编辑 2:在 fizzer 的帮助下,我们修复了程序。根据他的解释,我将 20 个结构的数组的地址发送到我的getdata函数中,这与 20 的第一个结构的地址相同。我为解决问题所做的for loop工作是在函数调用周围添加一个循环遍历每个结构的地址。

for (i=0; i<10; i++)
{
getdata(&data[i]);
findangles (&data[i]);
printdata (&data[i]);
}

这允许程序将 EACH 结构的地址传递给以下函数,而不是传递整个数组的地址。我收集到的未处理异常错误是由于程序无法将文件中的信息存储到数组中引起的。这导致编译器随后读取垃圾,导致每次打开文件收集数据时都会出错。至少,我认为这就是发生的事情。

感谢您的帮助 fizzer!绝对节省了我几个晚上盯着这段代码的时间。

4

2 回答 2

3

&data[i]->x, &data[i]->y, &data[i]->elbow

scanf需要指针。(data[i]->stringname 已经是指向第一个元素的指针)。

编辑

SCARADATA 应该是什么?20 个结构的整个数组的类型,还是数组中一个元素的类型?我怀疑是后者。这是使您的程序运行的一种方法:

typedef struct
{
    ...
} SCARADATA;  /* not [20] */

/* . instead of -> */
fscanf (file, "%s\t%lf\t%lf\t%d", data[i].stringname, &data[i].x, &data[i].y, &data[i].elbow);  

int main() /* main returns int */
{
    SCARADATA data[20];
    getdata(data);
    return 0;
}

有关数组与指针的详细信息,请参阅comp.lang.c 常见问题解答。

于 2013-03-30T16:14:16.547 回答
-1

首先,请注意 C 在 C++、Java 等意义上没有例外。

这种“访问冲突”似乎在其他一些操作系统中被称为“分段错误”:由于指针使用不当(或数组,在 C 中相同),您正在访问不应该访问的内存.

建议:在调试器中运行这个程序。

于 2013-03-30T07:29:04.750 回答