Страниц: [1] 2 3
  Печать  
Автор Тема: Массив строк и PtListAddItems  (Прочитано 19582 раз)
Fregl
Sr. Member
****
Offline Offline

Сообщений: 396


Просмотр профиля
« : Декабря 15, 2008, 07:43:27 pm »

Как известно в PtListAddItems в качестве параметра передается массив строк в виде const char **.
Как оптимально сделать добавления одной строки(значения) в список. Щас я делаю так:
const char ** items = (const char**) malloc (sizeof(char*));
items[0] = (char*) malloc (256);
... какие то манипуляции со строкой
... добавление в список
PtListAddItems(ABW_List1,items,1,1);
free((void*)items[0]);
free(items);

можн о  ли как то обойтись без malloc/free?
т.е. как создать массив строк из одной строки в стеке?
Записан
beaka
Участник
*
Offline Offline

Сообщений: 5


Просмотр профиля
« Ответ #1 : Декабря 15, 2008, 08:32:19 pm »

я выкручиваюсь следующим образом
char buf[128];
char *ptr[1];

strcpy(buf,"Hello word";
ptr[0]=(char *)buf;
PtListAddItems(ABW_List1,(char const **)ptr,1,0);
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #2 : Декабря 15, 2008, 09:09:10 pm »

Хм, а какнить заюзать std::string ?
Записан
zoom2x
Jr. Member
**
Offline Offline

Сообщений: 60


Просмотр профиля
« Ответ #3 : Февраля 26, 2011, 02:16:38 pm »

А можно еще вот так:
Код:
    const char* string;
    string = "Hello!";
    PtListAddItems(ABW_List, &string, 1, 0);
Записан
oder
Гость
« Ответ #4 : Февраля 26, 2011, 05:48:36 pm »

Если у вас строка ограничена по длине 256-ма символами никаких malloc делать нет смысла - её можно разместить в обычном массиве на стеке. Тем более нет смысла выделять через malloc указатель. Если функция принимает параметром указатель на массив, структуру и ли ещё какой-либо объект фиксированной/ограниченной длины это не значит, что объект должен быть на куче: функции плевать, где находится объект. Указатель она принимает, просто, потому, что в языке C ссылок нет.

Тоесть, если у вас есть функция
void foo(int *);
Это не значит, что вы должны сразу делать
int *pi = new int();
foo(pi);
Достаточно сделать
int i;
foo(&i);
Записан
GrayCat
Full Member
***
Offline Offline

Сообщений: 121


Gray©at


Просмотр профиля
« Ответ #5 : Февраля 27, 2011, 12:39:41 pm »

никаких malloc делать нет смысла - её можно разместить в обычном массиве на стеке.
В абстрактном случае - да. Конкретно с PtListAddItems() - не соглашусь. Как я понял, эта функция запоминает внутри виджета указатели на строки, но сами строки к себе не копирует. Поэтому когда дело доходит до отрисовки виджета, PtDraw() лезет за содержимым по указателю... ...и если он указывал на локальный стек функции, которого уже давным-давно нету - глюки весьма разнообразны.

Так что в случае с PtListAddItems() нужен или malloc(), или уже статический массив, что далеко не всегда возможно.
Записан

Gray©at
oder
Гость
« Ответ #6 : Февраля 27, 2011, 04:17:33 pm »

никаких malloc делать нет смысла - её можно разместить в обычном массиве на стеке.
В абстрактном случае - да. Конкретно с PtListAddItems() - не соглашусь. Как я понял, эта функция запоминает внутри виджета указатели на строки, но сами строки к себе не копирует.

А, ну если так - то конечно.
(почитал описание PtList - не густо: сочувствую тем, кто без исходников всего этого чуда с ним мучается).
Записан
Hed
Jr. Member
**
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #7 : Марта 01, 2011, 05:12:39 pm »

никаких malloc делать нет смысла - её можно разместить в обычном массиве на стеке.
В абстрактном случае - да. Конкретно с PtListAddItems() - не соглашусь. Как я понял, эта функция запоминает внутри виджета указатели на строки, но сами строки к себе не копирует. Поэтому когда дело доходит до отрисовки виджета, PtDraw() лезет за содержимым по указателю... ...и если он указывал на локальный стек функции, которого уже давным-давно нету - глюки весьма разнообразны.

Так что в случае с PtListAddItems() нужен или malloc(), или уже статический массив, что далеко не всегда возможно.

Именно копирует!!! Все строки из массива. По этому такой способ корректен:
Код:
const char *item = "First item";

PtListAddItems( widget, &item, 1, 0 );
Записан
oder
Гость
« Ответ #8 : Марта 01, 2011, 05:39:45 pm »

Именно копирует!!! Все строки из массива. По этому такой способ корректен:
Код:
const char *item = "First item";

PtListAddItems( widget, &item, 1, 0 );

const char *item = "First item"; - это строка в секции статических данных, а не на стёке. Так что, пример не катит.
Записан
Hed
Jr. Member
**
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #9 : Марта 01, 2011, 09:20:51 pm »

Именно копирует!!! Все строки из массива. По этому такой способ корректен:
Код:
const char *item = "First item";

PtListAddItems( widget, &item, 1, 0 );

const char *item = "First item"; - это строка в секции статических данных, а не на стёке. Так что, пример не катит.


oder, немного фантазии...
Код:
SetItem() {
const char *item = "First item";

PtListAddItems( widget, &item, 1, 0 );
}

и потом, акцент был на то, как именно PtList ведет себя с массивом строк.
Записан
A_O
Full Member
***
Offline Offline

Сообщений: 205


Просмотр профиля
« Ответ #10 : Марта 02, 2011, 06:43:58 am »

oder, немного фантазии...
Код:
SetItem() {
const char *item = "First item";

PtListAddItems( widget, &item, 1, 0 );
}

За фантазию - незачёт. Указатель, правда, теперь в стеке, но сама строка в качестве константы всё равно осталась статической. А дело именно в ней.
Записан
qnxloder
Sr. Member
****
Offline Offline

Сообщений: 292


Просмотр профиля
« Ответ #11 : Марта 02, 2011, 09:16:21 am »

Посмотрел свой код:
func(*data)
{
char *str;
char cdg_str[256];
str = cdg_str;

sprintf(cdg_str, "%s", data);

PtListAddItems(ABW_sel_reg_lst, (const char **)&str, 1, 0);
}
Эта функция вызывается периодически и наполняет список данными, все работает нормально...
« Последнее редактирование: Марта 02, 2011, 09:27:34 am от qnxloder » Записан
A_O
Full Member
***
Offline Offline

Сообщений: 205


Просмотр профиля
« Ответ #12 : Марта 02, 2011, 09:59:56 am »

Вот это другое дело.

В абстрактном случае - да. Конкретно с PtListAddItems() - не соглашусь. Как я понял, эта функция запоминает внутри виджета указатели на строки, но сами строки к себе не копирует. Поэтому когда дело доходит до отрисовки виджета, PtDraw() лезет за содержимым по указателю... ...и если он указывал на локальный стек функции, которого уже давным-давно нету - глюки весьма разнообразны.

Если не секрет, где источник вашего "как я понял..."? У вас есть исходный код PtList?
Записан
Hed
Jr. Member
**
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #13 : Марта 02, 2011, 10:47:21 am »

oder, немного фантазии...
Код:
SetItem() {
const char *item = "First item";

PtListAddItems( widget, &item, 1, 0 );
}

За фантазию - незачёт. Указатель, правда, теперь в стеке, но сама строка в качестве константы всё равно осталась статической. А дело именно в ней.

Вы абсолютно правы, НО... При утверждении, что PtList копирует строки ( а я в этом уверен, иначе все мои UI грохнулись бы), для PtListAddItems не имеет значения где объявлена переменная, важно только то, что она const char **
Записан
Hed
Jr. Member
**
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #14 : Марта 02, 2011, 10:57:06 am »

Посмотрел свой код:
func(*data)
{
char *str;
char cdg_str[256];
str = cdg_str;

sprintf(cdg_str, "%s", data);

PtListAddItems(ABW_sel_reg_lst, (const char **)&str, 1, 0);
}
Эта функция вызывается периодически и наполняет список данными, все работает нормально...

как вариант...
Код:
AddStr( char* str)
{
    PtListAddItems( widget, (const char**)&str, 1, 0);
}
« Последнее редактирование: Марта 02, 2011, 10:59:54 am от Hed » Записан
Страниц: [1] 2 3
  Печать  
 
Перейти в: