Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
#1

Проверка существования структуры - C++

17.12.2011, 21:32. Просмотров 3157. Ответов 46
Метки нет (Все метки)

Гугл ничего не дал так, что думаю будет многим полезно.

Язык си,

как проверить существует ли структура по данному адресу (была ли она задана)?

В других языках есть try/catche на си вроде нет, только на си++.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2011, 21:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка существования структуры (C++):

Проверка существования логина - C++
Помогите пожалуйста, нужно сделать проверку на логин, т.е. если при регистрации нового аккаунта с уже существующим логином, выводило, что...

Проверка существования файла - C++
Всем привет! Как можно реализовать проверку существования файла (если файл не существует, то при чтении выдается ошибка, при а при записи...

Проверка существования файла - C++
Надо сбросить массив char в файл. Если файл уже существует - ждать, пока его не удалят. Вот этот код не компилируется, выдаёт error C2664:...

Проверка на существования файла - C++
Можно ли проверять файл на существование таким образом: ifstream file("file.txt"); if (file.is_open()) {} //Если файл...

Проверка условия существования треугольника - C++
нужно написать программу Даны 3 числа, определить могут ли эти числа являться сторонами треугольника

проверка существования файла с использованием ifstream() - C++
гуглил, но ничего там так и не нашел. Собственно как?

46
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 23:29  [ТС] #31
Разве ошибочным будет утверждение, что для добавления ветки к дереву необходимо чтобы корень в массиве указателей на эти ветки имел везде NULL на первом проходе?

Добавлено через 1 минуту
Иначе как в дальнейшем определять существует ветка или нет, потому что мусор будет расцениваться как существующая ветка.

Добавлено через 12 секунд
А при проверке вызывать ошибку.
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 23:31 #32
awpe, нулевыми указателями должны обладать только листья дерева.
0
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 23:55  [ТС] #33
Проверка существования структуры на картинке есть узел 021 допустим он получился когда я первый раз вызвал функцию setDecoration, корень был пуст, были созданы узлы 0,02,021 теперь я хочу в это дерево записать узел в 012 функция при выделении памяти для узла 0 затрет значение адреса для узла 021, если этого не делать то к узлу 0211 доступа не будет так как память под конечную структуру никто не выделял и при попытке туда обратится будет access violation. Ничего кроме как проверки на существование узла я не могу придумать.

Подскажите пожалуйста, я не так задачу понял или что то упускаю?
0
alkagolik
Заблокирован
18.12.2011, 00:21 #34
Цитата Сообщение от awpe Посмотреть сообщение
Подскажите пожалуйста, я не так задачу понял или что то упускаю?
упускаете. Значит мыслим так.
Цитата Сообщение от awpe Посмотреть сообщение
на картинке есть узел 021 допустим он получился когда я первый раз вызвал функцию setDecoration, корень был пуст, были созданы узлы 0,02,021
это неверное. Когда вы вызываете функцию вставки, то, добавляете по одной ветке. и только в том случае когда указатель == NULL. Для этого вам нужно зделать обход дерева. т.е. двигаться по нужным потомкам пока указатель на потомка != NULL. Вот небольшой пример
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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
typedef struct tree
{
    int x;
    struct tree *left;
    struct tree *right;
} tree_t;
 
void add( tree_t **current, int value, char *path )
{
    tree_t *t = ( tree_t* ) malloc ( sizeof ( tree_t ) );
    t->x = value;
    t->left = NULL;
    t->right = NULL;
 
    if ( !( *current ) ) // если создаем корень, т.е. если дерево пусто
    {
        *current = t;
    }
    else{
        //обход дерева
        while ( *path )
        {
            if ( *path - '0' )
                *current = *current->left;
            else
                *current = *current->right;
            ++path;
        }
        *current = t;
    }
}
 
int main(void)
{
    tree_t *root = NULL;
    add(&root, 5, "");
    printf("%i %i %i", root->x, root->right, root->left );
    free( root );
    exit(0);
}
Добавлено через 6 минут
вот косой пример двоичного дерева. функция вставки

Добавлено через 11 минут
обход дерева надо переделать, так же кинуть исключение. Думаю что суть вы уловили.
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.12.2011, 00:45 #35
awpe, Вы не совсем понимаете как строятся деревья. На википедии есть неплохие статьи по двоичным деревьям. Вот пример дерева поиска с функцией вставки и обхода, реализованных посредством рекурсии:
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
#include <stdlib.h>
#include <stdio.h>
 
typedef struct tree {
    int data;
    struct tree* left;
    struct tree* right;
} tree_t;
 
tree_t* create(int data) {
  tree_t* result = (tree_t*)malloc(sizeof(tree_t));
 
  result->data = data;
  result->left = NULL;
  result->right = NULL;
 
  return result;
}
 
void destroy(tree_t* tree) {
  if (tree == NULL)
    return;
 
  destroy(tree->left);
  destroy(tree->right);
  free(tree);
}
 
tree_t* insert(tree_t* tree, int data) {
  if (tree == NULL)
    return create(data);
 
  if (tree->data < data)
    tree->left = insert(tree->left, data);
  else if (tree->data > data)
    tree->right = insert(tree->right, data);
  
  return tree;
}
 
void traverse(tree_t* tree, void (*function)(int)) {
  if (tree == NULL)
    return;
 
  traverse(tree->left, function);
  function(tree->data);
  traverse(tree->right, function);
}
 
void print(int number) {
  printf("%d\n", number);
}
 
int main() {
  tree_t* tree = create(5);
 
  insert(tree, 4);
  insert(tree, 6);
  insert(tree, 3);
  insert(tree, 7);
  insert(tree, 2);
  insert(tree, 8);
  insert(tree, 1);
  insert(tree, 9);
  insert(tree, 0);
  insert(tree, 10);
 
  traverse(tree, print);
 
  destroy(tree);
 
  return 0;
}
Результат: http://liveworkspace.org/code/7cb333f3d897098366ac11831d1145a9
1
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
18.12.2011, 13:03  [ТС] #36
вроде так должно работать согласно заданию
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_BRANCHES             3
#define DECORATION_NONE          0
#define DECORATION_CANDLE        1
#define DECORATION_SPARKLER      2
 
typedef struct TNode{
        struct TNode   * m_Parent;
        struct TNode   * m_Branches[MAX_BRANCHES];
        int              m_Decoration;
} TNODE;
 
void InitializeNewStruct(TNODE ** st)
{
     printf("%p\n",(*st));
                               int i;
                               *st=(TNODE *) malloc(sizeof(TNODE *));
                               (*(*st)).m_Decoration=-1;
                               (*(*st)).m_Parent=NULL;
                               for(i=0;i<MAX_BRANCHES;i++){
                                     (*(*st)).m_Branches[i]=NULL;
                               }
                               printf("%p\n",(*st));
}
 
int  setDecoration   ( TNODE ** root, char * path, int decor )
{
     TNODE *tmp;
     int i,j,l,q=0;
     char *str;
     if((*root)==NULL){
                               (*root)=(TNODE *) malloc(sizeof(TNODE *));
                               (*((*root))).m_Decoration=-1;
                               (*((*root))).m_Parent=NULL;
                               for(i=0;i<MAX_BRANCHES;i++){
                                     (*((*root))).m_Branches[i]=NULL;
                               }
     }
     
     l=((int)path[0])-48;
     printf("%d\n",l);
    if((*((*root))).m_Branches[l]==NULL){
                     tmp=(TNODE *) malloc(sizeof(TNODE *));
                     (*(tmp)).m_Decoration=-1;
                     for(i=0;i<MAX_BRANCHES;i++){
                                                 (*(tmp)).m_Branches[i]=NULL;
                     }
                     (*tmp).m_Parent=(*root);
                     (*(*root)).m_Branches[l]=tmp;
     }else{
           tmp=(*((*root))).m_Branches[l];
           }
     q=strlen(path);
     printf("v stroke %s - %d simvolov\n",path, q);
     str=(char *) malloc(q*sizeof(char*));
     printf("1\n");
     for(i=1;i<=q;i++){
                      str[i-1]=path[i];
           printf("prohod %d, str[%d]=path[%d]; %c=%c\n",i , i-1, i, str[i-1], path[i]);
           
     }
     printf("   =>%s\n",str);
     printf("suka\n");
     printf("4\n");
     if(path[0]=='\0'){
            printf("zzsuka 1\n");
            (*(tmp)).m_Decoration=decor;
            return 1;
     }
     printf("suka\n");
     return setDecoration( &tmp, str, decor );
}
 
int main ( int argc, char * argv [] ){
    int x;
    TNODE *n;
    n=NULL;
    //n=(TNODE *) malloc(5*sizeof(int *));
    
    //printf("%d",(*n).m_Parent);
    
    x = setDecoration ( &n, (char*) "012001", DECORATION_SPARKLER );
    system("PAUSE");
    return (0);
}


не понимаю в чем ошибка, если убрать работу со строками то ошибок нет, если убрать создание структур то тоже ошибок нет, вместе они не работают...

Добавлено через 19 секунд
Я про функцию setDecoration

Добавлено через 30 минут
ага понял, нельзя так присваивать значение для path[n], ладно буду передавать str, но там снова ошибка, программа вылетает причем каждый раз на новом месте...

Добавлено через 45 секунд
Заметил что место вылета зависит от того где стоят контрольные printf... В чем может быть проблема?

Сейчас вылетает на str=(char *) malloc(q*sizeof(char*));

Добавлено через 9 минут
Пожалуйста скажите где ошибка?
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.12.2011, 13:21 #37
awpe, пройдитесь с дебаггером по программе и все станет ясно. Не поможет - дайте задание, лучше переписать с нуля, чем пытатся разобратся.
0
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
18.12.2011, 13:35  [ТС] #38
задание

новый код
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_BRANCHES             3
#define DECORATION_NONE          0
#define DECORATION_CANDLE        1
#define DECORATION_SPARKLER      2
 
typedef struct TNode{
        struct TNode   * m_Parent;
        struct TNode   * m_Branches[MAX_BRANCHES];
        int              m_Decoration;
} TNODE;
 
void InitializeNewStruct(TNODE ** st)
{
     printf("%p\n",(*st));
                               int i;
                               *st=(TNODE *) malloc(sizeof(TNODE *));
                               (*(*st)).m_Decoration=-1;
                               (*(*st)).m_Parent=NULL;
                               for(i=0;i<MAX_BRANCHES;i++){
                                     (*(*st)).m_Branches[i]=NULL;
                               }
                               printf("%p\n",(*st));
}
 
 
 
 
int CreateTree( TNODE ** root, char * str, int decor ){
     TNODE *tmp;
     int i,j,k,l,q;
     
     if( ( 2 < (((int)str[0])-48) ) ||  ( 0 > (((int)str[0])-48) ) ){return 0;}
     printf("%s\n",str);
     l=((int)str[0])-48;
     printf("%d\n",l);
    
     if((*((*root))).m_Branches[l]==NULL){
        printf("sozdanie uzla\n",l);
        tmp=(TNODE *) malloc(sizeof(TNODE *));
        printf("vydelenie pameti\n",l);
        (*(tmp)).m_Decoration=-1;
        for(i=0;i<MAX_BRANCHES;i++){
            (*(tmp)).m_Branches[i]=NULL;
        }
        (*tmp).m_Parent=(*root);
        (*(*root)).m_Branches[l]=tmp;
     }else{
         printf("uzel uze est\n",l);
         tmp=(*((*root))).m_Branches[l];
     }
     
     q=(int)(strlen(str));
     printf("v stroke %s - %d simvolov\n",str, q);
     
     
     printf("1\n");
     
     for(i=0;str[i+1]!='\0';i++){
        str[i]=str[i+1];
        printf("prohod %d, str[%d]=str[%d]; %c=%c\n",i , i+1, i, str[i], str[i+1]);
     }
     str[i]='\0';
     
     printf("   =>%s\n",str);
     printf("4\n");
     
     if(str[0]=='\0'){
          printf("zzsuka 1\n");
          (*(tmp)).m_Decoration=decor;
          return 1;
     }
     
     
     printf("suka\n");
     
     
     return CreateTree( &tmp, str, decor );
    }
 
 
 
 
 
 
int  setDecoration   ( TNODE ** root, char * path, int decor )
{
     TNODE *tmp;
     int i,q,x;
     char *str;
     
     q=strlen(path)*sizeof(char*);
     printf("%d\n",q);
     
     str = (char*) malloc(q);
     
     strcpy(str, path);
     printf("%s\n",str);
     
     
     if((*root)==NULL){
                               (*root)=(TNODE *) malloc(sizeof(TNODE *));
                               (*((*root))).m_Decoration=-1;
                               (*((*root))).m_Parent=NULL;
                               for(i=0;i<MAX_BRANCHES;i++){
                                     (*((*root))).m_Branches[i]=NULL;
                               }
     }
     x= CreateTree(root, str, decor);
     free(str);
     return x;
}
 
int main ( int argc, char * argv [] ){
    int x;
    TNODE *n;
    n=NULL;
    x = setDecoration ( &n, (char*) "012001", DECORATION_SPARKLER );
    system("PAUSE");
    return (0);
}


Добавлено через 50 секунд
Решил проблему со строками, теперь при вызове tmp=(TNODE *) malloc(sizeof(TNODE *)); программа рушится, дебаггер в dev c++ какой -то странный, нет времени разбираться.
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
18.12.2011, 13:43 #39
Цитата Сообщение от awpe Посмотреть сообщение
TNODE *tmp;
вам нужен объект структуры, а память вы выделяете под указатель

C
1
tmp=(TNODE *) malloc(sizeof(TNODE));
0
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
18.12.2011, 13:55  [ТС] #40
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
int  setDecoration   ( TNODE ** root, char * path, int decor )
{
     int i,q,x;
     char *str;
     
     q=strlen(path)*sizeof(char*);
     printf("%d\n",q);
     
     str = (char*) malloc(q);
     
     strcpy(str, path);
     printf("%s\n",str);
     
     
     if((*root)==NULL){
                               (*root)=(TNODE *) malloc(sizeof(TNODE *));
                               (*((*root))).m_Decoration=-1;
                               (*((*root))).m_Parent=NULL;
                               for(i=0;i<MAX_BRANCHES;i++){
                                     (*((*root))).m_Branches[i]=NULL;
                               }
     }
     x= CreateTree(root, str, decor);
     free(str);
     return x;
}
 
int main ( int argc, char * argv [] ){
    int x;
    TNODE *n;
    n=NULL;
    x = setDecoration ( &n, (char*) "012001", DECORATION_SPARKLER );
    system("PAUSE");
    return (0);
}
А здесь разве не то же самое - (*root)=(TNODE *) malloc(sizeof(TNODE *)); где в функцию был передан адрес на указатель поэтому (*root) даст указатель на объект?

аналогично здесь - int CreateTree( TNODE ** root, char * str, int decor ): TNODE *tmp; создаст указатель на объект типа TNODE

потом (TNODE *) malloc(sizeof(TNODE *)) вернет указатель на область памяти для объекта типа TNODE этот указатель я приравниваю к tmp: "tmp=(TNODE *) malloc(sizeof(TNODE *));"

Я где то запутался в указателях?

Добавлено через 34 секунды
Как правильно тогда?
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
18.12.2011, 14:00 #41
Цитата Сообщение от awpe Посмотреть сообщение
потом (TNODE *) malloc(sizeof(TNODE *)) вернет указатель на область памяти для объекта типа TNODE
malloc возвращает указатель на то, под что выделили память
здесь, вы выделяете память под указатель
Цитата Сообщение от awpe Посмотреть сообщение
malloc(sizeof(TNODE *)
соответственно malloc вернет указатель на указатель (TNODE **) и это вы пытаетесь
присвоить указателю tmp (TNODE *)
Цитата Сообщение от awpe Посмотреть сообщение
Как правильно тогда?
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
C
1
tmp=(TNODE *) malloc(sizeof(TNODE));
1
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
18.12.2011, 18:08  [ТС] #42
Извините за невнимательность
C
1
tmp=(TNODE *) malloc(sizeof(TNODE));
и

C
1
tmp=(TNODE *) malloc(sizeof(TNODE*));
отличаются ))

Добавлено через 3 часа 32 минуты
Приехали... Дописал последнюю функцию теперь не работает первая... Если кому не лень посмотрите пожалуйста отладчиком, где там ошибка.
код
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_BRANCHES             3
#define DECORATION_NONE          0
#define DECORATION_CANDLE        1
#define DECORATION_SPARKLER      2
 
typedef struct TNode{
        struct TNode   * m_Parent;
        struct TNode   * m_Branches[MAX_BRANCHES];
        int              m_Decoration;
} TNODE;
 
int CreateTree( TNODE ** root, char * str, int decor ){
     //printf("\n\nprohod rekursivnoj funkcii\n\n");
     TNODE *tmp;
     int i,l,q;
     if( ( 2 < (((int)str[0])-48) ) ||  ( 0 > (((int)str[0])-48) ) ){return 0;}
     //printf("vhodnaja stroka => '%s'\n",str);
     l=((int)str[0])-48;
     //printf("pervoe cislo => '%d'\n",l);
     if((*((*root))).m_Branches[l]==NULL){
        //printf("sozdanie uzla\n",l);
        tmp=(TNODE *) malloc(sizeof(TNODE));
        
        //printf("vydelenie pameti\n",l);
        //printf("vydelena pamet po adresu %p\n", tmp);
        (*(tmp)).m_Decoration=-1;
        for(i=0;i<MAX_BRANCHES;i++){
            (*(tmp)).m_Branches[i]=NULL;
        }
        (*tmp).m_Parent=(*root);
        (*(*root)).m_Branches[l]=tmp;
     }else{
         //printf("uzel uze est\n",l);
         tmp=(*((*root))).m_Branches[l];
     }
     q=(int)(strlen(str));
     //printf("v stroke %s - %d simvolov\n",str, q);
     //printf("1\n");
     for(i=0;str[i+1]!='\0';i++){
        str[i]=str[i+1];
        //printf("prohod %d, str[%d]=str[%d]; %c=%c\n",i , i+1, i, str[i], str[i+1]);
     }
     str[i]='\0';
     //printf("vyodnaja stroka  => '%s'\n",str);
     if(str[0]=='\0'){
          //printf("dobavlenie znachenija %d\n", decor);
          (*(tmp)).m_Decoration=decor;
          return 1;
     }
     return CreateTree( &tmp, str, decor );
}
int  setDecoration   ( TNODE ** root, char * path, int decor )
{
     //printf("\n\n\n");
     int i,q,x=0,w,e;
     char *str;
     
 
          if(path==""){
                 
                 (*((*root))).m_Decoration=decor;
                 
                 }
     
     
     for(i=0;i<strlen(path);i++){
                       q=(int)(path[i])-(int)(48);
                       w=0;e=2;
                       if(  (q<w) || (q>e)  ) {
                            //printf("oshibka v zadanii puti\n\n\n");
                            return 0;
                            }          
     }
     
     
     q=strlen(path)*sizeof(char*)+2;
     str = (char*) malloc(q);
     strcpy(str, path);
     if((*root)==NULL){
                               (*root)=(TNODE *) malloc(sizeof(TNODE *));
                               (*((*root))).m_Decoration=0;
                               (*((*root))).m_Parent=NULL;
                               for(i=0;i<MAX_BRANCHES;i++){
                                     (*((*root))).m_Branches[i]=NULL;
                               }
     }
     x = CreateTree(root, str, decor);
     free(str);
     //printf("\n\n\n");
     return x;
}
 
 
 
TNODE * FindPointerToRootForDeletion(TNODE ** root, char * str){
      
 
      
     //printf("\n\nprohod rekursivnoj funkcii udalenija vetki\n\n");
     TNODE *tmp;
     int i,l,q;
     if( ( 2 < (((int)str[0])-48) ) ||  ( 0 > (((int)str[0])-48) ) ){return 0;}
     //printf("vhodnaja stroka => '%s'\n",str);
     l=((int)str[0])-48;
     //printf("pervoe cislo => '%d'\n",l);
     if((*((*root))).m_Branches[l]==NULL){
     //printf("uzel nenajden\n",l);
         return NULL;
     }else{
         //printf("uzel najden\n",l);
         tmp=(*((*root))).m_Branches[l];
     }
     q=(int)(strlen(str));
     for(i=0;str[i+1]!='\0';i++){
        str[i]=str[i+1];
     }
     str[i]='\0';
     if(str[0]=='\0'){
          //printf("najden poslednii uzel s adresom %p\n", tmp);
          return tmp;
     }
     return FindPointerToRootForDeletion( &tmp, str);       
}
 
 
void DeleteAllExistingLeafsFromTreeBeginningAt(TNODE ** root){
    
    int i;
    
    //printf("pytajus' udalit uzel po adresu %p\n", (*root) );
    
    for(i=0;i<MAX_BRANCHES;i++){
                               if( (*(*root)).m_Branches[i] != NULL ) {
                                                DeleteAllExistingLeafsFromTreeBeginningAt(&((*(*root)).m_Branches[i]));            
                                   }                           
    }
    free((*root));
    }
 
void destroyTree ( TNODE * root ){
     //printf("valim derevo\n");
     
     
     DeleteAllExistingLeafsFromTreeBeginningAt(&root);
     
     
     }
 
 
int cutBranch ( TNODE ** root, char * path ){
     //printf("\n\n\n");
     int i,q,w,e;
     char *str;
     TNODE * tmp;
     if(path[0]=='\0'){
                  
                  //printf("stroka pusta - udalajaem derevo\n");
                  destroyTree((*root));
                  return 1;
                  
     }
     for(i=0;i<strlen(path);i++){
                       q=(int)(path[i])-(int)(48);
                       w=0;e=2;
                       if(  (q<w) || (q>e)  ) {
                            //printf("oshibka v zadanii puti\n\n\n");
                            return 0;
                            }          
     }
     
     q=strlen(path)*sizeof(char*);
     str = (char*) malloc(q);
     strcpy(str, path);
     tmp = FindPointerToRootForDeletion(root, str);
     if(tmp!=NULL){
                   
                   
                   
                   
     //printf("zaebok nasli adres = %p\n", tmp);
     
     
     //printf("(*((*tmp).m_Parent)).m_Branches[0] = %p\n", (*((*tmp).m_Parent)).m_Branches[0]);
     //printf("(*((*tmp).m_Parent)).m_Branches[1] = %p\n", (*((*tmp).m_Parent)).m_Branches[1]);
     //printf("(*((*tmp).m_Parent)).m_Branches[2] = %p\n", (*((*tmp).m_Parent)).m_Branches[2]);
 
     for(i=0;i<MAX_BRANCHES;i++){
         if((*((*tmp).m_Parent)).m_Branches[i]==tmp){
            (*((*tmp).m_Parent)).m_Branches[i]=NULL;
            DeleteAllExistingLeafsFromTreeBeginningAt(&tmp);                                     
         }                           
     }
     
     //printf("(*((*tmp).m_Parent)).m_Branches[0] = %p\n", (*((*tmp).m_Parent)).m_Branches[0]);
     //printf("(*((*tmp).m_Parent)).m_Branches[1] = %p\n", (*((*tmp).m_Parent)).m_Branches[1]);
     //printf("(*((*tmp).m_Parent)).m_Branches[2] = %p\n", (*((*tmp).m_Parent)).m_Branches[2]);
     
     
     
     }else{
          // printf("uzel nebyl najden\n");
           }
     free(str);
     //printf("\n\n\n");
     return 1;
}
 
int easyToCatchFire ( TNODE * root );
 
int CatchFire(int PD, TNODE * root){ 
    int i,c;
    for(i=0;i<MAX_BRANCHES;i++){
                                    if((*root).m_Branches[i]!=NULL){ 
                                                                if((*((*root).m_Branches[i])).m_Decoration*PD==2){
                                                                                                                  return 1;
                                                                                                                  }
                                    }
    }
    for(i=0;i<(MAX_BRANCHES-1);i++){
                                if( ((*root).m_Branches[i]!=NULL) && ((*root).m_Branches[i+1]!=NULL) ){
                                          c=(*((*root).m_Branches[i])).m_Decoration * (*((*root).m_Branches[i+1])).m_Decoration;
                                          if( c == 2 ){
                                              return 1;
                                          }
                                }
    }
    for(i=0;i<MAX_BRANCHES;i++){
        if((*root).m_Branches[i]!=NULL){
                                        if(easyToCatchFire((*root).m_Branches[i])==1){return 1;}
        }
    }                          
    return 0;
}
 
 
int easyToCatchFire ( TNODE * root ){
    int i,ParentDecoration=0;
    if((*root).m_Parent!=NULL){ 
                   ParentDecoration=(*((*root).m_Parent)).m_Decoration;
    }
    for(i=0;i<MAX_BRANCHES;i++){
                                if((*root).m_Branches[i]!=NULL){
                                                                if(CatchFire(ParentDecoration,(*root).m_Branches[i])==1){return 1;};
                                }
    }
    return 0;
}
 
int main ( int argc, char * argv [] ){
    int x;
    TNODE *n;
n = NULL;
x = setDecoration ( &n, (char*) "000", DECORATION_SPARKLER );  /* x = 1 */printf("%d\n",x);
x = setDecoration ( &n, (char*) "001", DECORATION_SPARKLER );  /* x = 1 */printf("%d\n",x);
x = setDecoration ( &n, (char*) "002", DECORATION_SPARKLER );  /* x = 1 */printf("%d\n",x);
x = setDecoration ( &n, (char*) "1", DECORATION_CANDLE ); /* x = 1 */printf("%d\n",x);
x = setDecoration ( &n, (char*) "01", DECORATION_NONE );  /* x = 1 */printf("%d\n",x);
x = setDecoration ( &n, (char*) "", DECORATION_CANDLE ); /* x = 1 */printf("%d\n",x);
x = easyToCatchFire ( n ); /* x = 0 */printf("%d\n",x);
destroyTree ( n );
    system("PAUSE");
    return (0);
}


Добавлено через 4 минуты
через раз работает.

Добавлено через 16 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int DeleteAllExistingLeafsFromTreeBeginningAt(TNODE ** root){
    
    int i,j=0;
    
    printf("pytajus' udalit uzel po adresu %p\n", (*root) );
    
    for(i=0;i<MAX_BRANCHES;i++){
                               if( (*(*root)).m_Branches[i] != NULL ) {
                                                j = DeleteAllExistingLeafsFromTreeBeginningAt(&((*(*root)).m_Branches[i]));            
                                   }                           
    }
    free((*root));
    return j;
    }
 
void destroyTree ( TNODE * root ){
     printf("valim derevo\n");
     int i;
     
     i=DeleteAllExistingLeafsFromTreeBeginningAt(&root);
     
 
     }
вот этот участок кода вызывает ошибку

Добавлено через 12 минут
Сейчас пробую скомпилить на netbeans, после запуска вываливается сразу на
C
1
du8: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
0
alkagolik
Заблокирован
18.12.2011, 20:04 #43
по моему тут что-то не то
C
1
(*(*root)).m_Branches[i]
Добавлено через 1 минуту
и скорее всего тут
C
1
&((*(*root)).m_Branches[i])
0
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
18.12.2011, 21:08  [ТС] #44
Спасибо, разобрался программа работает, но атомат который проверяет обнаружил утечки, говорит что заметил не освобожденные блоки памяти, подскажите как их искать? В netbeans есть такие инструменты?

Добавлено через 10 секунд
Или только анализ кода?
0
alkagolik
Заблокирован
18.12.2011, 21:18 #45
Цитата Сообщение от awpe Посмотреть сообщение
Спасибо, разобрался программа работает, но атомат который проверяет обнаружил утечки, говорит что заметил не освобожденные блоки памяти, подскажите как их искать? В netbeans есть такие инструменты?

Добавлено через 10 секунд
Или только анализ кода?
а разве утилита вам не показывает где выделялась память, которая не освободилась?если работаете в линукс, то смотрите valgrind

Добавлено через 1 минуту
http://valgrind.org/
0
18.12.2011, 21:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2011, 21:18
Привет! Вот еще темы с ответами:

Проверка существования трехугольника с заданными сторонами, и определение его типа - C++
В консольном режиме создать программу для проверки существования трехугольника с задаными сторонами. Если трехугольник существует,указать...

Помещение структуры в вектор, удаление структуры, изменение элементов структуры - C++
Здравствуйте. Помогите разобраться с тем, как: 1 - находить элементы в векторе зная уникальный элемент структуры. 2 - удалять...

Структуры: проверка на наличие среди продавцов фамилии "Иванов" и если есть, то вывести наименование товара - C++
Поля структуры: Продавец. Наименование товара. Количество товара. Цена товара. Дата продажи. Задача: определить количество товаров...

Функция внутри структуры использует указатель, как поле этой структуры - C++
Коротко, есть класс A, описан в файле A_class.h ну и реализованы функции в A_class.cpp, есть файл GlobalItems.h, где хранятся глобальные...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru