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

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

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

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

21.08.2012, 05:40. Просмотров 1417. Ответов 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
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 - будет то же самое.
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 07:01  [ТС] #3
Цитата Сообщение от nexen Посмотреть сообщение
Оставь просто void *data - будет то же самое.
изначально я так и делал,но указателю ничего не присваивалось
оказывается можно,по крайней мере указатель в функции инициализируется
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.08.2012, 07:22 #4
alexey31415, напиши, где функцию вызываешь? (Когда указателю ничего не присваивалось)
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 09:40  [ТС] #5
Цитата Сообщение от nexen Посмотреть сообщение
(Когда указателю ничего не присваивалось)
когда не передаю по ссылке указатель,я отлаживал программу и указатель как был NULL,так и оставался
0
alkagolik
Заблокирован
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 );
....
}
-=ЮрА=-,
0
-=ЮрА=-
Заблокирован
Автор 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 и т.д.
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 11:05  [ТС] #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ну так друг, у тебя должен быть либо массив строк string arr[N];
а можно узнать почему?

у меня ИИ игры,который обрабатывает вводимую фразу и на основании её запускает нужную функцию с нужными данными
вот архив с кодом,постарался закомментировать подробно
0
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (3.1 Кб, 4 просмотров)
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 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) //недопустимо ибо бред)
0
-=ЮрА=-
Заблокирован
Автор 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());
Ну и в остальном посмотри проект, а лучше напиши задание т.к. я уверен всё можно сделать в несколько раз проще чем сейчас!Проект в аттаче
0
Вложения
Тип файла: rar Архив ZIP - WinRAR.rar (91 байт, 5 просмотров)
-=ЮрА=-
21.08.2012, 12:51
  #11

Не по теме:

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

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

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

Не по теме:

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

0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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 аналогично.
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
21.08.2012, 15:17  [ТС] #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
data везде указателем стала
так и было изначально
а про задание я уже писал,что это ИИ игры,который анализирует введённую фразу и запускает нужную функцию
Пример
I:Print me 677
AI:Print 677
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2012, 15:17
Привет! Вот еще темы с ответами:

Перезаписать память начиная с указателя 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...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
21.08.2012, 15:17
Ответ Создать тему
Опции темы

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