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

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

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

Когда захожу в функцию PrintNeravenstvo, то указатель правильный, как только я делаю один заход на строчку( нажимаю ф10 один раз), то указатель меняется, и почему-то указывает на i. Сперва я создаю массив в функции uravnenie_ploskosti, потом его возвращаю в функцию convex_hull, а после передаю этот указатель в функцию PrintNeravenstvo, где у меня и образовался косяк. Вот код:
Листинг программы
  1. int* uravnenie_ploskosti(vertex *p1, vertex *p2, vertex *p3)
  2. {
  3. int i;
  4. vertex *p;
  5. int matr[K][K];
  6. int uravnenie[M];
  7. for (i = 0, p = p1; i < K; i++)
  8. {
  9. if (i == 1) p = p2;
  10. if (i == 2) p = p3;
  11. matr[i][0] = 1;
  12. matr[i][1] = p->y;
  13. matr[i][2] = p->z;
  14. }
  15. 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];
  16. for (i = 0, p = p1; i < K; i++)
  17. {
  18. if (i == 1) p = p2;
  19. if (i == 2) p = p3;
  20. matr[i][1] = 1;
  21. matr[i][0] = p->x;
  22. matr[i][2] = p->z;
  23. }
  24. 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];
  25. for (i = 0, p = p1; i < K; i++)
  26. {
  27. if (i == 1) p = p2;
  28. if (i == 2) p = p3;
  29. matr[i][2] = 1;
  30. matr[i][0] = p->x;
  31. matr[i][1] = p->y;
  32. }
  33. 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];
  34. for (i = 0, p = p1; i < K; i++)
  35. {
  36. if (i == 1) p = p2;
  37. if (i == 2) p = p3;
  38. matr[i][0] = p->x;
  39. matr[i][1] = p->y;
  40. matr[i][2] = p->z;
  41. }
  42. 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]);
  43. if (uravnenie[0] == 0 && uravnenie[1] == 0 && uravnenie[2] == 0)
  44. {
  45. printf("Вершины %c,%c,%c лежат на одной прямой\n", p1->name, p2->name, p3->name);
  46. return NULL;
  47. }
  48. 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]);
  49. return uravnenie;
  50. }
  51. void PrintNeravenstvo (int *a)
  52. {
  53. int i = 0;
  54. for (i = 0; i < M; i++)
  55. {
  56. if (i == 0 && *(a + i) != 0)
  57. {
  58. printf("%d*x", *(a + i));
  59. continue;
  60. }
  61. if (i == 1 && *(a + i) > 0) printf("+%d*y", *(a + i));
  62. if (i == 1 && *(a + i) < 0) printf("%d*y", *(a + i));
  63. if (i == 2 && *(a + i) > 0) printf("+%d*z", *(a + i));
  64. if (i == 2 && *(a + i) < 0) printf("%d*z", *(a+ i));
  65. if (i == 3) printf("<=%d", *(a + i));
  66. }
  67. printf("\n");
  68. }
  69. void convex_hull( char *f)
  70. {
  71. FILE *file;
  72. int n, i, j, k, x, y, z, boolean;
  73. int *p;
  74. vertex *p1, *p2, *p3;
  75. file = fopen(f, "r");
  76. if (file == NULL)
  77. {
  78. printf("Не удается открыть файл vertex.txt");
  79. return;
  80. }
  81. n = getc(file) - 48;
  82. for (i = 0; i < n; i++)
  83. {
  84. fscanf(file, "%d%d%d", &x, &y, &z);
  85. push(x, y, z, 65 + i);
  86. }
  87. fclose(file);
  88. for (p1 = First; p1->next->next!=NULL; p1=p1->next)
  89. for (p2 = p1 -> next; p2->next != NULL; p2 = p2->next)
  90. for (p3 = p2->next; p3 != NULL; p3 = p3->next)
  91. {
  92. p = uravnenie_ploskosti(p1, p2, p3);
  93. if (p == NULL) continue;
  94. if (n == 4)
  95. {
  96. PrintNeravenstvo(p);
  97. }
  98. }
  99. }

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

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

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


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

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

14   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы