ошибка деления в C - PullRequest
0 голосов
/ 15 мая 2011

У меня есть графическая программа, в которой есть некоторые вычисления. он не дает никаких ошибок, но после запуска программы он дает ошибку деления 6/4. Кто-нибудь может мне помочь с этим?

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<stdlib.h>
struct face
{
    int **vertices;
};

void main()
{
    int gd = DETECT,gm;
    int  x, y, z, i, j, k, m, n;
    struct face *f_3d, *f;
    FILE *fp;
    char c;

    initgraph(&gd, &gm, "d:/tc/bgi");
    fp=fopen("cube.txt", "r");
    clrscr();

    if(fp == NULL)
    {
        printf("\nFile doesn't exist");
        exit(0);
    }

    fscanf(fp, "%d", &m);
    fseek(fp, 1, SEEK_CUR);    //no of faces
    fscanf(fp, "%d", &n);      //no of vertices for each face
    printf("\n%d  %d", m, n);

    f = (struct face *) malloc(sizeof(m*sizeof(struct face)));
    f_3d = (struct face *) malloc(sizeof(m*sizeof(struct face)));

    for(i = 0; i < m; i++)
    {
        f[i].vertices = (int **) malloc(n*sizeof(int));
        f_3d[i].vertices = (int **) malloc(n*sizeof(int));
    }

    for(i = 0; i < m; i++)
    for(j = 0; j < n; j++)
    {
        f[i].vertices[j] = (int *) malloc(2*sizeof(int));
        f_3d[i].vertices[j] = (int *) malloc(3*sizeof(int));
    } 

    for(i = 0; i < m; i++)   //for every face
    for(j = 0;j < n; j++)    // for every vertex in the face
    {
        fscanf(fp, "%d", &f_3d[i].vertices[j][0]);    //read x coord
        fseek(fp, 1, SEEK_CUR);                       //to skip comma
        fscanf(fp, "%d", &f_3d[i].vertices[j][1]);    //read y coord
        fseek(fp, 1, SEEK_CUR);
        fscanf(fp, "%d" ,&f_3d[i].vertices[j][2]);    //read y coord
        fseek(fp, 1, SEEK_CUR);
    }

    for(i = 0; i < m; i++)
    for(j = 0; j < n; j++)
    {
        x=f_3d[i].vertices[j][0];
        y=f_3d[i].vertices[j][1];
        z=f_3d[i].vertices[j][2];
        f[i].vertices[j][0]=(int)x/z;
        f[i].vertices[j][1]=(int)y/z;
    }

    for(i = 0; i < 6; i++)
    {
        for(j = 0; j < 3; j++)
            line(f[i].vertices[j][0], f[i].vertices[j][1], f[i].vertices[j+1][0], f[i].vertices[j+1][1]);

        line(f[i].vertices[j][0], f[i].vertices[j][1], f[i].vertices[0][0], f[i].vertices[0][1]);
    }

    getch();
}

РЕДАКТИРОВАТЬ: Добавлена ​​дополнительная информация из комментариев:

Все значения массива, присвоенные x и y, являются целочисленными значениями. Таким образом, окончательное назначенное значение также должно быть только целым числом. Итак, я хотел знать причину ошибки деления.

cube.txt содержит вершины вида 400,200,2, 300,400,2 и т. Д. Я запускаю эту программу в Turbo C. Я делаю 400/2 и 200/2 (где x=400, y=200 и z=2) и присвоение его f[i].vertices[j][0]=x/z и f[i].vertices[j][1]=y/z?. Там нет ошибки как таковой. Но когда программа запускается, вывод не виден. Я ожидаю увидеть вывод массива f[i].Vertices.

Ответы [ 2 ]

1 голос
/ 25 февраля 2014

Ошибка "divide error" возникает, когда некоторое деление выполняется с помощью 0 'zero'. Попробуйте определить место, где произошло такое разделение, и измените эту часть.

1 голос
/ 15 мая 2011

Я предполагаю, что проблема здесь:

for(i=0; i<m; i++)
    for(j=0; j<n; j++)
    {
        x=f_3d[i].vertices[j][0];
        y=f_3d[i].vertices[j][1];
        z=f_3d[i].vertices[j][2];
        f[i].vertices[j][0]=(int)x/z;
        f[i].vertices[j][1]=(int)y/z;
    }

Возможно, в какой-то момент у вас z = 0.Попробуйте добавить код отладки:

for(i=0; i<m; i++)
    for(j=0; j<n; j++)
    {
        x=f_3d[i].vertices[j][0];
        y=f_3d[i].vertices[j][1];
        z=f_3d[i].vertices[j][2];
        if (z == 0)
        {
            printf("ERROR: i = %d, j = %d, x = %d, y = %d, z = %d\n", i, j, x, y, z);
            exit(1);
        }
        f[i].vertices[j][0]=(int)x/z;
        f[i].vertices[j][1]=(int)y/z;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...