Передача\возврат указателя на массив в\из функции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Когда захожу в функцию PrintNeravenstvo, то указатель правильный, как только я делаю один заход на строчку( нажимаю ф10 один раз), то указатель меняется, и почему-то указывает на i. Сперва я создаю массив в функции uravnenie_ploskosti, потом его возвращаю в функцию convex_hull, а после передаю этот указатель в функцию PrintNeravenstvo, где у меня и образовался косяк. Вот код:
int* uravnenie_ploskosti(vertex *p1, vertex *p2, vertex *p3)
{
    int i;
    vertex *p;
    int matr[K][K];
    int uravnenie[M];
 
    for (i = 0, p = p1; i < K; i++)
    {
        if (i == 1) p = p2;
        if (i == 2) p = p3;
        matr[i][0] = 1;
        matr[i][1] = p->y;
        matr[i][2] = p->z;
    }
    uravnenie[0] = matr[0][0] * matr[1][1] * matr[2][2] + matr[0][1] * matr[1][2] * matr[2][0] + matr[0][2] * matr[1][0] * matr[2][1] - matr[0][2] * matr[1][1] * matr[2][0] - matr[0][0] * matr[1][2] * matr[2][1] - matr[0][1] * matr[1][0] * matr[2][2];
 
    for (i = 0, p = p1; i < K; i++)
    {
        if (i == 1) p = p2;
        if (i == 2) p = p3;
        matr[i][1] = 1;
        matr[i][0] = p->x;
        matr[i][2] = p->z;
    }
    uravnenie[1] = matr[0][0] * matr[1][1] * matr[2][2] + matr[0][1] * matr[1][2] * matr[2][0] + matr[0][2] * matr[1][0] * matr[2][1] - matr[0][2] * matr[1][1] * matr[2][0] - matr[0][0] * matr[1][2] * matr[2][1] - matr[0][1] * matr[1][0] * matr[2][2];
 
    for (i = 0, p = p1; i < K; i++)
    {
        if (i == 1) p = p2;
        if (i == 2) p = p3;
        matr[i][2] = 1;
        matr[i][0] = p->x;
        matr[i][1] = p->y;
    }
    uravnenie[2] = matr[0][0] * matr[1][1] * matr[2][2] + matr[0][1] * matr[1][2] * matr[2][0] + matr[0][2] * matr[1][0] * matr[2][1] - matr[0][2] * matr[1][1] * matr[2][0] - matr[0][0] * matr[1][2] * matr[2][1] - matr[0][1] * matr[1][0] * matr[2][2];
 
    for (i = 0, p = p1; i < K; i++)
    {
        if (i == 1) p = p2;
        if (i == 2) p = p3;
        matr[i][0] = p->x;
        matr[i][1] = p->y;
        matr[i][2] = p->z;
    }
    uravnenie[3] = -(matr[0][0] * matr[1][1] * matr[2][2] + matr[0][1] * matr[1][2] * matr[2][0] + matr[0][2] * matr[1][0] * matr[2][1] - matr[0][2] * matr[1][1] * matr[2][0] - matr[0][0] * matr[1][2] * matr[2][1] - matr[0][1] * matr[1][0] * matr[2][2]);
    if (uravnenie[0] == 0 && uravnenie[1] == 0 && uravnenie[2] == 0)
    {
        printf("Вершины %c,%c,%c лежат на одной прямой\n", p1->name, p2->name, p3->name);
        return NULL;
    }
    printf("Уравнение плоскости по точкам %c,%c,%C : %d*x+%d*y+%d*z+%d = 0\n", p1->name, p2->name, p3->name, uravnenie[0], uravnenie[1], uravnenie[2], uravnenie[3]);
    return uravnenie;
}
 
void PrintNeravenstvo (int *a)
{
    int i = 0;
    for (i = 0; i < M; i++)
    {
        if (i == 0 && *(a + i) != 0)
        {
            printf("%d*x", *(a + i));
            continue;
        }
 
        if (i == 1 && *(a + i) > 0) printf("+%d*y", *(a + i));
        if (i == 1 && *(a + i) < 0) printf("%d*y", *(a + i));
        if (i == 2 && *(a + i) > 0) printf("+%d*z", *(a + i));
        if (i == 2 && *(a + i) < 0) printf("%d*z", *(a+ i));
        if (i == 3) printf("<=%d", *(a + i));
    }
    printf("\n");
}
 
void convex_hull( char *f)
{
    FILE *file;
    int n, i, j, k, x, y, z, boolean;
    int *p;
    vertex *p1, *p2, *p3;
    file = fopen(f, "r");
 
    if (file == NULL)
    {
        printf("Не удается открыть файл vertex.txt");
        return;
    }
 
    n = getc(file) - 48;
 
    for (i = 0; i < n; i++)
    {
        fscanf(file, "%d%d%d", &x, &y, &z);
        push(x, y, z, 65 + i);
    }
 
    fclose(file);
 
    for (p1 = First; p1->next->next!=NULL; p1=p1->next)
        for (p2 = p1 -> next; p2->next != NULL; p2 = p2->next)
            for (p3 = p2->next; p3 != NULL; p3 = p3->next)
            {
                p = uravnenie_ploskosti(p1, p2, p3);
                if (p == NULL) continue;
                if (n == 4)
                {
                    PrintNeravenstvo(p);
                }
            }
}

Решение задачи: «Передача\возврат указателя на массив в\из функции»

textual
Листинг программы
static int uravnenie[M];

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.286 из 5
Похожие ответы