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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2012, 09:17   #1
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию Разделение данных

Написал функцию для парсинга Index'го элемента из строки с разделителем, но ф-я работает только первый раз. Я подозреваю, то что ф-я strtok как-то не так всё это делает.
Код:
string Delimiter(char* Text, int Index, const char* Delimiter) {
	if (Index == 0)
		return strtok(Text, Delimiter);
	char* Temp = "";
	int n = 0;
	strtok(Text, Delimiter);
	while (n < Index) {
		Temp = strtok('\0', Delimiter);
		if (!Temp) {
			return "";
		}
		n++;
	}
	return Temp;
}
Код:
Name = Delimiter(Str, 0, "|"); // Name заполняется
LastName = Delimiter(Str, 1, "|"); //LastName не заполняется
//если убрать Name = Delimiter(Str, 0, "|"), тогда LastName заполняется
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 15.01.2012, 09:33   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

скорее вы не умеете применять strtok.
http://cplusplus.com/reference/clibrary/cstring/strtok/
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.01.2012, 22:12   #3
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Код:
string Delimiter(string Text, int Index, const char* Delimiter) {
	int n = 0, find = 0;
	for (int i = 0; i <= Index; i++) {
		find = Text.find(Delimiter, n);
		if (i == Index) {
			return Text.substr(n, find - n);
		}
		n = find + 1;
	}
	return "";
}
Написал другой, уже рабочий вариант разделителя. Но вот мне всё равно кажется, что можно сделать проще.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 16.01.2012, 08:41   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от t2skler Посмотреть сообщение
Код:

string Delimiter(string Text, int Index, const char* Delimiter) {
	int n = 0, find = 0;
	for (int i = 0; i <= Index; i++) {
		find = Text.find(Delimiter, n);
		if (i == Index) {  
			return Text.substr(n, find - n);
		}
		n = find + 1;
	}
	return "";
}
Написал другой, уже рабочий вариант разделителя. Но вот мне всё равно кажется, что можно сделать проще.
1. Не_рациональное падение производительности. Функция на входе получает тяжелый объект string Text по значению, что приведёт к запуску копирующего конструктора.


2. Не_рациональное падение производительности. Функция возвращает значение тяжелого объекта, что приведёт к запуску копирующего конструктора.

3. Не_рациональное падение производительности.
Условие внутри цикла:
Код:
if (i == Index) { ... }
Гарантированно будет истинным только для одной единственной итерации цикла, однако применено ко всем итерациям этого цикла.

Зачем 100500 раз запускать условие, которое гарантированно в холостую будет кушать процессорное время?

Итого: можно оптимизировать.

Последний раз редактировалось _Bers; 16.01.2012 в 17:02.
_Bers вне форума Ответить с цитированием
Старый 16.01.2012, 17:00   #5
ElectroMent
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 27
По умолчанию

Кстати, оптимизацию надо проводить вроде такой:
( пример из жизни, комментарии ассоциативные )
Код:
... //какой-то код

CComboBox *pBox = &m_ComboTypeTask; /*работаем с указателем, так ||компактнее код... думаю при дальнейшей оптимизации следует заменить pBox на pB или вообще на b */

pBox->ResetContent();

if( !pBox ) { ASSERT( 0 ); return; } /*тестируем работу компилятора, вдруг напутает =))) */

... //продолжение кода.
ElectroMent вне форума Ответить с цитированием
Старый 16.01.2012, 17:08   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ElectroMent Посмотреть сообщение
Кстати, оптимизацию надо проводить вроде такой:
( пример из жизни, комментарии ассоциативные )
Код:
... //какой-то код

CComboBox *pBox = &m_ComboTypeTask; /*работаем с указателем, так ||компактнее код... думаю при дальнейшей оптимизации следует заменить pBox на pB или вообще на b */

pBox->ResetContent();

if( !pBox ) { ASSERT( 0 ); return; } /*тестируем работу компилятора, вдруг напутает =))) */

... //продолжение кода.
1. Смысл тратить время на замену хорошо читаемых имен на плохо читаемые имена, в уже созданном отлаженном коде?
Замена хорошо читаемого имени переменной на плохо читаемое никакого отношения к "оптимизации" не имеет.

2. Запись вида:
Код:
CComboBox *pBox = &m_ComboTypeTask;
Предполагает, что pBox гарантированно должен смотреть на валидный объект.

А значит, проверка:
Код:
if( !pBox ) { ASSERT( 0 ); return; }
Защита от ошибок самого программиста, и не должна войти в релиз.

Следовательно, в макрос нужно обернуть весь блок условия, а не "последствия его истинности".

Проверка не должна войти в релиз. Любые грубые программные ошибки должны быть выловлены на этапе дебаг-версии.

Последний раз редактировалось _Bers; 16.01.2012 в 17:11.
_Bers вне форума Ответить с цитированием
Старый 16.01.2012, 18:29   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Предполагает, что pBox гарантированно должен смотреть на валидный объект.
Код:
pBox->ResetContent();
особенно это предполагает.
прикол в том что программа если дойдет до проверки то у нас гарантировано есть объект, иначе вывалиться ранее.

а вообще указатель никогда не будет null.
так как если m_ComboTypeTask это объект, то он ясное дело имеет адрес всегда.
а если ссылка то они не бывают null.

Цитата:
работаем с указателем, так ||компактнее код...
обычно там лучше ссылка.
и так же зависит от того что мы имеем, если у нас есть прямой доступ к объекту(или через ссылку) этому в функции, то нет смысла брать от него указатель.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.01.2012, 00:21   #8
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
1. Не_рациональное падение производительности. Функция на входе получает тяжелый объект string Text по значению, что приведёт к запуску копирующего конструктора.


2. Не_рациональное падение производительности. Функция возвращает значение тяжелого объекта, что приведёт к запуску копирующего конструктора.

3. Не_рациональное падение производительности.
Условие внутри цикла:
Код:
if (i == Index) { ... }
Гарантированно будет истинным только для одной единственной итерации цикла, однако применено ко всем итерациям этого цикла.

Зачем 100500 раз запускать условие, которое гарантированно в холостую будет кушать процессорное время?

Итого: можно оптимизировать.
Спасибо, оптимизировал до такого кода:
Код:
string Delimiter(string Text, int Index, const char* Delimiter) {
	int n = 0, find = 0;
	find = Text.find(Delimiter, n);
	for (int i = 1; i <= Index; i++) {
		n = find + 1;
		find = Text.find(Delimiter, n);
	}
	return Text.substr(n, find - n);
}
На ссылку позже заменю.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 18.01.2012, 20:20   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не все оптимизировали, принимайте ссылку на std::string.
Цитата:
2. Не_рациональное падение производительности. Функция возвращает значение тяжелого объекта, что приведёт к запуску копирующего конструктора.
вполне рационально.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.01.2012, 21:37   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
не все оптимизировали, принимайте ссылку на std::string.
вполне рационально.
То есть, вместо того, что бы простым и тривиальным способом избежать ненужного копирующего конструктора, вы предлагаете передавать данные по значению, и тратить время на копирующий конструктор?
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разделение данных одной ячейки jestya Microsoft Office Excel 4 29.09.2010 14:54
разделение данных в ячейках Viper_FMX Microsoft Office Excel 2 27.09.2010 02:43
Разделение данных на несколько ячеек d_adilet Microsoft Office Access 6 29.06.2010 09:28
Разделение массива данных на части Евгений К. Microsoft Office Excel 2 03.06.2010 13:41
Разделение. Maksim_27_10 Общие вопросы C/C++ 8 21.04.2010 20:40