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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
#1

Разименование указателя - C++

21.08.2012, 05:40. Просмотров 1445. Ответов 25
Метки нет (Все метки)

Есть функция get_parametr,котрая в зависимости от переданного параметра,извлекает информацию,сохраняет в объекте string,адрес которого присваивается указателю на void,передаваемого по ссылке.После я передаю парметр и указатель функции,которая разыменовывает указатель и тут всплывает ошибка:необработанное исключение в ....
Указатель в процессе работы программы не равен нулю,то есть указывает на данные,возможно ошибка в том,что указателю присваивается адрес на локальную перменную фунции,которая уничтожается при её завершении и поэтому у меня есть указатель на ничто,но может я ошбаюсь
get_parametr
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
void get_parametr(vector<string> words, size_t position,
    short number, short parametr, void *&data)
{
    switch(number)
    {
    //----------------------------------------------------------
    case 0:
        {
            if(parametr)
            {
                ostringstream phrase;
 
                for(size_t i = position;i < words.size();i++)
                    phrase << words.at(i);
 
                data = &(phrase.str());
 
                return;
            }
            else
            {
                string digit = words.at(position + 1);
                data = &digit;
 
                return;
            }
        }
    //----------------------------------------------------------
 
    //----------------------------------------------------------
    case 1:
        {
            if(!parametr)
            {
                string village = words.at(position);
 
                data = &village;
 
                return;
            }
            else
            {
                string town = words.at(position);
 
                data = &town;
 
                return;
            }
        }
    //----------------------------------------------------------
    }
 
    return;
}

одна из функций,которые используют указатель
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Action::Print(short _param,void *_data)
{
    switch(_param)
    {
    case -1:
        {cout << "Print :" << *((string *)_data) << endl;   return;}
 
    case 0:
        {cout << "Print digit:" << *((int *)_data) << endl; return;}
 
    case 1:
        {cout << "Print phrase:" << *((string *)_data) << endl; return;}
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2012, 05:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разименование указателя (C++):

Вычислить и распечатать сумму элементов массива, используя указатель и метод доступа через разименование - C++
В программе создайте массив из 10 элемента типа float с произвольными числовыми значениями, инициализировать его именем указатель....

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using namespace...

Как сделать функцию от указателя на класс и указателя на метод? - C++
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

25
-=ЮрА=-
21.08.2012, 16:08     Разименование указателя
  #16

Не по теме:

Цитата Сообщение от alexey31415 Посмотреть сообщение
Пример
I:Print me 677
AI:Print 677
- ок мне это и надо было!
Если не сложно напиши ещё примеры что вводим что должно выводиться, т.к. у тебя там поход в город, село и т.д. тобишь не совсем понятно что надо ввести чтобы допустим получить Я иду в город и какое назаначение цифр(правда не охота ломать мозг копаясь в алгориме чтобы понять какой ввод какому выводу будет соответсвовать)

0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 16:22  [ТС] #17
я создаю пример с возможностью добавления функций,так как это для игры всё-таки программа
ИИ действует следующим образом:разбиваем строку на слова,ищем для каждого слова айди,по этому айди определяем,какую информацию несёт слово:глаголы-это вызов соответсвующей функции,существительные-параметр для функции.
функция Go имитирует движение в заданную точку,если есть слово town(для примера),то пишем go to the town здесь слово,следуемое за town в вводимой фразе
это я описал функцию Go,Print работает подобным образом
0
-=ЮрА=-
21.08.2012, 16:42
  #18

Не по теме:

alexey31415, сложноватый выходит лексический разбор, ладно подумаю...

0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 17:37  [ТС] #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
сложноватый выходит лексический разбор, ладно подумаю...
да мне собственно нужна была помощь с этим указателем и всё,но всё равно спасибо за помощь
я думаю использовать указатель на структуру,в которой уже будет храниться всевозможная информация для разных функций
0
-=ЮрА=-
21.08.2012, 23:21
  #20

Не по теме:

Цитата Сообщение от alexey31415 Посмотреть сообщение
да мне собственно нужна была помощь с этим указателем и всё,но всё равно спасибо за помощь
я думаю использовать указатель на структуру,в которой уже будет храниться всевозможная информация для разных функций
- лучше заведи отдельный класс для аргументов. Сейчас я немножко занят поэтому кроме этого линка пока ничем помочь не могу Переменное число аргументов
авось пригодится

0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
22.08.2012, 04:34  [ТС] #21
Цитата Сообщение от alexey31415 Посмотреть сообщение
я думаю использовать указатель на структуру,в которой уже будет храниться всевозможная информация для разных функций
я пока попробую этот вариант,но спасибо за идею
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
24.08.2012, 08:36  [ТС] #22
-=ЮрА=-, я опробывал ваш код(некоторое время я был занят другим и только сейчас его подробно разобрал) и он не решает моей проблемы
мне нужно вводить фразу,разбирать её,т.е. определять вызываемую функцию,её парметр и данные для функции и всё это должно храниться до вызова нужной функции,а в вашем коде это нет.
У вас уазатель _data передаётся по значению,а мне нужно по ссылке(!),чтоб присвоить ему нужное значение в функции и потом использовать.
Я пробывал присваивать указателю адрес не переменной типа string,как делал это с начала,а с-подобной строки,но выводится какая-то ерунда.
Я прошу лишь помочь избавиться от этой проблемы.

вот пример
0
Миниатюры
Разименование указателя  
Вложения
Тип файла: zip Test.zip (2.9 Кб, 3 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2012, 12:11 #23
Цитата Сообщение от alexey31415 Посмотреть сообщение
Я прошу лишь помочь избавиться от этой проблемы.
- пожалуйста
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
#include "StdAfx.h"
#include "Action.h"
 
//ищем слово и определяем необходимые данные
bool _parse(
    DATA &list,
    vector<string> words,
    size_t position,
    short &number,
    short &parametr,
    void * data);
 
//определяю какие данные передаются ф-ии в зависимости
//от ф-ии и параметра
void get_parametr
    (
    vector<string> words,
    size_t position,
    short number,
    short parametr,
    void * data
    );
 
 
int main()
{
    setlocale(LC_ALL,"Rus");
    //system("chcp 1251");
 
    DATA _list;
 
    ID  temp;
 
    //заполняю список данными
 
    //----------------------------------------------------------
    temp._0 = 1;//глагол,определяет вызываемую ф-ию
    temp._1 = 0;//вызов Print
    temp._2 = 0;
    temp._3 = 0;
 
    _list.insert(DATA::value_type("print",temp));
    //----------------------------------------------------------
 
    //----------------------------------------------------------
    temp._0 = 1;
    temp._1 = 0;//вызов Print
    temp._2 = 0;
    temp._3 = 0;
 
    _list.insert(DATA::value_type("show",temp));
    //----------------------------------------------------------
 
    //----------------------------------------------------------
    temp._0 = 1;
    temp._1 = 1;//вызов Go
    temp._2 = 0;
    temp._3 = 0;
 
    _list.insert(DATA::value_type("go",temp));
    //----------------------------------------------------------
 
    //----------------------------------------------------------
    temp._0 = 2;//существительное,определяет параметр ф-ии
    temp._1 = 0;//используем при вызове Print
    temp._2 = 1;//параметр,передаваемый функции(печатаем фразу)
    temp._3 = 0;
 
    _list.insert(DATA::value_type("phrase",temp));
    //----------------------------------------------------------
 
    //----------------------------------------------------------
    temp._0 = 2;
    temp._1 = 0;//используем при вызове Print
    temp._2 = 0;//печатаем цифру
    temp._3 = 0;
 
    _list.insert(DATA::value_type("digit",temp));
    //----------------------------------------------------------
 
    //----------------------------------------------------------
    temp._0 = 2;
    temp._1 = 1;//используем при вызове Go
    temp._2 = 0;//идём в деревню
    temp._3 = 0;
 
    _list.insert(DATA::value_type("village",temp));
    //----------------------------------------------------------
 
    //----------------------------------------------------------
    temp._0 = 2;
    temp._1 = 1;//используем при вызове Go
    temp._2 = 1;//идём в город
    temp._3 = 0;
 
    _list.insert(DATA::value_type("town",temp));
    //----------------------------------------------------------
 
    //кол-во необработанных слов
    size_t nonunderstood = 0;
    short _number = -1;
    short _parametr = -1;
 
    string phrase;
    vector<string>  words;
    string token;
 
    cout << "Введите фразу : ";
 
    //getline(cin,phrase);
    cout<<(phrase = "I glad to see you")<<endl;
    void *_data = (void *) (new char[2*phrase.size()]);
 
    stringstream ss(phrase);
    while(ss>>token)
        words.push_back(token);
 
    get_parametr
    (
    words,
    1,
    0,
    -1,
    _data
    );
    cout<<(const char *)_data<<endl;
 
    for(size_t i = 0;i < words.size();i++)
    {
        if(
            !_parse
            (
                _list,
                words,
                i,
                _number,
                _parametr,
                _data
            )
        )
            nonunderstood++;
    }
 
    if(nonunderstood == words.size())
    {
        cout << "I didn't understand anything of what you wrote to me" << endl;
        system("pause");
        return 0;
    }
 
    if(_number != -1 && _data != NULL)
    {
        Action act;
 
        act.Do(_number,_parametr,_data);
    }
    else
        cout << "Error" << endl;
 
    system("pause");
    return 0;
}
 
//определяю какие данные передаются ф-ии в зависимости
//от ф-ии и параметра
void get_parametr
    (
    vector<string> words,
    size_t position,
    short number,
    short parametr,
    void * data
    )
{
    string phrase;
    switch(number)
    {
    //----------------------------------------------------------
    //ф-ия Print
    case 0:
        if(parametr)
        {
            //печатаем фразу
            for(size_t i = position;i < words.size();i++)
                phrase += words.at(i) + " ";
            memcpy(data, (void *)(phrase.c_str()),phrase.size());
        }
        else
            //печатаем цифру
            memcpy(data, (void *)words.at(position + 1).c_str(),words.at(position + 1).size());
        break;
    case 1:
    //вызов ф-ии Go
        if(!parametr)
            //идём в деревню
            memcpy(data, (void *)words.at(position).c_str(),words.at(position).size());
        else
            //идём в город
            memcpy(data, (void *)words.at(position).c_str(),words.at(position).size());
        break;
    }
}
 
bool _parse
        (
            DATA &list, 
            vector<string> words, 
            size_t position,
            short &number, 
            short &parametr, 
            void * data
        )
{
    
    ID temp;
    DATA::iterator Iter;
    //ищу слово из массива words
    Iter = list.find(words.at(position));
    bool bRet = true;
    //если не найдено
    if(Iter == list.end())
        bRet = false;
    else
    {
        //получаю ID слова
        temp = Iter->second;
        //определяю номер ф-ии или её параметр
        switch(temp._0)
        {
        case 1:
            number = temp._1; 
            break;
        case 2:
            parametr = temp._2;
            get_parametr(words,position, number,parametr,data);
            break;
        }
    }
    return bRet;
 
}
(проект в аттаче)
PS:Проблемма на самом деле в другом - в пустом DATA list в него ты ничего не добавляешь.Я специально добавил перед циклом разбора функцию get_parametr, чтобы ты явно увидел что работает в твоём коде а что нет. Проект больше не правь - реши проблемму с добавлением в свою мультимапу и убери чёрт возьми & от data кроме как void ** ты этим ничего не получишь...
1
Миниатюры
Разименование указателя  
Вложения
Тип файла: rar Temp.exe.rar (56.1 Кб, 2 просмотров)
Тип файла: rar Test_VS6_9_proj.rar (15.4 Кб, 2 просмотров)
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
24.08.2012, 12:18  [ТС] #24
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
в пустом DATA list в него ты ничего не добавляешь
я добавляю данные в мультимап и передаю его по значению
как он может быть пустым?

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
убери чёрт возьми & от data
я уже так пробывал,указатель как был NULL,так и остаётся
0
-=ЮрА=-
24.08.2012, 13:20
  #25

Не по теме:

Цитата Сообщение от alexey31415 Посмотреть сообщение
я добавляю данные в мультимап и передаю его по значению
как он может быть пустым?
- Открой в дебаге да посмотри

Цитата Сообщение от alexey31415 Посмотреть сообщение
я уже так пробывал,указатель как был NULL,так и остаётся
- ты у меня код смотрел?Этот момент видел

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
void *_data = (void *) (new char[2*phrase.size()]);
- память надо выделить, память. Без этого, то на, что ты ссылаешся внутри тела, будет удалено при выходе из функции. Скажи ты понимаешь, что такое временный объект и что с ним происходит при выходе из тела функции???У тебя сейчас рабочий проект, только поправь свою мультикарту (намекну make_pair тебе в помощь)

0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
24.08.2012, 14:54  [ТС] #26
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
поправь свою мультикарту (намекну make_pair тебе в помощь)
мультимап не пустой(!)при отладке это видно и если б были проблемы с ним,я бы это упомянул

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
void *_data = (void *) (new char[2*phrase.size()]);
- память надо выделить, память. Без этого, то на, что ты ссылаешся внутри тела, будет удалено при выходе из функции.
спасибо,попробую,но почему 2*phrase.size()??я думаю хватит этого phrase.size() + 1

Добавлено через 57 минут
спасибо за совет,-=ЮрА=-,но сейчас помимо нужного слова или слов пишет ещё всякий мусор,может стоит делать это выделение памяти в функции get-parametr,а после вызова нужной мне ф-ии удалять выделенную память
C++
1
2
3
getline(cin,phrase);
 
    void *_data = (void *)(new char[phrase.size() + 1]);
Добавлено через 26 минут
уже не актуально,я решил все свои проблемы использованием структуры со свей необходимой информацией

Добавлено через 13 секунд
спасибо вам за помощь
0
24.08.2012, 14:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2012, 14:54
Привет! Вот еще темы с ответами:

Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0] - C++
Задан массив из 3 указателей Bitmap, по адресу Bitmap необходимо записать 480*640 элементов из массива Bitmap. В последнем цикле for выдает...

Существование указателя - C++
Есть линейный список(создаю эл-ты пока вручную). Если в последнем эл-те не присваивать ссылке на следующий нулю, то выдаст ошибку при...

Копирование указателя С++ - C++
Есть char *mydir он указывает на второй аргумент, эсли я дописую символы с помощью strcat то соответственно инфа меняеться. Как сделать...

инициализация указателя - C++
class Item { public: Item() { num0=new char(&quot;как&quot;);//ошибка cannot convert from 'const char ' to 'char' num1=new...


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

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

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