Программерам
Apr. 5th, 2011 03:19 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Задачка: как оптимизировать такой код, чтобы убрать копи-пасты?
Напрашивается заведение двух функций... а, может, кто-нибудь знает другие трюки?
Upd: Порядок вызова seek/read важен - там в файле два последовательных блока, наличие/отсутствие которых определяется флагами OpAfter/OpBefore.
Напрашивается заведение двух функций... а, может, кто-нибудь знает другие трюки?
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.
no subject
Date: 2011-04-05 11:27 am (UTC)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;
}
no subject
Date: 2011-04-05 11:28 am (UTC)no subject
Date: 2011-04-05 11:30 am (UTC)no subject
Date: 2011-04-05 11:47 am (UTC)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;
}
no subject
Date: 2011-04-05 12:02 pm (UTC)no subject
Date: 2011-04-05 12:19 pm (UTC)seek
read
или
read
seek
тут или копипаста или goto третьего не дано имхо.
(no subject)
From:no subject
Date: 2011-04-05 11:50 am (UTC)no subject
Date: 2011-04-05 12:03 pm (UTC)(no subject)
From:no subject
Date: 2011-04-05 11:53 am (UTC)no subject
Date: 2011-04-05 12:01 pm (UTC)no subject
Date: 2011-04-05 12:14 pm (UTC)no subject
Date: 2011-04-05 12:18 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2011-04-05 12:35 pm (UTC)if (s = !u & bef) {
seek
}
read;
if (!s) {
seek;
}
no subject
Date: 2011-04-05 12:37 pm (UTC)no subject
Date: 2011-04-05 04:45 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2011-04-05 12:46 pm (UTC)(undoCase&(!op&OpAfter))?(uf.read(&hb, sizeof(hb)),*hNew++= hb,++i;) :
uf.seek(sizeof(GHarmonicBase), SEEK_CUR),++hOld)
Усё.
no subject
Date: 2011-04-05 12:50 pm (UTC)Одно ясно, что это неверно, т.к. в некоторых случаях может понадобится seek+read или read+seek, а у вас - только read либо только seek
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2011-04-05 12:54 pm (UTC)inline seek(){...}
inline read(){...}
no subject
Date: 2011-04-05 07:09 pm (UTC){
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;
}
}
no subject
Date: 2011-04-05 07:09 pm (UTC)no subject
Date: 2011-04-05 07:17 pm (UTC)первый (op & OpBefore) надо заменить на (op & (undoCase ? OpBefore : OpAfter)), и второй & аналогично.
(no subject)
From:no subject
Date: 2011-04-05 08:13 pm (UTC)no subject
Date: 2011-04-05 07:43 pm (UTC)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
Date: 2011-04-05 08:15 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2011-04-09 02:29 pm (UTC){
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;
}
}