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

Ошибки компилятора - C++

Восстановить пароль Регистрация
 
Doksim
 Аватар для Doksim
57 / 57 / 8
Регистрация: 08.12.2013
Сообщений: 257
06.01.2014, 13:18     Ошибки компилятора #1
Помогите исправить ошибки, возникшие пр переводе с С++ на С.
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
struct Tree
{
       char s[ 10000 ];
       struct Tree *d;
};
struct Tree *tree = NULL;
 
/* void show(Tree *&tree) //Функция обхода
{
    if (tree!=NULL) //Пока не встретится пустое звено
    {
       show(tree->d); //Рекурсивная функция для вывода левого поддерева
       cout<<tree->s<<endl; //Отображаем корень дерева
    }
}*/
void Insert( struct Tree *&tree, char newstring[] )
{
     if( tree == NULL )
     {
         tree = (struct Tree *) malloc( sizeof( struct Tree ) );
         strcpy( tree->s, newstring );
         tree->d = NULL;
     }
     else
     {
         if ( tree->d != NULL )Insert( tree->d, newstring );
         else 
         {
              tree->d = (struct Tree *) malloc( sizeof( struct Tree ) );
              tree->d->d = NULL; 
              strcpy( tree->d->s, newstring );
         }
     }
}
 
void Delete( struct Tree *&tree, char delstring[], bool found = false )
{
     if( ( strcmp( tree->s, delstring ) == 0 || found ) && tree->d != NULL )
     {
         strcpy( tree->s, tree->d->s );
         Delete( tree->d, delstring, true );
     }
}
 
int Prefix( struct Tree *&tree, char prefstring[] )
{
    if( tree != NULL )
    {
        int prefix = 1, len = strlen( prefstring );
        for( int i = 0; i < len; i++ )
        {
             if( tree->s[ i ] != prefstring[ i ] )
             {
                 prefix = 0;
                 break;
             }
        }
        return prefix + Prefix( tree->d, prefstring );
    }
    else return 0;
}
 
bool Prisystvie( struct Tree *&tree, char string[] )
{
     if( tree != NULL )
     {
         if( strcmp( tree->s, string ) == 0 )
         return true;
         else return Prisystvie( tree->d, string );
     }
     else return false;
}
 
void FreeTop( struct Tree *&tree )
{
     if( tree->d == NULL )
     {
        free( tree );
        tree = NULL;
     }
     else FreeTop( tree->d );
}
 
int main()
{
    int n;
    scanf( "%d", &n );
    
    char cmd[ 7 ], string[ 10000 ];
    
    for( int i = 0; i < n; i++ )
    {
         scanf( "%s %s", &cmd, &string);
         
         if( strcmp( cmd, "INSERT" ) == 0 )
         {
             if( !Prisystvie( tree, string ) )
             Insert( tree, string );
         }
         if( strcmp( cmd, "DELETE" ) == 0 )
         {
             if( Prisystvie( tree, string ) )
             {
                 Delete( tree, string );
                 FreeTop( tree );
             }
         }
         if( strcmp( cmd, "PREFIX" ) == 0 )
         {
             printf( "%d\n", Prefix( tree, string ) );
         }
    }
    
    while( tree != NULL )
    FreeTop( tree );
    
    return system( "pause" );   
}
Ошибки:
Ошибки компилятора
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2014, 13:18     Ошибки компилятора
Посмотрите здесь:

C++ Смена Компилятора
C++ настройка компилятора
C++ Проблемы компилятора с++
C++ ошибка компилятора
C++ Ошибки компилятора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
06.01.2014, 13:24     Ошибки компилятора #2
В Си нет ссылок.
Doksim
 Аватар для Doksim
57 / 57 / 8
Регистрация: 08.12.2013
Сообщений: 257
06.01.2014, 13:39  [ТС]     Ошибки компилятора #3
Цитата Сообщение от 0x10 Посмотреть сообщение
В Си нет ссылок.
А как иначе? Иначе если оставляю только указатель то почему-то не работает...
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
06.01.2014, 13:41     Ошибки компилятора #4
Цитата Сообщение от Doksim Посмотреть сообщение
А как иначе? Иначе если оставляю только указатель то почему-то не работает...
Брать адрес указателя, принимать указатель на указатель.
Doksim
 Аватар для Doksim
57 / 57 / 8
Регистрация: 08.12.2013
Сообщений: 257
06.01.2014, 13:44  [ТС]     Ошибки компилятора #5
Цитата Сообщение от 0x10 Посмотреть сообщение
Брать адрес указателя, принимать указатель на указатель.
можно пример?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
06.01.2014, 13:47     Ошибки компилятора #6
Примитивный, без лишнего:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
 
void init(int** p)
{
    *p = malloc(sizeof(int));
    **p = 42;
}
 
int main()
{
    int* p;
    init(&p);
    printf("%d\n", *p);
    return 0;
}
Doksim
 Аватар для Doksim
57 / 57 / 8
Регистрация: 08.12.2013
Сообщений: 257
06.01.2014, 14:08  [ТС]     Ошибки компилятора #7
C++
1
2
3
4
5
6
7
8
 void show(struct Tree **tree) //Функция обхода
{
    if (*tree!=NULL) //Пока не встретится пустое звено
    {
       show(*tree->d); //Рекурсивная функция для вывода левого поддерева
       printf( "%s\n", tree->s ); //Отображаем корень дерева
    }
}
выдает ошибку:
C++
1
2
15 C:\Documents and Settings\Admin\Рабочий стол\zakaz\14.c request for member `d' in something not a structure or union 
16 C:\Documents and Settings\Admin\Рабочий стол\zakaz\14.c request for member `s' in something not a structure or union
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
06.01.2014, 14:10     Ошибки компилятора #8
Цитата Сообщение от Doksim Посмотреть сообщение
show(*tree->d)
(*tree)->d
В след строчке с s аналогично.
Doksim
 Аватар для Doksim
57 / 57 / 8
Регистрация: 08.12.2013
Сообщений: 257
06.01.2014, 14:51  [ТС]     Ошибки компилятора #9
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
struct Tree
{
       char s[ 10000 ];
       struct Tree *d;
};
 
 void show(struct Tree **tree) //Функция обхода
{
    if (*tree!=NULL) //Пока не встретится пустое звено
    {
       show((*tree)->d); //Рекурсивная функция для вывода левого поддерева
       printf( "%s\n", (*tree)->s ); //Отображаем корень дерева
    }
}
void Insert( struct Tree **tree, char newstring[] )
{
     if( *tree == NULL )
     {
         *tree = (struct Tree *) malloc( sizeof( struct Tree ) );
         strcpy( (*tree)->s, newstring );
         (*tree)->d = NULL;
     }
     else
     {
         if ( (*tree)->d != NULL )Insert( (*tree)->d, newstring );
         else 
         {
              (*tree)->d = (struct Tree *) malloc( sizeof( struct Tree ) );
              (*tree)->d->d = NULL; 
              strcpy( (*tree)->d->s, newstring );
         }
     }
}
 
void Delete( struct Tree **tree, char delstring[], int found )
{
     if( ( strcmp( (*tree)->s, delstring ) == 0 || found ) && (*tree)->d != NULL )
     {
         strcpy( (*tree)->s, (*tree)->d->s );
         Delete( (*tree)->d, delstring, 1 );
     }
}
 
int Prefix( struct Tree **tree, char prefstring[] )
{
    if( *tree != NULL )
    {
        int prefix = 1, len = strlen( prefstring );
        int i = 0;
        while( i < len )
        {
             if( (*tree)->s[ i ] != prefstring[ i ] )
             {
                 prefix = 0;
                 break;
             }
             i++;
        }
        return prefix + Prefix( (*tree)->d, prefstring );
    }
    else return 0;
}
 
int Prisystvie( struct Tree **tree, char string[] )
{
     if( *tree != NULL )
     {
         if( strcmp( (*tree)->s, string ) == 0 )
         return 1;
         else return Prisystvie( (*tree)->d, string );
     }
     else return 0;
}
 
void FreeTop( struct Tree **tree )
{
     if( (*tree)->d == NULL )
     {
        free( *tree );
        *tree = NULL;
     }
     else FreeTop( (*tree)->d );
}
 
int main()
{
    struct Tree *tree = NULL;
    int n;
    scanf( "%d", &n );
    
    char cmd[ 7 ], string[ 10000 ];
    
    int i = 0;
    while( i < n )
    {
         scanf( "%s %s", &cmd, &string);
         
         if( strcmp( cmd, "INSERT" ) == 0 )
         {
             if( !Prisystvie( &tree, string ) )
             Insert( &tree, string );
             
             show(tree);
         }
         if( strcmp( cmd, "DELETE" ) == 0 )
         {
             if( Prisystvie( &tree, string ) )
             {
                 Delete( &tree, string, 0 );
                 FreeTop( &tree );
             }
         }
         if( strcmp( cmd, "PREFIX" ) == 0 )
         {
             printf( "%d\n", Prefix( &tree, string ) );
         }
         i++;
    }
    
    while( tree != NULL )
    FreeTop( &tree );
    
    return 0;   
}
ввожу:
2
INSERT asd

и выскакивает что память не может быть риад...
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
06.01.2014, 15:10     Ошибки компилятора #10
1. Скомпилял исходник, получил полэкрана предупреждений. Сначала исправьте все, потом отлаживайте.
2. Если сложно понять что происходит - ставим в отладчике брейк в самое начало и идем по шагам.

Добавлено через 6 минут
В общем: бардак с указателями. Где-то ожидается просто указатель, а передается двойной, где-то ожидается указатель на указатель, а передается просто указатель.

Пара примеров:
Цитата Сообщение от Doksim Посмотреть сообщение
scanf( "%s %s", &cmd, &string);
Нужны указатели, а передаются адреса указателей.

Цитата Сообщение от Doksim Посмотреть сообщение
FreeTop( (*tree)->d );
Тут наоборот.
Doksim
 Аватар для Doksim
57 / 57 / 8
Регистрация: 08.12.2013
Сообщений: 257
06.01.2014, 15:11  [ТС]     Ошибки компилятора #11
Цитата Сообщение от 0x10 Посмотреть сообщение
1. Скомпилял исходник, получил полэкрана предупреждений. Сначала исправьте все, потом отлаживайте.
2. Если сложно понять что происходит - ставим в отладчике брейк в самое начало и идем по шагам.

Добавлено через 6 минут
В общем: бардак с указателями. Где-то ожидается просто указатель, а передается двойной, где-то ожидается указатель на указатель, а передается просто указатель.

Пара примеров:

Нужны указатели, а передаются адреса указателей.


Тут наоборот.
я вообще запутался . на с++ все прекрасно работает, без предупреждений, а на С какой бред..
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
06.01.2014, 15:18     Ошибки компилятора #12
Цитата Сообщение от Doksim Посмотреть сообщение
я вообще запутался . на с++ все прекрасно работает, без предупреждений, а на С какой бред..
Надо не запутываться, а внимательно смотреть какой тип принимает функция, и какой предается в месте вызова.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2014, 18:25     Ошибки компилятора
Еще ссылки по теме:

C++ Ошибки компилятора
C++ Директивы компилятора
C++ Какая может быть причина ошибки компилятора?

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

Или воспользуйтесь поиском по форуму:
Doksim
 Аватар для Doksim
57 / 57 / 8
Регистрация: 08.12.2013
Сообщений: 257
06.01.2014, 18:25  [ТС]     Ошибки компилятора #13
Все, нашел в чем проблема. Появилась другая, мой код не проходит проверку, но это не по теме...
Yandex
Объявления
06.01.2014, 18:25     Ошибки компилятора
Ответ Создать тему
Опции темы

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