Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 21:32     Проверка существования структуры #1
Гугл ничего не дал так, что думаю будет многим полезно.

Язык си,

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

В других языках есть try/catche на си вроде нет, только на си++.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:39  [ТС]     Проверка существования структуры #21
Надо calloc использовать!)

Добавлено через 33 секунды
Спасибо! Разобрался - зациклился на malloc...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
17.12.2011, 22:40     Проверка существования структуры #22
Цитата Сообщение от awpe Посмотреть сообщение
меня dev c++ на win7, может поэтому там мусор в malloc?
Цитата Сообщение от awpe Посмотреть сообщение
мне под *NIX надо

соберите последнюю версию mingw. Там должно быть точно так же как и под юникс. Я был приятно удивлен когда поставил последнюю версию gcc и по случаю замечал что память с нулями, потом проверил - да так.
Вы просто немного не так понимаете задачу, ну или подход к решению.
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:42  [ТС]     Проверка существования структуры #23
Ну первый подход - чтобы работало, потом оптимизация и изменения - сдать надо через сутки
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
17.12.2011, 22:45     Проверка существования структуры #24
вот это кстати сомнительно. Получается что поле структуры не может содержать данные в виде нуля. Ограничение.
Цитата Сообщение от awpe Посмотреть сообщение
нули бы все поставили на свои места...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 22:51     Проверка существования структуры #25
Цитата Сообщение от alkagolik Посмотреть сообщение
соберите последнюю версию mingw. Там должно быть точно так же как и под юникс. Я был приятно удивлен когда поставил последнюю версию gcc и по случаю замечал что память с нулями, потом проверил - да так.
Типичный пример того, как писать непереносимый код.
Цитата Сообщение от alkagolik Посмотреть сообщение
Получается что поле структуры не может содержать данные в виде нуля. Ограничение.
Обнулятся указатели на потомков и родителя.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
17.12.2011, 22:54     Проверка существования структуры #26
Цитата Сообщение от fasked Посмотреть сообщение
Типичный пример того, как писать непереносимый код.
где пример? покажите. Я как раз против того чтобы полагаться на нули в выделенной памяти.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 22:57     Проверка существования структуры #27
Цитата Сообщение от alkagolik Посмотреть сообщение
где пример? покажите. Я как раз против того чтобы полагаться на нули в выделенной памяти.
Что ж Вы тогда такие советы даете?
Цитата Сообщение от alkagolik Посмотреть сообщение
соберите последнюю версию mingw. Там должно быть точно так же как и под юникс.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
17.12.2011, 23:07     Проверка существования структуры #28
Надо ему вот и говорю что и как. Между прочим с оговоркой. Полагаться на особенности компилятора это очень сомнительная мысль. Ладно, вода, проехали.
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 23:12  [ТС]     Проверка существования структуры #29
Ладно сдаюсь - ничего не получается, как ни крути, а не знаю как сделать функцию, которая не затрет дерево при следующем вызове.

Добавлено через 1 минуту
в задании в функцию передается только адрес корня и все, менять устройство структуры нельзя, как сделать это дерево?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
17.12.2011, 23:18     Проверка существования структуры #30
Цитата Сообщение от awpe Посмотреть сообщение
как сделать это дерево?
у вас есть вообще функция добавления ветки к дереву? в ней надо при создании ветки обнулять указатели на потомков. Так же и при удалении ветки.
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 23:29  [ТС]     Проверка существования структуры #31
Разве ошибочным будет утверждение, что для добавления ветки к дереву необходимо чтобы корень в массиве указателей на эти ветки имел везде NULL на первом проходе?

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

Добавлено через 12 секунд
А при проверке вызывать ошибку.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 23:31     Проверка существования структуры #32
awpe, нулевыми указателями должны обладать только листья дерева.
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. Ничего кроме как проверки на существование узла я не могу придумать.

Подскажите пожалуйста, я не так задачу понял или что то упускаю?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
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 минут
обход дерева надо переделать, так же кинуть исключение. Думаю что суть вы уловили.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 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/7cb333...ac11831d1145a9
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 минут
Пожалуйста скажите где ошибка?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.12.2011, 13:21     Проверка существования структуры #37
awpe, пройдитесь с дебаггером по программе и все станет ясно. Не поможет - дайте задание, лучше переписать с нуля, чем пытатся разобратся.
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++ какой -то странный, нет времени разбираться.
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));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2011, 13:55     Проверка существования структуры
Еще ссылки по теме:

C++ Проверка существования трехугольника с заданными сторонами, и определение его типа
C++ Обеспечить контроль существования диапазона
C++ Структуры: проверка на наличие среди продавцов фамилии "Иванов" и если есть, то вывести наименование товара

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

Или воспользуйтесь поиском по форуму:
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 секунды
Как правильно тогда?
Yandex
Объявления
18.12.2011, 13:55     Проверка существования структуры
Ответ Создать тему
Опции темы

Текущее время: 06:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru