С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 20
1

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

22.03.2017, 14:44. Показов 1242. Ответов 2

Author24 — интернет-сервис помощи студентам
Когда захожу в функцию PrintNeravenstvo, то указатель правильный, как только я делаю один заход на строчку( нажимаю ф10 один раз), то указатель меняется, и почему-то указывает на i. Сперва я создаю массив в функции uravnenie_ploskosti, потом его возвращаю в функцию convex_hull, а после передаю этот указатель в функцию PrintNeravenstvo, где у меня и образовался косяк. Вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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);
                }
            }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2017, 14:44
Ответы с готовыми решениями:

Возврат указателя на массив структур из функции?
Добрый день! Функция enter в момент вызова принимает массив структур monitor. Запускает функцию...

Передача указателя в функцию, присвоение адреса переменной и возврат
Добрый день, подскажите, почему в отладке в функции указателю адрес переменной присваивается...

Возврат указателя из функции
Почему функция vvod не возвращает указатель? #include&quot;stdafx.h&quot; #include &quot;conio.h&quot;...

Возврат указателя на локальный массив
Например ример: static unsigned char * func(...) { unsigned char d; memset(d, 'A',...

2
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
22.03.2017, 16:04 2
Нельзя возвращать указатель на локальную переменную (функция uravnenie_ploskosti).

Добавлено через 1 минуту
Как вариант, можно массив сделать статическим:
C
1
static int uravnenie[M];
2
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 20
22.03.2017, 16:12  [ТС] 3
Спасибо. Помогло. Буду знать теперь))
0
22.03.2017, 16:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2017, 16:12
Помогаю со студенческими работами здесь

Возврат указателя на массив из функции
Здравствуйте. Пытаюсь вернуть указатель на массив из функции. #include &lt;iostream&gt; using...

Возврат указателя на массив из функции
День добрый, коллеги по цеху. Не откажите в нужде java программисту в познаниях нативного кода....

JNI, передача и возврат указателя
Все здрасьте. Использую JNI, хочу передавать между java и с++ указатель. Какой java-тип...

Передача и возврат указателя из массива
Доброго времени суток. проблема с указателями как я догадываюсь. функция im исправно работает...

Передача указателя на массив в качестве параметра функции в QML
Доброго времени суток. Имеется следующая система - в Qml приложении есть два элемента: Text{} и...

ASM (Возврат указателя из функции)
1)Предисловие Функция, написанная на языке Ассемблера вызывается из кода, написанного на С. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru