Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632

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

21.08.2012, 05:40. Показов 3177. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2012, 05:40
Ответы с готовыми решениями:

Разименование указателей
Прошу вас помочь и объяснить , относительно разадресации указателя. Какие указатели можно разадресовывать? в общем преподаватель...

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

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

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

вот пример
Миниатюры
Разименование указателя  
Вложения
Тип файла: zip Test.zip (2.9 Кб, 4 просмотров)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
24.08.2012, 12:11
Цитата Сообщение от 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 ** ты этим ничего не получишь...
Миниатюры
Разименование указателя  
Вложения
Тип файла: rar Temp.exe.rar (56.1 Кб, 3 просмотров)
Тип файла: rar Test_VS6_9_proj.rar (15.4 Кб, 3 просмотров)
1
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
24.08.2012, 12:18  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
в пустом DATA list в него ты ничего не добавляешь
я добавляю данные в мультимап и передаю его по значению
как он может быть пустым?

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

Не по теме:

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

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

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

0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
24.08.2012, 14:54  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
поправь свою мультикарту (намекну 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.08.2012, 14:54

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B* b = nullptr; }; class B{ public:

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

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

Возвращение неконстантного указателя из константного указателя на строку
Не могу до конца понять один момент. Допустим, у нас есть функция searchSymbol, которая принимает два параметра: константный указатель на...

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


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru