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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 05:40     Разименование указателя #1
Есть функция 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;}
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.08.2012, 06:23     Разименование указателя #2
Возможно я сейчас скажу глупость, но разве указатели можно передавать по ссылке?
void get_parametr(vector<string> words, size_t position,
short number, short parametr, void *&data)
Оставь просто void *data - будет то же самое.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 07:01  [ТС]     Разименование указателя #3
Цитата Сообщение от nexen Посмотреть сообщение
Оставь просто void *data - будет то же самое.
изначально я так и делал,но указателю ничего не присваивалось
оказывается можно,по крайней мере указатель в функции инициализируется
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.08.2012, 07:22     Разименование указателя #4
alexey31415, напиши, где функцию вызываешь? (Когда указателю ничего не присваивалось)
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 09:40  [ТС]     Разименование указателя #5
Цитата Сообщение от nexen Посмотреть сообщение
(Когда указателю ничего не присваивалось)
когда не передаю по ссылке указатель,я отлаживал программу и указатель как был NULL,так и оставался
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
21.08.2012, 09:53     Разименование указателя #6
alexey31415, то что ты присваиваешь непонятно чему (void* &data) уничтожается при выходе из функции get_parametr. можно сделать так
C++
1
2
3
4
5
6
7
8
void foo( int* point ) {
    *point = ...;
}
int main(){
    int data;
    foo( &data );
....
}
-=ЮрА=-,
-=ЮрА=-
Заблокирован
Автор FAQ
21.08.2012, 09:56     Разименование указателя #7

Не по теме:

alexey31415, у тебя дата вообще к какому типу потом преобразовываться будет?

Цитата Сообщение от alexey31415 Посмотреть сообщение
phrase.str()
к std::string? Ну так друг, у тебя должен быть либо массив строк string arr[N]; N - заранее должен задать, либо тогда уже пихай свою фразу в vector<string> data, либо делай динамический аллок памяти, выбирай сам. Вобщем в коде вижу работу с невыделенной памятью, а потому кроме краха ничего в этом алгоритме не наблюдаю...



Добавлено через 1 минуту
alexey31415, хочу увидеть увязку функции
Цитата Сообщение от alexey31415 Посмотреть сообщение
void get_parametr(vector<string> words, size_t position,
* * short number, short parametr, void *&data)
и алгоритма её вызывающего, хотябы примитивно покажи как и что пытаешся разбирать на цифры и заносить их в массив...
А лучше напиши задание что должен делать алгоритм, думаю всё можно на много проще сделать, к примеру подключив stringstream и т.д.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 11:05  [ТС]     Разименование указателя #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ну так друг, у тебя должен быть либо массив строк string arr[N];
а можно узнать почему?

у меня ИИ игры,который обрабатывает вводимую фразу и на основании её запускает нужную функцию с нужными данными
вот архив с кодом,постарался закомментировать подробно
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (3.1 Кб, 4 просмотров)
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.08.2012, 12:14     Разименование указателя #9
Цитата Сообщение от nexen Посмотреть сообщение
Возможно я сейчас скажу глупость, но разве указатели можно передавать по ссылке?
можно а вот ссылки по указателю нельзя
C++
1
2
void foo(T*& a) //допустимо
void foo(T&* a) //недопустимо ибо бред)
-=ЮрА=-
Заблокирован
Автор FAQ
21.08.2012, 12:38     Разименование указателя #10
alexey31415, вобщем т.к. я не знаю задания к проекту то лишь смог подправить и усовершенствовать (на мой взгляд) некоторые моменты
1-е strtok и плюсы - есть stringstream с ним проще бить на токены
C++
1
2
3
stringstream ss(phrase);
    while(ss>>token)
        words.push_back(token);
2-е думаю с передачей указателей ты явно перемудрил, вот так поступил с твоей phrase
C++
1
2
3
4
5
for(size_t i = position;i < words.size();i++)
                phrase += words.at(i) + " ";
            //печатаем фразу
            cout<<phrase<<endl;
            data = (void *)(phrase.c_str());
Ну и в остальном посмотри проект, а лучше напиши задание т.к. я уверен всё можно сделать в несколько раз проще чем сейчас!Проект в аттаче
Вложения
Тип файла: rar Архив ZIP - WinRAR.rar (91 байт, 5 просмотров)
-=ЮрА=-
21.08.2012, 12:51
  #11

Не по теме:

Проект по ходу не приаттачился, поправлюсь...

alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 13:08  [ТС]     Разименование указателя #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
думаю с передачей указателей ты явно перемудрил,
я передаю данные функции,я не могу сразу вывести,например,фразу
для этого я пердавал указатель по ссылке и инициализировал его

Добавлено через 8 минут
получается вы всего лишь использовали указатели на char,а не string
я подумывал об этом,но думал,что получится с указателями на string
-=ЮрА=-
21.08.2012, 13:28
  #13

Не по теме:

Цитата Сообщение от alexey31415 Посмотреть сообщение
получается вы всего лишь использовали указатели на char,а не string
я подумывал об этом,но думал,что получится с указателями на string
- какие char на стринг, ты хотя бы увидел что data везде указателем стала? Ладно не хочешь писать задание - решай сам, я могу помочь лишь тем людям, кто этого хочет...

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 13:42     Разименование указателя #14
C++
1
data = &(phrase.str());
Берем адрес временной переменной. Некорректно.
C++
1
2
string digit = words.at(position + 1);
                data = &digit;
digit выходит из области видимости - вызывается деструктор - указатель указывает на удаленный объект. С village и town аналогично.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 15:17  [ТС]     Разименование указателя #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
data везде указателем стала
так и было изначально
а про задание я уже писал,что это ИИ игры,который анализирует введённую фразу и запускает нужную функцию
Пример
I:Print me 677
AI:Print 677
-=ЮрА=-
21.08.2012, 16:08
  #16

Не по теме:

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

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

Не по теме:

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

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

Вычислить и распечатать сумму элементов массива, используя указатель и метод доступа через разименование C++
инициализация указателя C++
C++ Передача указателя

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
21.08.2012, 23:21     Разименование указателя
  #20

Не по теме:

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

Yandex
Объявления
21.08.2012, 23:21     Разименование указателя
Ответ Создать тему
Опции темы

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