Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2011, 17:49   #1
DaysOfGrace
Пользователь
 
Регистрация: 03.03.2011
Сообщений: 12
По умолчанию Не присваивается значение указателю в C++ Builder

Код:
void __fastcall TDataModule2::ADODataSet1CalcFields(TDataSet *DataSet)
{
const int BuffSize = 30000;
   char *ptr;
   char *p1;
   wchar_t *p2;
   int i = 0;

   wcstombs( ptr, ADODataSet1FIO->Value, BuffSize);

   p1 = strtok( ptr, " ");
   while( i < 2 )
   {
     p1 = strtok( NULL, " ");
     i++;
   }

  /*while (p1 != NULL)
  {
    ADODataSet1Name->Value += p1;
    p1 = strtok( NULL, " ");
  }      */

  mbstowcs(p2, p1, BuffSize);
  ADODataSet1Name->Value = p2;
}
Конвертирую тип wchar_t ADODataSet1FIO->Value в char
функцией wcstombs. В таблице строка типа "Иванов Иван Иванович".
Затем разбиваю эту строку функцией strtok() и забираю оттуда имя - "Иван", на которое указывает указатель char * p1. Чтобы занести результат в таблицу ADODataSet1Name->Value, конвертирую p1 назад в wchar_t функцией mbstowcs().

Билдер не выдаёт ошибки при компиляции.

Но, когда запускаю проект, вылазиет


---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 32658E01 in module 'CC3260MT.DLL'. Read of address 00000001'. Process stopped.

Ошибка указывает на строку
Код:
p1 = strtok( ptr, " ");
Почему-то, первый аргумент в этой функции ptr="" ( смотрю значение сразу после вылета ошибки )

Хотя в функции wcstombs() ему должно присваиваться значение ADODataSet1FIO->Value.

Так как я имею дело с БД, то возможно, что первое значение базы данных считается, а при подсчёте следующего значения какая то из переменных неправильно сохраняется.

Объясните пожалуйста, в чём проблема.

Последний раз редактировалось DaysOfGrace; 03.03.2011 в 17:53.
DaysOfGrace вне форума Ответить с цитированием
Старый 03.03.2011, 18:04   #2
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

char *ptr указывает в космос.
Отведите память под буфер :
Код:
char *ptr = new char[BuffSize];
Д_М вне форума Ответить с цитированием
Старый 03.03.2011, 18:13   #3
DaysOfGrace
Пользователь
 
Регистрация: 03.03.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Д_М Посмотреть сообщение
char *ptr указывает в космос.
Отведите память под буфер :
Код:
char *ptr = new char[BuffSize];
Спасибо, помогло! (правда сразу новую мне выдал в предпоследней строке, указывая, что p1=NULL )
На всякий случай, проделал тоже и для *p1, *p2.

Последний раз редактировалось DaysOfGrace; 03.03.2011 в 18:18.
DaysOfGrace вне форума Ответить с цитированием
Старый 03.03.2011, 18:17   #4
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Для p1 не надо - будут утечки памяти.
Для p2 - надо. Ну и не забывайте освобождать память, когда она больше не нужна
Д_М вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
есть ли что то по указателю? the_deer_one Общие вопросы C/C++ 3 21.08.2010 23:18
Массиву *char не присваивается элемент CString'a MoroZzz45 Общие вопросы C/C++ 2 13.06.2010 15:46
Массиву класса не присваивается значения локального массива MoroZzz45 Общие вопросы C/C++ 7 06.06.2010 14:42
Не присваивается!!! prouser Общие вопросы C/C++ 3 02.05.2010 22:11
Вопрос по указателю marazmaticus Общие вопросы C/C++ 6 12.03.2010 00:05