Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

непонятная ошибочка   Найти похожие ветки 

 
ак   (2006-08-15 14:49) [0]

Здравствуйте, уважаемые Мастера Delphi. Прошу вас помочь по следующему вопросу. При установке значения константы BASE_MAX_WIDTH или BASE_MAX_HEIGHT >= 25 программулька либо вообще не запускается (выдаёт сообщение об ошибке доступа к блоку памяти (а asm я не знаю)), либо запускается, но закрывается с сообщением примерно такого же рода. Скорее всего, конечно, при таких ошибках можно сказать что "парю" я сам, только вот где? Подскажите, plz. Привожу прогу (без сокращений, прога по учебной рассылке создания ролевой игры):

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, StdCtrls;

type
 Tmainform = class(TForm)
   strgridMain: TStringGrid;
   btGenerateNewMap: TButton;
   procedure FormCreate(Sender: TObject);
   procedure GenerateNewMap;
   procedure strgridMainDrawCell(Sender: TObject; ACol, ARow: Integer;
     Rect: TRect; State: TGridDrawState);
   procedure btGenerateNewMapClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

const BASE_MAX_WIDTH = 50;
     BASE_MAX_HEIGHT = 50;
     VISIBLE_MAP_WIDTH = 2;
     VISIBLE_MAP_HEIGHT = 2;
     MAX_WIDTH = BASE_MAX_WIDTH + 2*VISIBLE_MAP_WIDTH;
     MAX_HEIGHT = BASE_MAX_HEIGHT + 2*VISIBLE_MAP_HEIGHT;

type TTileType = (ttGrass, ttGround, ttTree, ttStoune, ttEndMap);

    TTileRec = record
      Cells: array [1..MAX_WIDTH, 1..MAX_HEIGHT] of TTileType;
      IsVisible: boolean
      end;

var
 mainform: Tmainform;
 TileRec: TTileRec;

implementation

{$R *.dfm}

procedure Tmainform.GenerateNewMap;
var x, y, cause_koef: integer;
   leftMapPos, rightMapPos, topMapPos, bottomMapPos: integer;
begin
 // это просто вспом. переменные, чтоб вам читабельнее было
 leftMapPos := MAX_WIDTH - BASE_MAX_WIDTH - VISIBLE_MAP_WIDTH;
 rightMapPos := MAX_WIDTH - VISIBLE_MAP_WIDTH - 1;
 topMapPos := MAX_HEIGHT - VISIBLE_MAP_HEIGHT - 1;
 bottomMapPos := MAX_HEIGHT - BASE_MAX_HEIGHT - VISIBLE_MAP_HEIGHT;
 randomize;
 for x:=0 to MAX_WIDTH-1 do
   for y:=0 to MAX_HEIGHT-1 do
     if (x in [leftMapPos..rightMapPos]) and (y in [bottomMapPos..topMapPos]) then
       begin
       cause_koef := random(100);
       case cause_koef of
         0..5: TileRec.Cells[x, y] := ttStoune;
         6..16: TileRec.Cells[x, y] := ttGround;
         17..47: TileRec.Cells[x, y] := ttTree;
         48..100: TileRec.Cells[x, y] := ttGrass;
       end;
       end
     else TileRec.Cells[x, y] := ttEndMap;
end;

procedure Tmainform.FormCreate(Sender: TObject);
begin
//
 with strgridMain do
   begin
   RowCount := MAX_HEIGHT;
   ColCount := MAX_WIDTH;
   DefaultColWidth := (Width div MAX_WIDTH) - 2;
   DefaultRowHeight := (Height div MAX_HEIGHT) - 2;
   end;
 GenerateNewMap;
 end;

procedure Tmainform.strgridMainDrawCell(Sender: TObject; ACol,
 ARow: Integer; Rect: TRect; State: TGridDrawState);
var GridCellRect: TRect;
begin
 with strgridMain do
   begin
   GridCellRect := CellRect(ACol, ARow);
   case TileRec.Cells[ARow, ACol] of
     ttGrass: Canvas.Brush.Color := clGreen;
     ttGround: Canvas.Brush.Color := clRed;
     ttTree: Canvas.Brush.Color := clYellow;
     ttStoune: Canvas.Brush.Color := clGray;
     ttEndMap: Canvas.Brush.Color := clBlack
   end;
   Canvas.FillRect(GridCellRect)
   end;
end;

end.


 
Сергей М. ©   (2006-08-15 14:58) [1]


> только вот где?


В сообщении об ошибке фигурирует адрес, его и следует использовать для поиска строки, вызвавшей ошибку.

см. меню Search -> Find Error ..


 
ак   (2006-08-15 14:58) [2]

Вопрос конечно не "ахти", но может поможете ... Ple-e-e-a-a-a-se.


 
ак   (2006-08-15 14:59) [3]

> В сообщении об ошибке фигурирует адрес, его и следует использовать для поиска строки, вызвавшей ошибку.

да я asm-ра не знаю


 
Сергей М. ©   (2006-08-15 15:03) [4]

см. меню Search -> Find Error !!

Использование этой фичи не требует знания асма, если ошибка именно в твоем коде.


 
ак   (2006-08-15 15:08) [5]

см. меню Search -> Find Error !!

Это я обязательно посмотрю. Просто мне и самому непонятна проблема, если  BASE_MAX_WIDTH равно, скажем, 10, 11, ... - то всё нормально, если число немногим больше (порядка 50-ти, например), то ошибка. В чём в принципе может быть загвоздка?


 
tesseract ©   (2006-08-15 15:12) [6]

а запустить отладчик и гнянуть, что на  50 шаге происходит?


 
ак   (2006-08-15 15:15) [7]

а запустить отладчик и гнянуть, что на  50 шаге происходит?

я же говорю, я совсем не разбираюсь в асемблере, мне там ничего не понятно. Может кто у себя это дело запустить попробует, это ведь не долго - форма и stringgrid ...


 
tesseract ©   (2006-08-15 15:17) [8]


> ак   (15.08.06 15:15) [7]


Какой ассемблер ?????

ставишь bp на начало цикла и всё, потом когда программа до туда дойдёт она там и остановиться. Пошаговая отладка называется.


 
DrPass ©   (2006-08-15 15:22) [9]

Да зачем там ассемблер?
Внимательнее код посмотрите:
Cells: array [1..MAX_WIDTH, 1..MAX_HEIGHT] of TTileType;

...
for x:=0 to MAX_WIDTH-1 do
  for y:=0 to MAX_HEIGHT-1 do

Range checking наверняка выключен, и программа это молча проглатывает


 
ак   (2006-08-15 15:23) [10]

ставишь bp на начало цикла и всё, потом когда программа до туда дойдёт она там и остановиться. Пошаговая отладка называется.

Да я просо не понимаю как такое вообще может быть,  почему при 10-ти - всё нормально, чуть-больше - не работает. Какое значение может иметь число, да хоть миллион поставлю - должно ведь работать. Delphi ведь не какая-нибудь лажовая среда разработки (с этим наверное все согласны :-) ). Ладно, спасибо tesseract`у и Сергею М за ответы.


 
Плохиш ©   (2006-08-15 15:23) [11]


> ак   (15.08.06 14:49)

Нумерация строк начинается с нуля, поэтому первый вызов strgridMainDrawCell произойдёт для ячейки [0, 0]. Дальше сам додумывай.


 
ак   (2006-08-15 15:26) [12]

Да зачем там ассемблер?
Внимательнее код посмотрите:
Cells: array [1..MAX_WIDTH, 1..MAX_HEIGHT] of TTileType;

...
for x:=0 to MAX_WIDTH-1 do
 for y:=0 to MAX_HEIGHT-1 do

Range checking наверняка выключен, и программа это молча проглатывает


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


 
Сергей М. ©   (2006-08-15 15:30) [13]


> верно ведь?


Нет, неверно.

Это дело случая.


 
ак   (2006-08-15 15:40) [14]

Спасибо ещё раз всем. Извините что отнял время по такому ерундовому вопросу, впредь буду внимательнее. А может кто подскажет чем, собственно, отличается конструкция for i:=0 to count-1 от for i:=1 to count (в смыле, быстродействием или ещё чем либо ). Веть переменная i в любом случае должна быть инициализирована - установлена в ноль, а её нач. значение не важно.


 
Сергей М. ©   (2006-08-15 15:44) [15]


> Веть переменная i в любом случае должна быть инициализирована
> - установлена в ноль, а её нач. значение не важно.


Что за бред ?

Что ты называешь "инициализацией"  в дан.случае и для чего ее "устанавливать в ноль" при for i:=1 to ..  ?


 
Loginov Dmitry ©   (2006-08-15 15:51) [16]

> в смыле, быстродействием или ещё чем либо


Теоритически цикл обработки элементов массива
for i:=0 to count-1 ...
должен работать быстрее, чем
for i:=1 to count ...

так как для расчета физического адреса элемента в памяти требуется меньшее кол-во операций. Но в действительности разницы обычно нет.


 
ак   (2006-08-15 15:53) [17]

Что за бред ?

Что ты называешь "инициализацией"  в дан.случае и для чего ее "устанавливать в ноль" при for i:=1 to ..  ?


Да вы меня просто неправильно поняли. Thank for help!


 
ак   (2006-08-15 15:57) [18]

Теоритически цикл обработки элементов массива
for i:=0 to count-1 ...
должен работать быстрее, чем
for i:=1 to count ...

так как для расчета физического адреса элемента в памяти требуется меньшее кол-во операций. Но в действительности разницы обычно нет.


Вот я типа об этом и говорил (только своими словами :-) ).



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.038 c
1-1155372097
VladimirVladimirovich
2006-08-12 12:41
2006.09.24
tIdFtp и try...except


15-1157351611
Dima123
2006-09-04 10:33
2006.09.24
Как в XML написать hex число ?


15-1157694446
ilya39
2006-09-08 09:47
2006.09.24
Windows Server 2003 R2 пакет предустановки


2-1157531452
P
2006-09-06 12:30
2006.09.24
Как вызвать HasOverlappedIoCompleted из дельфи


2-1157274149
koha
2006-09-03 13:02
2006.09.24
Как определить в видимой части номер строки в StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский