Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Самооптимизация


Green_Templar ©   (2005-03-09 15:55:00) 

Намучался я с этой проблемой 3 часа :)
Смысл был перегнать значения из unit2.stringgrid1 в массив unit1.bara специальным алгоритмом. Алгоритм был абсолютно правильный, но часть массива оно заполняло, а часть нет. Решилась проблема удивительно глупо - я перенёс алгоритм чуть дальше, и весь массив стал заполняться. Это при том, что unit2 и bara упоминаются только в этом алгоритме переноса! %| Что вообще с такими "глюками" делать?
В ходе моих поисков меня также удивила строка примерно такого содержания: отказано в доступе к unit2.stringgrid1.cells[a,b] due to optimization. Это что же, Дэлфи само решает к каким переменным мне иметь доступ, а к каким нет? >:( Как это отключить?
А вчера тоже абсолютно правильным алгоритмом у меня загружался спрайт с мусором. Долго ломал голову, в итоге оказывается нужно было просто перезагрузить.
Ну нужно ж с кем-то горем поделиться :)


Green_Templar   (2005-03-11 00:24:00) [1]

Хорошо, алгоритм изменил до
for a:=1 to form2.StringGrid1.RowCount-1 do for b:=1 to 8 do begin
case b mod 4 of
0:val(form2.StringGrid1.Cells[b,a],unit1.bara[b div 4-1,a].Bottom,i);
1:val(form2.StringGrid1.Cells[b,a],unit1.bara[b div 4,a].Left,i);
2:val(form2.StringGrid1.Cells[b,a],unit1.bara[b div 4,a].Top,i);
3:val(form2.StringGrid1.Cells[b,a],unit1.bara[b div 4,a].Right,i);
end;
if i<>0 then showmessage('form2.Stringgrid1.cells['+inttostr(b)+','+inttostr(a)+'] invalid value. ('+form2.StringGrid1.Cells[b,a]+')');
end;

Заносятся данные в стринггрид for b:=1 to form2.StringGrid1.RowCount-1 do for a:=1 to 8 do begin read(playerfile,c);form2.stringgrid1.cells[a,b]:=inttostr(c);end;
Если алгоритм писать сразу после этой строчки, будет то, что я говорил. С - интегер.
Юнит2 юзэс юнит1. Юнит1 и форм2 из разных юнитов :) Я не обрезал юнит1 бо точно такой же алгоритм используется в обработчике нажатий кнопки в юните2. Раз такое дело, то я наверно вообще его в отдельную библиотеку запихну :)
Моя оценка сего алгоритма есть моим субъективным мнением и не претендует на истинность, впрочем, как и ваша :)
Если роукаунт>4, то массив я увеличиваю в размерах :)


Erik1   (2005-03-10 12:01:00) [2]

А что в bara записано, как заполняется? И обращайся нармально к переменым. unit1 точно ненужен, а где у тебя form2 определен я незнаю, но думаю, что тоже в unit1. Тогда можно form2 опустить, StringGrid1.Cells[b,a] вынести из case. Что за переменая i вобще непонятно. Вобщем, рядом с этем алгоритмом нельзя ставить слово "абсолютно".


Shaman_Naydak   (2005-03-10 01:18:00) [3]

1. А если RowCount будет больше 4... что тогда?
2. нулевой столбец - фиксированный чтоль?
3. стринггрид работает синхронно,  а вот успели или нет - это тебе виднее исходя из алгоритма
4. поставил бы ты нулевой case 1м в список, либо заменил на else

а лучше бы переписал бы код... уж больно некрасивый


Green_Templar   (2005-03-09 23:56:00) [4]

Ольга, сэнкс.
Эрик1, что можно неинициализировать в алгоритме
var bara:array[0..1,1..3] of trect;

for a:=1 to form2.StringGrid1.RowCount-1 do for b:=1 to 8 do
case b mod 4 of
1:val(form2.StringGrid1.Cells[b,a],unit1.bara[b div 4,a].Left,i);
2:val(form2.StringGrid1.Cells[b,a],unit1.bara[b div 4,a].Top,i);
3:val(form2.StringGrid1.Cells[b,a],unit1.bara[b div 4,a].Right,i);
0:val(form2.StringGrid1.Cells[b,a],unit1.bara[b div 4-1,a].Bottom,i);
end;
???
Вроде только stringgrid. Все значения стринггрида-числа, заносились как раз перед этим алгоритмом. Я отодвинул алгоритм дальше - всё стало работать, до этого все поля bara[0,1] и bara[0,2] имели нулевые значения! Может ли такое быть, что программа просто не успевает инициализировать стринггрид полностью?
Плохишь, ваше заявление уже само по себе трёп.
Му, спасибо за сострадание ;)
Virgo_Style, "мы все знаем кто это и не будем тыкать пальцем (чтобы не замацать монитор)"?


Virgo_Style   (2005-03-09 20:08:00) [5]

Просто кое-кому надо все же заняться сабжем (самооптимизацией), я полагаю...


MU   (2005-03-09 18:02:00) [6]


> Плохиш ©   (09.03.05 17:33) [5]
> Почему описание этого горя сделано не в "Потрепаться"?

Надо завести "Поплакаться"


Плохиш   (2005-03-09 17:33:00) [7]

Почему описание этого горя сделано не в "Потрепаться"?


Erik1   (2005-03-09 17:17:00) [8]

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


Ольга   (2005-03-09 16:10:00) [9]


> Как это отключить?

Если речь об оптимизации, то
Project Options ->Compiler ->Code Generation ->Optimization


Green_Templar   (2005-03-09 16:02:00) [10]

Вот и я ничего не понял!!!


Antonn   (2005-03-09 15:57:00) [11]

ни че не понял...


Наверх

Титульная страница Поиск, карта сайта Написать письмо