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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатели и массив строк, изобретение велика :) 
V
    Опции темы
12usver12
Дата 7.3.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

void Add(char** mass );
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow) 
{
char* mass[15];

Add(mass);

if (mass[2]!="")// почему здесь не работает проверка и такая тоже ?(mass[2]!=NULL)
MessageBox(0,mass[2],"info",0);//соответственно прога здесь слетает
return 0;
}

void Add(char** mass ) 
{
    mass[0] = "first record";
    mass[1] = "second record";
} 

собсно хочу использовать массив строк, но без использования векторов и дополнит структур, а именно таким способом,
объясните как мне правильно делать проверку пустой указатель или нет, там где в моем коде комментарий, корректно ли так вообще и какими проблемами сулит использование такой конструкции ? 
PM MAIL   Вверх
Anikmar
Дата 7.3.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(12usver12 @  7.3.2009,  10:16 Найти цитируемый пост)
char* mass[15];
Add(mass);


Вы объявляете массив указателей на char,
Затем (не выделив память ни под один указатель) передаете его в функцию и там пытаетесь добавить в неинициализированный массив. Вот и вылет.
Сначала выделите память под мамассив:
mass = (char**)malloc(15, sizeof(char*)); (надеюсь ничего не попутал - посмотрите хелп по этой функции)

Добавлено через 2 минуты и 14 секунд
Цитата(12usver12 @  7.3.2009,  10:16 Найти цитируемый пост)
if (mass[2]!=""

Это со строками не работает! Используйте строковые функции - такие как strcmp, strncmp

Вы какую литературу читали? По идее эти вопросы как правило подробно освещаются.
PM MAIL ICQ   Вверх
12usver12
Дата 7.3.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



может я не прав но разве это могло решить проблему,  так это локальная переменная при malloc в куче выделяется, но смысл остается тот же if (mass[2]!="")    при отладке mass[2] содержит 0xcccccccc мне это нужно как то сравнивать типа там INVALID PTR или еще что-то такое, если такое возможно...то есть логика программы например нужно перечислить названия процессов и занести в этот массив, размер которого берется с запасом плюс с проверкой не выхода за границы массива, при обработке этого массива интересует перебор колва валидных записей в этом массиве  
PM MAIL   Вверх
Anikmar
  Дата 7.3.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Anikmar @  7.3.2009,  10:37 Найти цитируемый пост)
Цитата(12usver12 @  7.3.2009,  10:16 )
char* mass[15];
Add(mass);


Вы объявляете массив указателей на char,
Затем (не выделив память ни под один указатель) передаете его в функцию и там пытаетесь добавить в неинициализированный массив. Вот и вылет.
Сначала выделите память под мамассив:
mass = (char**)malloc(15, sizeof(char*)); (надеюсь ничего не попутал - посмотрите хелп по этой функции)

Я аидимо не проснулся - полную ерунду написал  smile 

Все у вас нормально с выделением памяти, вам просто начальную инициализацию массива надо сделать и все

Добавлено через 5 минут и 37 секунд
Предложение 1:
Если пробегаете по массиву строк начиная с первого уэлемента - то установите значение NULL как признак окончания списка строк, например так: 
Код

void Add(char **Mass)
{
    Mass[0] = "first string";
    Mass[1] = "second string";
    Mass[2] = NULL;
}


Другой способ - перед началом работы сразу обнулите массив так:
Код

for (i=0;i<15;i++) Mass[i] = NULL;


или при помощи функции memset (этот способ мне не нравится - так как я не уверен, что NULL и 0 одно и то же)
PM MAIL ICQ   Вверх
TiKKi
Дата 7.3.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Anikmar @ 7.3.2009,  11:16)
Я аидимо не проснулся - полную ерунду написал  smile

Ага. smile
Код

char* mass[15] = { 0 };

Еще как вариант инициализации.
PM   Вверх
Anikmar
Дата 7.3.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(TiKKi @  7.3.2009,  11:26 Найти цитируемый пост)
Еще как вариант инициализации. 

ага. Я совсем забыл статические массивы... 
PM MAIL ICQ   Вверх
zim22
Дата 7.3.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(12usver12 @  7.3.2009,  10:55 Найти цитируемый пост)
и занести в этот массив, размер которого берется с запасом 

может вам динамически создавать массив? тогда и не нужно будет угадывать "запас". 


--------------------
PM MAIL   Вверх
12usver12
Дата 7.3.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



да теперь вроде ясненько...
динамически выделять на моем примере 
Цитата
то есть логика программы например нужно перечислить названия процессов и занести в этот массив

сулит двойным действием сначала перебрать процессы для подсчета кол-ва процессов, потом динамически выделить память, и потом еще раз пройтись по процессам чтобы добавить их имена в массив...
все-таки при работе с объемными данными лучше я так понял выделять в куче память чем в стеке ? 


PM MAIL   Вверх
zim22
Дата 7.3.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(12usver12 @  7.3.2009,  13:03 Найти цитируемый пост)
сулит двойным действием

ок. тогда можно создать написать свой класс "Список"
И при каждой итерации добавляйте название процесса в  новый элемент списка.

Это сообщение отредактировал(а) zim22 - 7.3.2009, 13:18


--------------------
PM MAIL   Вверх
12usver12
Дата 7.3.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

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

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

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


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

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


 




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


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

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