Передача\возврат указателя на массив в\из функции - 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];