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