Форум Pawn.Wiki - Воплоти мечту в реальность!: auto_new_line - авто переход на новую строку. - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

auto_new_line - авто переход на новую строку. Оценка: -----

#1
Пользователь офлайн   knox 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию

Название:
auto_new_line

Описание:
Проставляет \n по возможности на ближайшем пробеле.

Аргументы:
  • string - Массив со строкой в которой будет проставляться переходы
  • lenght_line - Количество символов в одной строке, по умолчанию 70
  • string_size - Размер строки, по умолчанию количество равно sizeof string



Код:
Код [Показать]


Пример:
Пример [Показать]

Скрин. [Показать]


Автор: knox

Сообщение отредактировал Barty Knox: 28 марта 2019 - 16:32

2

#2
Пользователь офлайн   NAVIGANTE 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
knoX - лучший
0

#3
Пользователь офлайн   Romzes 

  • ( ^_^ )
  • Вставить ник
  • Раскрыть информацию
Полезно. :yes:
0

#4
Пользователь офлайн   knox 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияNAVIGANTE (28 марта 2019 - 18:38) писал:

knoX - лучший

Да я такой.

Удивлен что не нашлось ни одного человека который не написал: "цикл в цикле гавнокодер"
0

#5
Пользователь офлайн   Sharkwd 

  • С кем ты?
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияBarty Knox (29 марта 2019 - 21:38) писал:

Да я такой.

Удивлен что не нашлось ни одного человека который не написал: "цикл в цикле гавнокодер"


цикл в цикле гавнокодер

А так плюс, пригодится. :blush:
0

#6
Пользователь офлайн   Pa4enka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияBarty Knox (29 марта 2019 - 21:38) писал:

Удивлен что не нашлось ни одного человека который не написал: "цикл в цикле гавнокодер"

Зачем критиковать то, что никто не будет использовать на постоянной основе? К тому же, на параллельном портале принципе описали недостатки этого алгоритма, которые вы даже не учли. А потом ищите похвалы на иных форумах. Забавная ситуация.

Сообщение отредактировал Pa4enka: 30 марта 2019 - 00:39

0

#7
Пользователь офлайн   knox 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (30 марта 2019 - 00:33) писал:

К тому же, на параллельном портале принципе описали недостатки этого алгоритма, которые вы даже не учли. А потом ищите похвалы на иных форумах. Забавная ситуация.


Я учел, но как там было сказано, возможно улучшить код, я пока размышляю об этом.
0

#8
Пользователь офлайн   knox 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Я тут решил попробовать по новому сделать, и вот до чего додумался:
stock InsertLineBreak(string[], const lenght_line = 70, const string_size = sizeof string)
{
	new
		line_start_pos = 0,
		line_end_pos = lenght_line,
		shift_pos = 0,
		count = 0;

	while(lenght_line < string_size)
	{
		if((line_end_pos - shift_pos) < 0)
		{
			strins(string, "\n", line_end_pos, string_size);

			line_start_pos = line_end_pos + 1;
			line_end_pos = line_start_pos + lenght_line;

			if(line_end_pos >= string_size)
				break;

			shift_pos = 0;
			count++;
		}
		else if(string[line_end_pos - shift_pos] == '\0')
		{
			break;
		}
		else if(string[line_end_pos - shift_pos] == '\n')
		{
			line_start_pos = line_end_pos - shift_pos + 1;
			line_end_pos = line_start_pos + lenght_line;
			
			if(line_end_pos >= string_size)
				break;

			shift_pos = 0;
			count++;
		}
		else if(string[line_end_pos - shift_pos] == ' ')
		{
			string[line_end_pos - shift_pos] = '\n';

			line_start_pos = line_end_pos - shift_pos + 1;
			line_end_pos = line_start_pos + lenght_line;

			if(line_end_pos >= string_size)
				break;

			shift_pos = 0;
			count++;
		}
		else
			shift_pos++;
	}
	return count;
}

0

#9
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
1) Не очень понимаю зачем в такой функции искать символ переноса. Если строка уже отформатирована и в ней расставлены свои переносы, то для чего может понадобиться использовать ещё и данную функцию, с учётом того, что те самые символы переноса обычно расставляются не просто так?

2) Как минимум, условия с использованием "string[line_end_pos - shift_pos]" можно заменить на switch, дабы лишний раз не обращаться к массиву, а значение выражения "line_end_pos - shift_pos" можно просчитывать единожды в самом начале каждой итерации.

3) Какой смысл от условия "lenght_line < string_size" в шапке цикла, если ни первая, ни вторая переменные не изменяют своих значений по ходу работы цикла?

4) Какой смысл от поиска нуль-символа в твоей строке, если ты перебираешь ячейки от конца к началу?

Ну и напоследок хочется спросить: а ты вообще тестировал свой код? Ибо даже беглым вглядом я не особо вижу то, как у тебя должен происходить переход к новым ячейкам в случае, если ты нашёл пробел и заменил его на символ переноса. Текущий твой код либо в бесконечный цикл нырнёт, если значение "lenght_line" будет достаточно маленьким, либо у тебя strins просто вылезет за пределы массива и ты утечку памяти словишь. Ты не учитываешь то, что фактический размер строки может быть гораздо меньше размера массива, который передаётся в функцию. А если всё же размер массива совпадает с длинной строки, то ты не учитываешь, что strins не обращает внимание на третий свой параметр и записывает символ в строку даже если места для этого символа особо-то и нет.
В общем, крайне странный код, который непонятно как должен вообще работать.


UPD: Вообще за тебя уже всё давно придумали и продумали - zmessage.inc
Только тут идёт разделение сообщений и отправка их через SendClientMessage, а в твоём случае достаточно просто символ переноса добавлять.

Сообщение отредактировал DeimoS: 30 апреля 2021 - 08:18

0

#10
Пользователь офлайн   knox 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (30 апреля 2021 - 08:11) писал:

1) Не очень понимаю зачем в такой функции искать символ переноса. Если строка уже отформатирована и в ней расставлены свои переносы, то для чего может понадобиться использовать ещё и данную функцию, с учётом того, что те самые символы переноса обычно расставляются не просто так?

Я хочу в БД хранить текст, там есть разделение по абзацам, но нет адаптации под диалоги(будет не очень красиво если будет слишком широкое окно).

Просмотр сообщенияDeimoS (30 апреля 2021 - 08:11) писал:

3) Какой смысл от условия "lenght_line < string_size" в шапке цикла, если ни первая, ни вторая переменные не изменяют своих значений по ходу работы цикла?

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

Просмотр сообщенияDeimoS (30 апреля 2021 - 08:11) писал:

4) Какой смысл от поиска нуль-символа в твоей строке, если ты перебираешь ячейки от конца к началу?

Чтобы лишний раз не бегать по массиву. Конечно можно было бы длину строки получить или же отдельным циклом его найти.

Просмотр сообщенияDeimoS (30 апреля 2021 - 08:11) писал:

Ну и напоследок хочется спросить: а ты вообще тестировал свой код? Ибо даже беглым вглядом я не особо вижу то, как у тебя должен происходить переход к новым ячейкам в случае, если ты нашёл пробел и заменил его на символ переноса.

Видимо магия происходит, я не знаю даже.

Просмотр сообщенияDeimoS (30 апреля 2021 - 08:11) писал:

Текущий твой код либо в бесконечный цикл нырнёт, если значение "lenght_line" будет достаточно маленьким, либо у тебя strins просто вылезет за пределы массива и ты утечку памяти словишь. Ты не учитываешь то, что фактический размер строки может быть гораздо меньше размера массива, который передаётся в функцию. А если всё же размер массива совпадает с длинной строки, то ты не учитываешь, что strins не обращает внимание на третий свой параметр и записывает символ в строку даже если места для этого символа особо-то и нет.
В общем, крайне странный код, который непонятно как должен вообще работать.

Я проверил на всё что смог придумать, и никаких проблем не обнаружил. Поэтому и решил спросить, чтобы узнать что я мог не правильно сделать или кто-то уже сделал до меня лучше(я не смог самостоятельно найти).

Просмотр сообщенияDeimoS (30 апреля 2021 - 08:11) писал:

UPD: Вообще за тебя уже всё давно придумали и продумали - zmessage.inc
Только тут идёт разделение сообщений и отправка их через SendClientMessage, а в твоём случае достаточно просто символ переноса добавлять.

Благодарю.

UPD: да, на счёт strins был прав

Сообщение отредактировал knox: 30 апреля 2021 - 16:01

0

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика