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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2017, 08:39   #11
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Т.е. strcat и иже с ней, стрингов, стримов не существует? Кстати, ваш код и тот с ошибкой. Советчик...
strcat warningи выдает и не всем это нравится. Иже с ней вынуждают задавать массив фиксированного размера. Стринги и стримы не всем нужны в программе и речь идет о конкатенации массивов, в частности char.
Где ошибка то?
bugaboo вне форума Ответить с цитированием
Старый 19.06.2017, 09:48   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну вы ж тут из себя крутого изображаете - запихните ваш код в компилятор и посмотрите.
p51x вне форума Ответить с цитированием
Старый 19.06.2017, 09:54   #13
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну вы ж тут из себя крутого изображаете - запихните ваш код в компилятор и посмотрите.
По-моему, изображаете тут вы. Мой код прекрасно компилируется и работает. Или вам не удалось заменить многоточия и поставить фигурную скобочку в функции main?
bugaboo вне форума Ответить с цитированием
Старый 19.06.2017, 22:42   #14
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
Хорошо Как сложить 2 массива char*

Сделал полный пример для новичков
Код:
#include <iostream>
using namespace std;
void sum(char*& c, char*& a, char*& b)
{
	size_t i, la, lb;
	la = strlen(a);
	lb = strlen(b);
	c = new char[la + lb + 1];
	if (la >= lb)
	{
		for (i = 0; i < la; i++)
		{
			c[i] = a[i];
			if (i < lb) c[la + i] = b[i];
		}
	}
	else
	{
		for (i = 0; i < lb; i++)
		{
			c[la + i] = b[i];
			if (i < la) c[i] = a[i];
		}
	}
	c[la + lb] = 0;
}
int main()
{
	//	Можно использовать статические и динамические массивы char*
	//	в любой комбинации и любого размера. Результирующий массив
	//	не должен быть инициализирован до вызова функции sum.

	char* a = "blabla";	//	статический массив
	char* b;
	char** c = new char*[6];	//	динамический массив char** для хранения суммарных строк

	for (char i = 0; i < 3; i++)
	{					//	динамический массив - объявляем как душе угодно.
		b = new char [( a[0] + (a[1] - a[0] << a[0] - a[2] ) - a[2]) % (a[1] + strlen(a) - a[2] - i * (strlen(a) >> a[0] - a[2]))];		
		char j;
		for (j = 0; j < (i + 1) * 3; j++) b[j] = toupper(a[j % 3]); //	заполняем его как душе угодно
		b[j] = 0;
		sum(c[22 % (i * 4 + 1)], a, b);	//	заполняем суммой статического и динамического массивов строк c[0], c[2] и c[4]
		cout << "a = " << a << endl << "b = " << b << endl << "c = a + b = " << c[22 % (i * 4 + 1)] << endl << endl;
		sum(c[53 % (i + 4)], b, a);	//	заполняем суммой динамического и статического массивов строк c[1], c[3] и c[5]
		cout << "a = " << b << endl << "b = " << a << endl << "c = a + b = " << c[53 % (i + 4)] << endl << endl;
		delete[] b;
	}
	
	//	распоряжаемся полученными суммарными строками по своему усмотрению

	for (char i = 0; i < 6; i++) delete[] c[i];	//	не забываем чистить память, выделенную в функции sum

	delete[] c;	//	и вообще не забываем чистить память

	system("pause");
	return 0;
}
Безымянный.jpg
Немного изменил код функции sum, чтоб не бегала по лишним итерациям.
А стринги - это для девочек.

Последний раз редактировалось bugaboo; 20.06.2017 в 00:05.
bugaboo вне форума Ответить с цитированием
Старый 20.06.2017, 10:30   #15
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

За такой код руки надо отрывать по самые ягодицы.
Croessmah вне форума Ответить с цитированием
Старый 20.06.2017, 10:35   #16
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

....а я обожаю такие куски:
Код:
if (la >= lb)
	{
		for (i = 0; i < la; i++)
		{
			c[i] = a[i];
			if (i < lb) c[la + i] = b[i];
		}
	}
	else
	{
		for (i = 0; i < lb; i++)
		{
			c[la + i] = b[i];
			if (i < la) c[i] = a[i];
		}
	}
Почему никто, никогда (а уж видел я такое, в 20 проектах за этот год) не делает:

Код:
const auto src[] = {a, b};
auto sz_max = std::max(la, lb);
auto sz_min  = std::min(la, lb);
auto src_i = (sz_max == la)?0:1;

auto delta = (sz_max==la)?0:la; //не разбирался в логике оригинала, просто сделал инвариант (если не ошибся)

for (i = 0; i < sz_max; i++)
		{
			c[i] = src[src_i][i];
			if (i < sz_min) c[delta + i] = src[1 -src_i][i];
		}
Ну хотя бы так - вообще нужность этого куска под вопросом, но читаемость же лучше. Более того, отсутствие IF позволяет компилеру/процессору эффективнее использовать кэш проца. Т.к. оно линейно выходит.

Последний раз редактировалось alexzk; 20.06.2017 в 10:48.
alexzk вне форума Ответить с цитированием
Старый 20.06.2017, 10:47   #17
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Почему никто
Потому что не догадываются.

Еще более простой вариант:
Код:
void sum(char*& c, char* a, char* b)
{
    auto la = strlen(a);
    auto lb = strlen(b);
    
    c = new char[la + lb + 1]; 
    
    for (auto s = c; *s = *a; ++s, ++a) {//copy from a
    }
    
    for (auto s = c + la; *s = *b; ++s, ++b) {//copy from b
    }
}

Последний раз редактировалось Croessmah; 20.06.2017 в 10:51.
Croessmah вне форума Ответить с цитированием
Старый 20.06.2017, 10:50   #18
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Потому что не догадываются.

Еще более простой вариант:
Код:
void sum(char*& c, char* a, char* b)
{
	auto la = strlen(a);
	auto lb = strlen(b);
    
    c = new char[la + lb + 1]; 
    
    for (auto s = c; *s = *a; ++s, ++a) {
    }
    
    for (auto s = c + la; *s = *b; ++s, ++b) {
    }
}
Угу, так даже еще круче совсем IF ушли.
alexzk вне форума Ответить с цитированием
Старый 20.06.2017, 11:30   #19
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Еще более простой вариант:
Пожалуйста, прекратите неконструктивную критику. Если есть что сказать - пишите код.
Ваш простой вариант очевиден, но в нём больше итераций.

Цитата:
Сообщение от alexzk Посмотреть сообщение
....а я обожаю такие куски:
Я тоже не разбирался в логике вашего текста, но возвращать значение, а, следовательно, создавать лишние копии, не всегда нужно. И вы в принципе переписали мой код.

Само собой, тут вариантов множество, но суть их одна. Я постарался наиболее наглядно изобразить суть метода для новичков ввиду того, что некоторые не понимают и у них код не компилируется.
bugaboo вне форума Ответить с цитированием
Старый 20.06.2017, 11:36   #20
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
Пожалуйста, прекратите неконструктивную критику. Если есть что сказать - пишите код.
Ваш простой вариант очевиден, но в нём больше итераций.



Я тоже не разбирался в логике вашего текста, но возвращать значение, а, следовательно, создавать лишние копии, не всегда нужно.

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

Критика у вас не конструктивная. Раз пошли считать "итерации", то примите к сведению кеш и конвеер процессора. Все эти итерации поместятся в конвеер оптимальным образом и будут исполнятся по 8 инуструкций за такт. Ваш "более меньший" код вызывает проверки условий, т.о. будут промахи предсказаний, т.о. при каждом промахе конвеер будет сбрасываться и исполнять по 1 инструкции за такт.

...кроме того, вариант с циклами может быть легко повешен сразу на 8 ядер, легким мановением руки

__gnu_parallel::for_each
alexzk вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MMX сложить два числа gansm Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 29.10.2010 05:16
как сложить два числа с плавающей точкой forsy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 29.03.2010 02:15
Макрос: сложить два числа белочка Microsoft Office Excel 6 23.12.2009 22:02
Сложить два числа и вывести результат на экран We1c0m3 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 23.05.2009 11:41
Сложить два числа iwaniwan Win Api 3 23.04.2009 06:27