Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Или я дурак или одно из двух
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
Throutle
Задача чуть-чуть сложнее, но это не суть... Заткнулся на кусочке где нужно шэйп раз в шаг таймера двигать на 1 вверх или вниз и на 1 влево или вправо, вроде всё должно быть просто, но не работает: постоянно движется вверх-влево... Никак не пойму в чём может быть проблема...

Код
procedure TForm1.Timer1Timer(Sender: TObject);
begin
randomize;
if random(1)>0 then Shape1.Top:=Shape1.Top+1 else Shapes.Top:=Shapes[1].Top-1;
randomize;
if random(1)>0 then Shape1.Top:=Shape1.Top+1 else Shapes.Top:=Shapes[1].Top-1;
end;
Guevara-chan
Тебя совсем не смущает, что вариант ф-ии 'random' для целых значений выдает диапазон от 0 до аргумента - 1 ?
tolich
random(2) надо.
Guevara-chan
">0" не надо. И еще автору кода хорошо бы проспаться, как по мне: "Shapes.Top:=Shapes[1].Top-1;" - это как-то совсем угнетающе...
tolich
>> ">0" не надо.
Как раз надо. Или "=0", или "=1", или "<1". Это Pascal, здесь Integer нельзя использовать вместо Boolean.
Throutle
Цитата(Guevara-chan @ 20 Apr 2012, 22:58) *
">0" не надо. И еще автору кода хорошо бы проспаться, как по мне: "Shapes.Top:=Shapes[1].Top-1;" - это как-то совсем угнетающе...


Скован в выборе способа, сказали таким макаром двигать...
По поводу проспаться не помешало бы, но и сделай скидку на то, что я этим занимаюсь первый год по 1 часу раз в две недели, с толпой народа...

Цитата(tolich @ 20 Apr 2012, 23:08) *
>> ">0" не нада
Как раз надо. Или "=0", или "=1", или "<1". Это Pascal, здесь Integer нельзя использовать вместо Boolean.


Угу тут нтак не кати,разве только окольными путями.

Так как правильното будет?
tolich
Я давно писал на Delphi и совсем не помню, можно ли там перегружать operator []. Если нельзя, то к одной и той же переменной ты обращаешься с индексом и без, я не знаю, какое обращение правильное.
gamecreator
насколько я помню, в дельфи нельзя перегружать ничего
hippocamus
В Делфи начиная с 2006 перегружать операторы можно. Только зачем?
Но попробуй убрать один randomize. А лучше оба из цикла. Сбрось генератор 1 раз при инициализации.
Etoprostoya
Цитата
Или я дурак или одно из двух

А где опрос?
gamecreator
если бы ты учил матан (конкретно - пределы), то знал бы почему его нет smile.gif
Guevara-chan
Цитата
Или "=0", или "=1", или "<1". Это Pascal, здесь Integer нельзя использовать вместо Boolean.

А, ну да, Вирт центрального процессора же... Тогда "=0", там хоть можно обойтись and reg, reg вместо cmp reg, imm. Байт, но приятно.

Цитата(tolich @ 21 Apr 2012, 00:45) *
Если нельзя, то к одной и той же переменной ты обращаешься с индексом и без, я не знаю, какое обращение правильное.

И самое смешное, что ровно до этого автор пишет: "Shape1.Top:=Shape1.Top+1". Кстати говоря, это называется "Inc(Shape1.Top)".
gamecreator
Цитата(Guevara-chan @ 21 Apr 2012, 09:41) *
Байт, но приятно.
это уже от оптимизации зависит. емнип, рандом выдает int16, так что как минимум 2 байта там будет.
FBX
Цитата
Inc(Shape1.Top)

Вроде так нельзя делать, т.к. это property, реализованный через сеттеры и геттеры, а может в новых дельфях можно, я даже и не знаю.
Guevara-chan
Цитата
емнип, рандом выдает int16, так что как минимум 2 байта там будет.

Изменяет:

Цитата(http://www.delphibasics.ru/Random.php)
function Random ( LimitPlusOne : Integer ) : Integer

...А Integer нынче приравнян к Int32...

Цитата
Вроде так нельзя делать, т.к. это property, реализованный через сеттеры и геттеры, а может в новых дельфях можно, я даже и не знаю.

AFAIR эту проблемe решили вводом полновесной перегрузки: INC же оператором считается ?
Berserker
Цитата
Вирт центрального процессора же

Это неудачный юмор?

По теме: одно из двух.

Цитата
Вроде так нельзя делать, т.к. это property, реализованный через сеттеры и геттеры, а может в новых дельфях можно, я даже и не знаю.

Верно. И INC - предопределённая процедура.
gamecreator
Цитата(Berserker @ 21 Apr 2012, 12:21) *
Это неудачный юмор?
наверно все же намек на то, что особенности синтаксиса языка каким-то макаром влияют на результирующий код. тот же inc должен работать со свойствами, имеющими сет и гет одновременно и являющимися по сути синтаксическим сахаром.
Guevara-chan
Цитата
Это неудачный юмор?

Это recordatio stultitia. Причем бессмысленной и беспощадной. Кстати, коли уж мы заговорили о булевой логике:

Код
Macro RandomSgn() : (1 | -Random(1)) : EndMacro
; Выдает единицу со случайным знаком.

...Так что никаких (y)if(f)’ов там, по большому счету, не нужно. Но сможет ли ОП адаптировать такой сложный код ?

Цитата
И INC - предопределённая процедура.

Вроде местный аналог макрокоманды, если не ошибаюсь.
Berserker
Цитата
Это recordatio stultitia. Причем бессмысленной и беспощадной.

А если на русском? Это такой язык, который не японский, латинский и не английский.

Цитата
...И никаких (y)if(f)’ов здесь, по большому счету, не нужно.

Макросы? Помилуй, Хрона, начни уже читать о проектировании языков программирования, безопасной разработке программного обеспечения и доказательном программирования. Иначе всю жизнь вокруг тактов, байтов и низкоуровневых вещей ходить будешь.
Код
FUNCTION RandSign: INTEGER;
BEGIN
  RESULT := 1 - 2 * Random(2);
END;


Цитата
Вроде местный аналог макрокоманды, если не ошибаюсь.

Ошибаешься. Это предопределённая процедура System.INC. Она раскрывается компилятором в коде, но это деталь реализации определённого компилятора.

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

INC это предопределённая процедура, принимающая аргумент по ссылке (VAR). Свойства по ссылке передаваться не могут по понятным причинам. В конечном итоге они могут вести к функциям.
Guevara-chan
Цитата
А если на русском?

Хирт - вуй. Все по аналогии (же).

Цитата
Макросы ? Помилуй, Хрона, начни уже читать о проектировании языков программирования, безопасной разработке программного обеспечения и доказательном программирования.

Ну, почитала: http://nemerle.org/Macros

Цитата
Она раскрывается компилятором в коде, но это деталь реализации определённого компилятора.

Тогда, простите, может еще к System.Pi следует относиться как функции ?

Цитата
Свойства по ссылке передаваться не могут по понятным причинам.

По ссылке, в данном случае, может быть передан адрес соотв. поля в памяти.
...Я уж не говорю, что вообще-то должны, ибо на то оно и ЯВУ. Абстракция.
Berserker
Цитата
Хирт - вуй. Все по аналогии (же).

Не вижу смысла в дальнейшей беседе.

Цитата
Тогда, простите, к System.Pi следует относиться как функции ?

А как она объявлена? FUNCTION Pi : EXTENDED;

Цитата
По ссылке, в данном случае, может быть передан адрес соотв. поля в памяти.

Покажу лишь простой пример:

PROPERTY A: INTEGER READ fA;

INC(A); // нельзя, свойство недоступно на запись

PROPERTY A: INTEGER READ fA WRITE fA;

INC(A); // предположим, что можно, но...

PROPERTY A: INTEGER READ GetA WRITE fA; // изменилось определение

Весь код мёртвый, модульность и раздельная компиляция не работают. Было поле, стала функция. Поэтому даже не самые умные люди такие простые вещи понимают при разработке языков. За сим откланиваюсь, имея столько свободного времени, ликбезом можно заниматься самостоятельно.
gamecreator
Цитата(Berserker @ 21 Apr 2012, 13:56) *
безопасной разработке программного обеспечения
ок, замени макрос на inline. те же яйца, только в профиль.
Цитата(Berserker @ 21 Apr 2012, 13:56) *
INC это предопределённая процедура, принимающая аргумент по ссылке (VAR). Свойства по ссылке передаваться не могут по понятным причинам. В конечном итоге они могут вести к функциям.
но сделать инкремент универсальным можно же. propertySet(propertyGet()+1)
Цитата(Guevara-chan @ 21 Apr 2012, 14:02) *
Тогда, простите, может еще к System.Pi следует относиться как функции ?
уже представил компилятор, в котором пи = 4
Цитата(Guevara-chan @ 21 Apr 2012, 14:02) *
По ссылке, в данном случае, может быть передан адрес соотв. поля в памяти.
компилятор не оптимизирует, операторы не универсальны. вообще бардак. о какой передаче после этого может быть речь?
Guevara-chan
Цитата
Не вижу смысла в дальнейшей беседе.

А в чем ты видишь смысл, позволь полюбопытствовать ? В вырожденной перегрузке long word’а под названием ‘Boolean’, коею компилятор даже не желает по-тихому обработать, чтобы никто не знал ? Даже, пожалуй, не поленюсь дать пример:

Код
If ReadFile(0, “имя_файла”); Открываем файл на чтение. Если получилось...
; [Читаем данные]
Closefile(0); ...Закрываем файл.
Else; [Выводим ошибку]
Endif

...Да, ‘ReadFile’ в данном случае возвращает какой-то свой код, о значении которого я могу не задумываться. Теперь попробуй то же самое на Delphi.

Цитата
А как она объявлена?

Такие подробности должны волновать доказательного программиста, коий принципиально не в курсе о байтах и тактах ?

Цитата
Весь код мёртвый, модульность и раздельная компиляция не работают.

А если все INC'и из примера заменить на A := A + 1, то он оживет обратно ?

Цитата
уже представил компилятор, в котором пи = 4

Есть немного: http://www.bestwtf.com/2010/11/explaining-why-pi-is-4.html

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

После берсеркерского траура по модульности я вообще в способностях Delphi к работе с ООП сомневаться начала...
Но вообще помимо Get/Set простым полям можно просто еще ввести автоконструируемое по умолчанию AccessPtr.

...Что я, собственно, пытаюсь сказать: инструмент разработки должен либо самостоятельно решать технические неувязки (HLL:Prolog,REBOL,Nemerle,etc), либо предоставить свободу работы с ними программисту (MLL:PureBASIC,C,FORTH,etc). Одно из двух, иначе получается полное Delphi.
Throutle
Цитата(Berserker @ 21 Apr 2012, 14:56) *
Код
FUNCTION RandSign: INTEGER;
BEGIN
  RESULT := 1 - 2 * Random(2);
END;


Вот такая функция вполне вписывается в пройденную на данный момент часть обучения, попробую как будут делфя под рукой (дома не ставлю этого монстра)...

З.Ы. Единственный кто понял вопрос правильно... Хотя бы потому что был интересен ответ не на профессиональном уровне и даже не на моём, а на уровне текущей части обучения... СПС!
Guevara-chan
Цитата
Единственный кто понял вопрос правильно...

Вообще-то он просто "перевел" за тебя мой пример, но да как будет угодно. Тему закрывать ?
pHOMM
А не проще не делать привязку к знаку а просто
Код
if random(2) = 1 then
shape1.top := shape1.top + 1
else shape1.top := shape1.top - 1;
if random(2) = 1 then
shape1.left := shape1.left + 1
else shape1.left := shape1.left - 1;

Randomize делается 1 раз на старте программы - традиционно в FormCreate

Также можно упростить код из 1 поста до вида:
Код
shape1.left := shape1.left + RandSign; // Berserker's randsign
shape1.top := shape1.top + RandSign;


Обсуждение о булеане считаю оффтопом, давайте не холиварить, каждый инструмент для своей задачи (в паскале, собственно, низкий порог вхождения без неявностей типа скрытого каста инта в бул, который если нужен, всегда можно сделать Ord(bool) или даже непосредственно Integer(bool)) Инк-обсуждение тоже оффтоп ))

Темку можно и не закрывать, чувствую, что не один вопрос ещё будет
gamecreator
Цитата(pHOMM @ 21 Apr 2012, 19:41) *
в паскале, собственно, низкий порог вхождения без неявностей типа скрытого каста инта в бул
в c# же вообще неявных кастов не бывает, обязательная запись способа передачи параметра при вызове функций, сборщик мусора и нет параметров по умолчанию. куда дружелюбнее к новичкам, чем паскаль.
feanor
Цитата
в c# же вообще неявных кастов не бывает

Расширяющие же, не? Или они не в счет?
gamecreator
хм, почему-то я думал они только для классов работают. но по крайней мере они не теряют информацию
Guevara-chan
Не поленилась, вот, дизассемблировать свой вариант RandomSgn:

Код
push dword 0x1
call dword 0x4054fb
mov ebx, eax
neg ebx
or ebx, 0x1

...и, дабы уж сразу, аналог by Berserker...

Код
push dword 0x1
call dword 0x4054fb
mov ebx, eax
add ebx, ebx
neg ebx
inc ebx

Дело, в принципе, хозяйское (+/- операнд). Suum cique.
gamecreator
не пойму зачем оно переносит в ebx, если результат функции все равно в eax возвращать.
Guevara-chan
Цитата(gamecreator @ 21 Apr 2012, 23:45) *
не пойму зачем оно переносит в ebx, если результат функции все равно в eax возвращать.

У компилятора PB, увы, много фобий касательно регистра EAX. Это - одна из них.
Throutle
Ещё 1 вопросик, незнаю как бы нагуглить, потому решил спросить...

В form1 на клик по кнопке происходит form2.show; в form2 на клик по кнопке происходит form2.hide; form1.show;...

Так всё работает как надо, а вот если в form1 делать не form2.show а form2.showmodal, то после нажатия в form2 нужной кнопки она скрывается, но фокус form1 не возвращается...

Вот собственно и вопрос: как вернуть фокус первой форме, если вторая открыта из него в модальном режиме?
Guevara-chan
http://msdn.microsoft.com/en-us/library/wi...1(v=vs.85).aspx ? Ну или местное SetFocus...
Throutle
Всё, вопрос снят, прослушал, что закрывать не hide`ом, а всего-навсего close`ом )
Throutle
И снова я...

Нужно ограничить пользователя при вводе данных в стринггрид: ввод минуса не в первую позицию, ввод второго минуса, ввод чисел перед минусом.
Для эдита я решал это так:

Код
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
'0'..'9', #8:
if (Edit1.SelStart=0)and(pos('-',Edit1.Text)>0)
then Key:=#0;
'-':
  if (Edit1.SelStart<>0)or(pos('-',Edit1.Text)>0)
  then Key:=#0;
else
Key:=#0;
end;
end;


А в стринггриде нет селстарта, потому единственное что работает так же это запрет ввода 2-го минуса:

Код
'-':
  if pos('-',StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])>0
  then Key:=#0;


Не подскажете, что можно сделать для оставшихся 2-х ситуаций?
tolich
На всякий ввод пользователя тут же пробуй преобразовать его в число, а затем на равенство строке '-'. Если оба теста проваливаются, тут же возврашай предыдущий текст. Qt-шный QIntValidator именно так работает.
FBX
Может что-то типа такого? http://forum.boolean.name/showthread.php?t=5561
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.