psilogic: (Default)
[personal profile] psilogic
Задачка: как оптимизировать такой код, чтобы убрать копи-пасты?
Напрашивается заведение двух функций... а, может, кто-нибудь знает другие трюки?


if (undoCase)
{
	if (op & OpBefore)
	{
		uf.read(&hb, sizeof(hb));
		*hNew= hb;
		++hNew;
		++i;
	}
	if (op & OpAfter)
	{
		uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass redo data
		++hOld;
	}
}
else
{
	if (op & OpBefore)
	{
		uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass undo data
		++hOld;
	}
	if (op & OpAfter)
	{
		uf.read(&hb, sizeof(hb));
		*hNew= hb;
		++hNew;
		++i;
	}
}


Upd: Порядок вызова seek/read важен - там в файле два последовательных блока, наличие/отсутствие которых определяется флагами OpAfter/OpBefore.

Date: 2011-04-05 11:27 am (UTC)
From: [identity profile] lionet.livejournal.com
if(!((op & opBefore) ^ undoCase) && !(op & opAfter)) {
uf.read(&hb, sizeof(hb));
*hNew= hb;
++hNew;
++i;
}
if(!((op & opAfter) ^ undoCase) && !(op & opBefore)) {
uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass undo data
++hOld;
}

Date: 2011-04-05 11:28 am (UTC)
From: [identity profile] lionet.livejournal.com
Это псевдокод, вестимо.

Date: 2011-04-05 11:30 am (UTC)
From: [identity profile] psilogic.livejournal.com
порядок seek/read важен :)

Date: 2011-04-05 11:47 am (UTC)
From: [identity profile] 3seemingmonkeys.livejournal.com
както так может

bef = op & opBefore
aft = op & opAfter
if (undoCase & bef | !undoCase & aft)
{
uf.read(&hb, sizeof(hb));
*hNew= hb;
++hNew;
++i;
}
else
{
uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass redo data
++hOld;
}

Date: 2011-04-05 12:02 pm (UTC)
From: [identity profile] psilogic.livejournal.com
для файла seek, read не равно read, seek

Date: 2011-04-05 12:19 pm (UTC)
From: [identity profile] 3seemingmonkeys.livejournal.com
выходит надо выполнить
seek
read

или

read
seek

тут или копипаста или goto третьего не дано имхо.

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 12:21 pm (UTC) - Expand

Date: 2011-04-05 11:50 am (UTC)
From: [identity profile] afa-at-work.livejournal.com
вынос в методы. и не заморачиваться.

Date: 2011-04-05 12:03 pm (UTC)
From: [identity profile] psilogic.livejournal.com
На практике - да, но можно рассмотерть как "олимпиадную задачку"...

(no subject)

From: [identity profile] afa-at-work.livejournal.com - Date: 2011-04-05 12:30 pm (UTC) - Expand

Date: 2011-04-05 11:53 am (UTC)
From: [identity profile] http://users.livejournal.com/_stilgar/
Вывод в методы, или языческое goto

Date: 2011-04-05 12:01 pm (UTC)
From: [identity profile] psilogic.livejournal.com
О! Насчет языческого я и забыл... :)

Date: 2011-04-05 12:14 pm (UTC)
From: [identity profile] racoonbear.livejournal.com
Ты не указал цель оптимизации - уменьшить зависимость от условных переходов, или увеличить скорость, или уменьшить количество строк кода \ вызовов, или улучшить читаемость или...

Date: 2011-04-05 12:18 pm (UTC)
From: [identity profile] psilogic.livejournal.com
Убрать дублирующий код, не увеличивая общий объем кода.

(no subject)

From: [identity profile] racoonbear.livejournal.com - Date: 2011-04-05 12:38 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 12:38 pm (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_stilgar/ - Date: 2011-04-05 04:42 pm (UTC) - Expand

(no subject)

From: [identity profile] racoonbear.livejournal.com - Date: 2011-04-06 01:48 am (UTC) - Expand

Date: 2011-04-05 12:35 pm (UTC)
From: [identity profile] 3seemingmonkeys.livejournal.com
можно убрать 1 дубль :)

if (s = !u & bef) {
seek
}
read;
if (!s) {
seek;
}

Date: 2011-04-05 12:37 pm (UTC)
From: [identity profile] psilogic.livejournal.com
неплохо!

Date: 2011-04-05 04:45 pm (UTC)
From: [identity profile] http://users.livejournal.com/_stilgar/
Упустили момент, когда ни read, ни seek не нужны.

(no subject)

From: [identity profile] 3seemingmonkeys.livejournal.com - Date: 2011-04-05 05:02 pm (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_stilgar/ - Date: 2011-04-05 06:58 pm (UTC) - Expand

Date: 2011-04-05 12:46 pm (UTC)
From: [identity profile] sfy-y.livejournal.com
// op&OpBefore ==!(op&OpAfter) accepted


(undoCase&(!op&OpAfter))?(uf.read(&hb, sizeof(hb)),*hNew++= hb,++i;) :
uf.seek(sizeof(GHarmonicBase), SEEK_CUR),++hOld)

Усё.

Date: 2011-04-05 12:50 pm (UTC)
From: [identity profile] psilogic.livejournal.com
Ничего не понял...
Одно ясно, что это неверно, т.к. в некоторых случаях может понадобится seek+read или read+seek, а у вас - только read либо только seek

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 12:56 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 12:59 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 01:05 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 01:07 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 01:15 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 01:16 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 01:18 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 01:24 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 02:15 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 02:17 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 02:29 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 02:55 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 03:01 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 03:03 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 03:09 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 03:28 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 02:28 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 03:01 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 03:06 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 03:11 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-05 03:33 pm (UTC) - Expand

(no subject)

From: [identity profile] boldcat.livejournal.com - Date: 2011-04-09 02:55 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-09 03:13 pm (UTC) - Expand

(no subject)

From: [identity profile] boldcat.livejournal.com - Date: 2011-04-09 05:58 pm (UTC) - Expand

(no subject)

From: [identity profile] sfy-y.livejournal.com - Date: 2011-04-09 06:20 pm (UTC) - Expand

Date: 2011-04-05 12:54 pm (UTC)
From: [identity profile] sfy-y.livejournal.com
А совсем тупо - просто макрики или инлайны:

inline seek(){...}
inline read(){...}

Date: 2011-04-05 07:09 pm (UTC)
From: [identity profile] kindex.livejournal.com
for (int i = 0; i <= 1; i++)
{
if (!!i != !!undoCase && (op & OpBefore))
{
uf.read(&hb, sizeof(hb));
*hNew= hb;
++hNew;
++i;
}
if (!!i == !!undoCase && (op & OpAfter))
{
uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass redo data
++hOld;
}
}

Date: 2011-04-05 07:09 pm (UTC)
From: [identity profile] kindex.livejournal.com
!! - это приведение к bool.

Date: 2011-04-05 07:17 pm (UTC)
From: [identity profile] kindex.livejournal.com
Вкралась ошибка - OpBefore и OpAfter используется неправильно.
первый (op & OpBefore) надо заменить на (op & (undoCase ? OpBefore : OpAfter)), и второй & аналогично.

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-05 08:14 pm (UTC) - Expand

Date: 2011-04-05 08:13 pm (UTC)
From: [identity profile] psilogic.livejournal.com
угу, for как goto :)

Date: 2011-04-05 07:43 pm (UTC)
From: [identity profile] os80.livejournal.com
Я ваш богомерзкий язык знаю плохо, но, если все "логические" переменные считать нормальными булевскими, то будет что-то вроде этого:

void OrFirstOrSecond(boolean First, boolean DoOrNot) {
if (First && DoOrNot) {
uf.read(&hb, sizeof(hb));
*hNew= hb;
++hNew;
++i;
}
else if (DoOrNot) {
uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass redo data
++hOld;
}
}

И Ваш код:
OrFirstOrSecond(undoCase, op && OpBefore);
OrFirstOrSecond(!undoCase, op && OpAfter);

(никогда в жизни такого говна в своём коде не напишу, но как решение олимпиадной задачи - почему нет?

(no subject)

From: [identity profile] os80.livejournal.com - Date: 2011-04-06 07:54 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2011-04-06 07:55 pm (UTC) - Expand

Date: 2011-04-09 02:29 pm (UTC)
From: [identity profile] boldcat.livejournal.com
if (op)
{
if (undoCase ? OpBefore : OpAfter)
{
uf.read(&hb, sizeof(hb));
*hNew= hb;
++hNew;
++i;
}
if (undoCase ? OpAfter : OpBefore)
{
uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass redo/undo data
++hOld;
}
}

December 2016

S M T W T F S
    123
45678910
11121314151617
181920212223 24
25262728293031

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 13th, 2025 01:24 pm
Powered by Dreamwidth Studios