13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
1

Realloc внутри функции

22.03.2015, 22:13. Показов 2134. Ответов 2
Метки нет (Все метки)

Проблема заключается в следующем:
Когда я первый раз попадаю в функцию addItem и делаю в ней realloc указателя на структуру, а потом еще присваиваю значения, то после выхода из функции я вижу эти значения.
Когда я второй раз попадаю в функцию, проделываю эти же действия, то после этого у меня отображаются значения после первого раза, а от второго раза остаются только 0.
По задумке, после каждой итерации у меня должен пополняться элементами массив за счет realloс, но почему-то не работает.

realloc происходит в методе EnterData.
Если кто-нибудь захочет скомпилировать программу и посмотреть на результаты, то нужно вбить 0, а потом какие-то данные.
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#pragma hdrstop
#pragma argsused
 
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#include <tchar.h>
#else
  typedef char _TCHAR;
  #define _tmain main
#endif
 
#define SIZE 10
struct Item{
     int key;
     int release;
     char *info;
    };
 
void addItem(struct Item *,int*);
void deleteItem(struct Item *,int*);
void searchItem(struct Item *,int);
int enterData(int*,int*,char*,struct Item*,int);
int CheckKey(int ,struct Item *,int);
int CheckRelease(int ,int ,struct Item *,int);
int _tmain(int argc, _TCHAR* argv[])
{
    struct Item *table;
    int ctrl,n=0,i;
    void (*P[4])(struct Item *,int*)={addItem,deleteItem,searchItem};
    table=malloc(sizeof(struct Item));
    for (;;)
    {
        puts("0 add\n1 delete \n2 search \n");
        scanf("%d",&ctrl);
        if (ctrl>5) 
        {
            break;  
        }
        (*P[ctrl])(table,&n);
        for (i=0; i<=n-1; i++) {
            printf("%d\n",table[i].key);
        }
    }
    return 0;
}
void addItem(struct Item *table,int *n)
{
int key,release;
char *info=malloc(sizeof(char)*50);
 if (*n==SIZE)
 {
    puts("Table is full. can not continue \n");
    return;
 }
 if(enterData(&key,&release,info,table,*n))
 {
    (*n)++;
    table=realloc(table,sizeof(struct Item)*(*n));
    table[*n-1].key=key;
    table[*n-1].release=release;
    table[*n-1].info=info;
 }
}
 
int enterData(int *key,int *release, char *info,struct Item *table,int n)
{
int a;
puts("Enter key: ");
scanf("%d",key);
if (CheckKey(*key,table,n)==2) {
    puts("This item already exists. The number of releases exhausted");
    return 0;
}
if (CheckKey(*key,table,n)==1) {
    puts("This item already exists. You can add 1 realese");
}
puts("\n Enter release: ");
do
    {
    scanf("%d",release);
    }
while (CheckRelease(*key,*release ,table,n)==0);
puts("\n Enter info(50 chars): \n");
fflush(stdin);
gets(info);
return 1;
}
 
int CheckKey(int key,struct Item *table,int n)
{
 
int i,cnt=0;
if (n==0) {
    return 0;   
}
for (i = 0; i <= n-1; i++) {
    if(table[i].key==key)
        {
            cnt++;
        }
}
return cnt;
}
int CheckRelease(int key,int release ,struct Item *table,int n)
{
int i;
if (n==0) {
    return 1;   
}
for (i = 0; i <= n-1; i++)
    {
    if(table[i].key==key)
        {
            if (table[i].release==release) 
            {
              puts("Thies element have this release. Enter another release.");
              return 0; 
            }
            return 1;
        }
    }
}
 
void deleteItem(struct Item *table,int *key)
{
 
}
 
 
void searchItem(struct Item *table,int key)
{
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2015, 22:13
Ответы с готовыми решениями:

Realloc в функции
Есть функция void read_line(char *adress) { char temp = '1'; unsigned long long int...

Выделение памяти с помощью функции realloc
в общем задачка по сути своей вроде бы легкая, должна укладываться в 60 строчек, но что-то допереть...

Почему так себя ведёт программа? Функции: malloc(), realloc(), free()
Почему большинство значений в output 0 и несколько из значений не равно 0? /* *...

Динамическое выделение для массива структур. Программа вылетает без ошибок на использовании функции realloc
Здесь код: ссылка В массив структур нужно записать новый элемент, выделить для него память....

2
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
23.03.2015, 00:28 2
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Когда я первый раз попадаю в функцию addItem и делаю в ней realloc указателя на структуру, а потом еще присваиваю значения, то после выхода из функции я вижу эти значения.
Когда я второй раз попадаю в функцию, проделываю эти же действия, то после этого у меня отображаются значения после первого раза, а от второго раза остаются только 0.
Ваше желание описать проблему конечно хорошее, но из того что Вы описали не понятно вообще ничего. Т.е. не понятно в чем заключается Ваша прблема. Постарайтесь еще раз описать проблему понятно и доступно.

Не по теме:

Говнокод конечно ужасный, но ничего., все через это проходили.


массив из 4 (магическое число!) элементов инициализируется тремя.
void (*P[4])(struct Item *,int*)={addItem,deleteItem,searchItem};
0
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
23.03.2015, 23:44  [ТС] 3
castorsky, Проблема была в том, что если внутри функции происходит realloc, то он не затрагивает указатель в main.
Немного погуглив, я понял, что при перераспределении памяти указатель указывает на другую область памяти и как следствие не возвращается в main.
Я решил эту проблему сделав возвращаемый тип не void, а указатель на структуру, с последующим присваиванием.

Цитата Сообщение от castorsky Посмотреть сообщение
Говнокод конечно ужасный, но ничего., все через это проходили.
Приведи пример убогости в моем коде, я попробую поправить.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2015, 23:44
Помогаю со студенческими работами здесь

функции на основе realloc, malloc
Подскажите как сократить написание &quot;realloc&quot;, а то надоели эти писанины))) вот сделал уже...

В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Язык программирования C поддерживает функции динамического управления пямятью: calloc, malloc,...

Вызов функции внутри другой функции с передачей локальной переменной по ссылке
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using...

Динамическое выделение памяти внутри функции (что вернуть из функции, если не удалось выделить память?)
такое дело, есть функция, которая выполняет некоторую операцию, функция при успешном выполнении...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru