Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2014, 21:34   #1
ArcadyTI
 
Регистрация: 17.02.2014
Сообщений: 7
По умолчанию Двумерный динамический массив

Здравствуйте!
Не могу понять где моя ошибка
Код:
<...>
var
  KolT,KolB,Max:string[3];
  x,y,k:byte;
  Itog:array of array of byte;
<...>
for x:=1 to StrToInt(KolB) do
    for y:=1 to StrToInt(KolT) do Itog[x,y]:=random(StrToInt(Max))+1;
<...>
Компиллируется без проблем, но при выполнении выбивает на последней строке с вердиктом "External:SIGSEGV".
Прошу подсказать разбирающихся, поскольку уже перерыл десяток страниц как по ошибке, так и по массивам и вроде всё правильно...
ArcadyTI вне форума Ответить с цитированием
Старый 17.02.2014, 21:40   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А где память под массив выделяется?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.02.2014, 21:43   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Так понимаю, что Max - строка из трех символов.
В приведенном коде не показано, но в некотором месте кода эти три символа вводятся.
random(StrToInt(Max)) + 1 - генерация случайного числа от 1 до Max.
Предположим, что я ввел Max равным 100. И как тогда, выбивает?
А если Max равен 300?

Обратите внимание на строку и выделенное жирным:
Код:
Itog:array of array of byte;
Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 17.02.2014, 21:56   #4
ArcadyTI
 
Регистрация: 17.02.2014
Сообщений: 7
По умолчанию

Спасибо за ответы. Сейчас немного подкорректировал (ошибка нумерации: нумерация элементов начинается с 0 у динамических массивов). Вот начало кода (в Лазарусе довольно объемный формируется начальный код, с которым ещё не разобрался):
Код:
program Generator;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp
  { you can add units after this };

var
  KolT,KolB,Max:string[3];
  x,y,k:byte;
  Itog:array of array of byte;

type

  { Generator }

  TGenerator = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
    procedure WriteHelp; virtual;
  end;

{ Generator }

procedure TGenerator.DoRun;
var
  ErrorMsg: String;
  Label m1;
begin
  // quick check parameters
  ErrorMsg:=CheckOptions('h','help');
  if ErrorMsg<>'' then begin
    ShowException(Exception.Create(ErrorMsg));
    Terminate;
    Exit;
  end;

  // parse parameters
  if HasOption('h','help') then begin
    WriteHelp;
    Terminate;
    Exit;
  end;

  Write('Kolitschestwo biletov: ');
  ReadLn(KolB);
  Write('Kolitschestvo tschisel: ');
  ReadLn(KolT);
  Write('Maximalnoe znatschenie: ');
  ReadLn(Max);
  randomize;
  for x:=0 to StrToInt(KolB)-1 do
    for y:=0 to StrToInt(KolT)-1 do Itog[x,y]:=random(StrToInt(Max))+1;
  <...>
Вводимые данные в промежутке от 1 до 99. Ошибка - постоянно.

Последний раз редактировалось ArcadyTI; 17.02.2014 в 21:59.
ArcadyTI вне форума Ответить с цитированием
Старый 17.02.2014, 22:05   #5
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,602
По умолчанию

Вам уже сказали, что не выделяется память под массив.
SetLength(itog,...);
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 17.02.2014, 22:12   #6
ArcadyTI
 
Регистрация: 17.02.2014
Сообщений: 7
По умолчанию

Спасибо огромное! Упустил из виду (странно, коль это необходимо, то почему компилятор пропустил сие недоразумение?).
ArcadyTI вне форума Ответить с цитированием
Старый 17.02.2014, 22:19   #7
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,602
По умолчанию

Выделение памяти для динамического массива на совести программиста, а не компилятора.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 17.02.2014, 22:37   #8
ArcadyTI
 
Регистрация: 17.02.2014
Сообщений: 7
По умолчанию

Немного сократил код, ввёл setlength и всё равно ругается на ту же строку:
Код:
p1:=StrToInt(KolB)-1;
  p2:=StrToInt(KolT)-1;
  p3:=StrToInt(Max);
  SetLength(Itog,p1,p2);
  for x:=0 to p1 do
    for y:=0 to p2 do Itog[x,y]:=random(p3)+1;
ArcadyTI вне форума Ответить с цитированием
Старый 17.02.2014, 23:05   #9
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,602
По умолчанию

Попробуйте протрассировать, узнав чему равны p1, p2, p3
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 17.02.2014, 23:15   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
for x:=0 to p1-1 do
    for y:=0 to p2-1 do
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двумерный динамический массив amandra Общие вопросы Delphi 16 30.07.2013 22:56
Двумерный динамический массив Sauber Помощь студентам 2 22.03.2011 08:02
Двумерный динамический массив Markuss Помощь студентам 6 07.12.2010 09:29
Двумерный динамический массив С++ UnknownVirus Помощь студентам 7 20.06.2010 01:48
Двумерный динамический массив IceExecutioner Общие вопросы Delphi 1 04.06.2009 08:41