Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> char ** вместо *char[] 
V
    Опции темы
VLGeorgievich
Дата 15.6.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Код

char *strings[100];
strings[0] = new char [10];
strings[1] = new char [12];


А если не известна константа, которая в данном примере равна 100. Как динамически создавать по одному указателю на char в переменной strings?

(вопрос конечно построен жутко, но объяснил как смог, может быть пойметеsmile
PM MAIL   Вверх
586
Дата 15.6.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Код
char **strings;

strings = new char*[100];
strings[0] = new char [10];
strings[1] = new char [12];
//...

//...
delete []strings[0];
delete []strings[1];
delete []strings;


Это сообщение отредактировал(а) 586 - 15.6.2009, 22:40
PM   Вверх
VLGeorgievich
Дата 15.6.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Но не обязательно строк будет 100. Их может быть как 5 так и 500. Можно ли указатели на char* создавать по одному. В этом собственно и суть моего вопроса.
PM MAIL   Вверх
ller
Дата 15.6.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



Код

int main()
{
    char **str;
    str = new char*[10];
    str[0] = new char[10];
    strcpy(str[0],"test\0");
    printf ("Получилось вот что %s\n",str[0]);
}

где то так

Добавлено через 2 минуты и 25 секунд
т.е. нужен динамический масив?

Код

vector<string> vstr;
vstr.push_back("Строка");


Добавлено через 3 минуты и 28 секунд
Таким образом решается куча проблем с памятью. что забудете где то, что то удалить, или наоборот удалится лишнее.
PM MAIL   Вверх
586
Дата 15.6.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(VLGeorgievich @  15.6.2009,  23:43 Найти цитируемый пост)
Их может быть как 5 так и 500.

Без проблем:
Код
char **strings;
int i = 50;   // переменная
strings = new char*[i];
strings[0] = new char [10];
strings[1] = new char [12];
//...
//...
delete []strings[0];
delete []strings[1];
delete []strings;

Цитата(VLGeorgievich @  15.6.2009,  23:43 Найти цитируемый пост)
Можно ли указатели на char* создавать по одному.

Можно... А зачем? Может нужно изменить размер массива указателей?
PM   Вверх
VLGeorgievich
Дата 15.6.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



До этого места я доходил. Дальше - больше. А если в процессе выполнения программы необходимо досоздать еще 10 указателей на char*.
Что то типа
Код

    char **str;
    str = new char*[10];
    (str+10) = new char*[10];

это вообще неправильный код, но я думаю может он отразит суть проблемы

Добавлено через 1 минуту и 6 секунд
Цитата

Можно... А зачем? Может нужно изменить размер массива указателей?


А как это сделать. Это именно то что мне нужно.

Добавлено через 4 минуты и 51 секунду
А если использовать собственный класс

Код

vector<MyClass> vstr;
vstr.push_back(!!! Здесь как я понимаю параметры конструктора !!!);

PM MAIL   Вверх
586
Дата 15.6.2009, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(VLGeorgievich @  15.6.2009,  23:54 Найти цитируемый пост)
А если в процессе выполнения программы необходимо досоздать еще 10 указателей на char*.

Это называется изменение размера динамического массива.
Для этого нужно создать новый массив, скопировать значения указателей из старого массива указателей в новый массив указателей, удалить старый массив и досоздать оставшиеся 10 указателей.

Если для тебя это сложно, используй std::vector.
PM   Вверх
ller
Дата 15.6.2009, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



Код

vstr.push_back(!!! Здесь как я понимаю параметры конструктора !!!);

Нет, здесь значение, которое заталкиваешь
PM MAIL   Вверх
VLGeorgievich
Дата 15.6.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Я понял надо делать так:

Код

   char *strings[100];
   strings[0] = new char[10];
   strings[1] = new char[54];
   ...


Если понадобиться увеличить массив то создаю новый, копирую значения, удаляю старый и досоздаю новые указатели.

Грамотен ли данный код, либо фигня какая-то получилась и можно сделать много проще и лучше?smile

Добавлено через 1 минуту и 26 секунд
(хочу первый раз в жизни сделать программу по умуsmile)
PM MAIL   Вверх
ller
Дата 15.6.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



Иначе динамические массивы не работают. Только выделять память можно с запасом, чтоб часто не перераспределять.
PM MAIL   Вверх
586
Дата 15.6.2009, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Код
char **strings, **tmp;
int n = 50, nn;

strings = new char*[n];
for(int i = 0; i < n; ++i)
    strings[i] = new char[32];

// перевыделение памяти
  nn = 100;   // новый размер массива
  tmp = new char *[nn];    // новый массив
  for(int i = 0; i < n; ++i)    // копирование указателей
      tmp[i] = strings[i];

  for(int i = n; i < nn; ++i)  // досоздание указателей
      tmp[i] = new char[32];

  delete []strings;              // удаление старого массива
  strings = tmp;
  n = nn;
//


PM   Вверх
VLGeorgievich
Дата 16.6.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



ller и 586, благодарю.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0797 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.