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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2011, 19:47   #11
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

3 Пепел Феникса, инициализировать вот так:
Код:
LPTREENODE pTreeNode;
TREEROOT treeroot;
TREECHIELD treechield;
pTreeNode = new TREENODE();
pTreeNode->pTreeRoot = new TREEROOT(); //или это уже не надо?
pTreeNode->pTreeChield = new TREECHIELD(); //или это уже не надо?
pTreeNode->pTreeChield = &treechield;
pTreeNode->pTreeRoot = &treeroot;
2 Я не знаю, как это назвать, наверное боязнь, если я включу ещё в свой код std, то у меня ехе увеличится в размере.
4 Я пробовал от переменной. Вываливалась ошибка кучи.
1 да нет, не собираюсь в цикле выделять, просто если разницы в выделении при одном применении не было, я и решал в цикл загнать и проверить, результат в три раза выше, а у нас на компах на работе скажется это очень сильно.
Сtrl, у меня дерево - стандартный контрол. Просто к lParam - полю его фйтемов я привязываю указатели на свою структуры. А почему я с typedef намудрил? Майкрософт так использует. В данном случае это не нужно, наверное? Просто хочется, чтоб все по стандартам, всё крамиво было... Какая-то мания началась.
Вы уж все извените, ребят, что я так занудствую...
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 05.06.2011, 19:54   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
1 да нет, не собираюсь в цикле выделять, просто если разницы в выделении при одном применении не было, я и решал в цикл загнать и проверить, результат в три раза выше, а у нас на компах на работе скажется это очень сильно.
медленно само выделение памяти, а не работа с динамически выделенной памятью.
Цитата:
2 Я не знаю, как это назвать, наверное боязнь, если я включу ещё в свой код std, то у меня ехе увеличится в размере.
а лучше проверить, зато сколько проблем то отпадет(если все хорошо сделаете)
да и лучше чуток увеличить размер, чем городить кучу велосипедов с квадратными колесами.
Код:
pTreeNode = new TREENODE();
pTreeNode->pTreeRoot = new TREEROOT(); //или это уже не надо?
pTreeNode->pTreeChield = new TREECHIELD(); //или это уже не надо?
только это(и это все кстати для того варианта структуры где указатели на структуры были)
а указатель на стековый элемент сохранять...очень дурная мысль.
Цитата:
4 Я пробовал от переменной. Вываливалась ошибка кучи.
потому что помоему ктото либо вываливается за предел массива, либо где то левый указатель.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.06.2011, 19:55   #13
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

netrino. спасибо) Мне нужно дерево элементов, куда я могу добавлять элементы и удалять, каждый элемент должен иметь ряд полей типа LPWSTR к примеру. ользователь должен менять содержание каждого поля каждого элемента и иметь возможность посмотреть их при надобности. Может быть вы подскажите что-нибудь менее геморойное. Я использую TreeView Control. Но айтемы данного дерева могут хранить только ограниченное число полей - имя, ссылки на изображения активных и неактивных элементов и ещё парочку чего-то, - не помню. так же у элемента дерева есть поле lParam типа LPARAM, которое может содержать данные программиста. Так вот, чтобы свой класс дерева не писать, я решил написать только структуру, на которую будет ссылаться lParam каждого элемента. Ну и в файл потом записать будет не проблимотично, считав все элементы дерева, и восстановить смогу тоже.
Пепел Феникса, спасибо большое, теперь я разграничил понятие инициализации! Убедили в изучении vector'a. Просто так навскидку, какова вероятность, даже если я все правильно сделаю, вываливания за кучу, при использовании vector'a и как это скажется на быстроте работы по сравнению с вариантом, где все структуры мои определны статически?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 05.06.2011 в 20:06.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 05.06.2011, 20:07   #14
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну тогда да, можно делать как вы и делаете. Не знаю структуру вашей программы, обязательно нужны структуры TREEROOT и TREECHILD?
Цитата:
Просто так навскидку, какова вероятность, даже если я все правильно сделаю, вываливания за кучу, при использовании vector'a и как это скажется на быстроте работы по сравнению с вариантом, где все структуры мои определны статически?
Что значит вываливание за кучу? Компилятор обычно в состоянии оптимизировать работу с вектором так, словно вы работаете с обычным массивом.

Последний раз редактировалось netrino; 05.06.2011 в 20:09.
netrino вне форума Ответить с цитированием
Старый 05.06.2011, 20:15   #15
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

netrino, В проге планируется несколько главных корней и все остальные узлы - второстипенны. Главные должны иметь поля отличные от полей второстипенных (там 4 поля, там 8). У меня структура TREECHIELD называется (ошибся и потащил на протяжении всего проекта, поздно уже исправлять). Я просто решил сделать два указателя на эти структуры в одной главной, с мыслью о том, что если одна из 2-х не будет иметь указателя, то и память она занимать не будет, это верный подход? Или можете подсказать идею получше? Спасибо насчет vector'a.
И еще, обязательно после применения delete присваивать указателю NULL?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 05.06.2011 в 20:20.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 05.06.2011, 20:28   #16
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от ImmortalAlexSan Посмотреть сообщение
netrino, В проге планируется несколько главных корней и все остальные узлы - второстипенны. Главные должны иметь поля отличные от полей второстипенных (там 4 поля, там 8). У меня структура TREECHIELD называется (ошибся и потащил на протяжении всего проекта, поздно уже исправлять). Я просто решил сделать два указателя на эти структуры в одной главной, с мыслью о том, что если одна из 2-х не будет иметь указателя, то и память она занимать не будет, это верный подход? Или можете подсказать идею получше? Спасибо насчет vector'a.
И еще, обязательно после применения delete присваивать указателю NULL?
Структура TREENODE всегда будет занимать 8 байт на 32-х битных машинах, не смотря на то, что один из указателей (или оба) будут неинициализированы. Если вы ничего не присваиваете полю, это не значит, что его нет) Есть и даже с каким-то значением.
В целом, можно сделать как вы задумали, используя union, но стоит ли? Ведь если вы как-то собираетесь различать, какую же из структур вы хотите использовать (то есть существуют разные процедуры для работы с TREECHIELD и TREEROOT), то может передавать в них указатель именно на них, а не на рудиментарную TREENODE? Но это конечно, если я верно всё понял, для более точных подсказок нужно смотреть код программы.
Насчёт delete: да, обязательно.
netrino вне форума Ответить с цитированием
Старый 05.06.2011, 20:31   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
И еще, обязательно после применения delete присваивать указателю NULL?
нет, но лучше стоит, а то как определите что указатель пустой?
Цитата:
Я просто решил сделать два указателя на эти структуры в одной главной, с мыслью о том, что если одна из 2-х не будет иметь указателя, то и память она занимать не будет, это верный подход?
если вы веделите память то займет, но помните что сам указатель то занимает 4/8 байт, вне зависимости от того пустой или нет
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.06.2011, 20:44   #18
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

А я создал две функции - запись в поле и чтение из поля. Т.е. не зависит от того с какой структурой я работаю. Я в этих функциях только указываю указатель на память и всё. А главный или побочный узел идентифицирую путем ввода переменной типа bool, если 1 -то главный, 0 -побочный. Вот так делаю:
Код:
void SetNodeField(WCHAR* pSource, WCHAR* pTaker)
{
	WCHAR* PtrT = pTaker;
	WCHAR* PtrS = pSource;
	while (*pSource != '\0') {
		*pTaker = *pSource;
		pTaker++;
		pSource++;
	};
	*pTaker = '\0';
	pTaker = PtrT;
	pSource = PtrS;
};
Ну а создаю элемент так: MyTree.InsertItem(0 или 1); в зависимости от того что нажал юзер на выпадающей менюшке.
Спасибо, вам ребят большое за терпение и за помощь! =))
P.S. Кстати SetNodeField не косячно написана?)) Вроде работает всё.)
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 05.06.2011 в 20:55.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 05.06.2011, 21:23   #19
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
А форматирование хорошее у вас.
Уверены? Я бы начал с того, что с помощью табуляции делается исключительно индентация, а не выравнивание.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 05.06.2011, 23:29   #20
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Уверены? Я бы начал с того, что с помощью табуляции делается исключительно индентация, а не выравнивание.
Уверен. Единственное, к чему при желании можно придраться, это к выравниванию табуляцией, да и то, выглядит вполне отлично даже на форуме, что уж говорить про современные текстовые редакторы. А уж если сравнивать с тем, что тут иной раз проскакивает, то вообще безупречное форматирование
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение памяти в С++ Dj-IIyIIc Общие вопросы C/C++ 4 18.10.2010 14:39
выделение памяти Артем1256 Общие вопросы C/C++ 1 13.11.2009 16:38
Выделение памяти mutabor Общие вопросы Delphi 8 26.08.2009 18:16
До выделение памяти MAKTE Общие вопросы C/C++ 4 20.05.2008 21:34
Выделение памяти antoha.by Паскаль, Turbo Pascal, PascalABC.NET 2 29.04.2008 20:04