Передача\возврат указателя на массив в\из функции - 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];
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д