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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2022, 16:09   #1
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию Как правильно заполнить динамический массив через поля Edit1 и Edit2?

Создала двухмерный массив, первый часть массива отвечает за список всех значений, вторая часть за минимальное и максимальное значение. Вот код:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  arr: array of array of Integer;
  n:Integer = 0;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=n+1;
SetLength(arr,n,2);
arr[n,0]:= StrToInt(Edit1.Text);
arr[n,1]:= StrToInt(Edit2.Text);

end;
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
Memo1.Clear;
for i:=0 to Length(arr) do
begin
  Memo1.Lines.Add('min='+IntToStr(arr[i][0])+', max='+IntToStr(arr[i][1]));
end;
end;

end.
При попытке добавить значения (TForm1.Button1Click) через поля Edit1 и Edit2. Выводит ошибку.
Цитата:
Access violation at address 004518B3 in module 'Project1.exe'. Write at address 00000012.
Как исправить?
Катя93 вне форума Ответить с цитированием
Старый 25.04.2022, 16:12   #2
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Динамические массивы нумеруются с 0
ForenLi вне форума Ответить с цитированием
Старый 25.04.2022, 16:14   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

или
Код:
array of array 0 .. 1 of Integer;
или
Код:
SetLength(arr, n); SetLength(arr[n], 2);
Одной командой - нельзя.
macomics вне форума Ответить с цитированием
Старый 25.04.2022, 16:17   #4
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Одной командой - нельзя.
Можно
ForenLi вне форума Ответить с цитированием
Старый 25.04.2022, 16:27   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от ForenLi Посмотреть сообщение
Можно
А она разве не обнулит старые значения в массиве? У Delphi 7 такая проблема была вроде.
macomics вне форума Ответить с цитированием
Старый 25.04.2022, 16:33   #6
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

Цитата:
array of array 0 .. 1 of Integer;
В этом случае туже ошибку выводит, что и у меня. Код:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  arr:array of array [0 .. 1] of Integer;

  n:Integer = 0;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=n+1;

SetLength(arr, n);


arr[n,0]:= StrToInt(Edit1.Text);
arr[n,1]:= StrToInt(Edit2.Text);

end;
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
Memo1.Clear;
for i:=0 to Length(arr) do
begin
  Memo1.Lines.Add('min='+IntToStr(arr[i][0])+', max='+IntToStr(arr[i][1]));
end;
end;

end.
Если записать вот так:
Цитата:
SetLength(arr, n); SetLength(arr[n], 2);
То программа вообще вылетает при попытке заполнить массив:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  arr:array of array of Integer;

  n:Integer = 0;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=n+1;

SetLength(arr, n);
SetLength(arr[n], 2);


arr[n,0]:= StrToInt(Edit1.Text);
arr[n,1]:= StrToInt(Edit2.Text);

end;
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
Memo1.Clear;
for i:=0 to Length(arr) do
begin
  Memo1.Lines.Add('min='+IntToStr(arr[i][0])+', max='+IntToStr(arr[i][1]));
end;
end;

end.
Катя93 вне форума Ответить с цитированием
Старый 25.04.2022, 16:35   #7
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Катя93
Цитата:
Сообщение от ForenLi Посмотреть сообщение
Динамические массивы нумеруются с 0
ForenLi вне форума Ответить с цитированием
Старый 25.04.2022, 16:44   #8
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

arr[n,0]:= StrToInt(Edit1.Text);
arr[n,1]:= StrToInt(Edit2.Text);


У второй части массива стоит "0"
Катя93 вне форума Ответить с цитированием
Старый 25.04.2022, 16:48   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если в массиве всего n элементов, то они имеют номера от 0 до n-1.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 25.04.2022, 16:48   #10
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от Катя93 Посмотреть сообщение
У второй части массива стоит
А у первой?
ForenLi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнить динамический массив через while Shouldercannon PHP 2 12.01.2016 15:29
массив Например, R2=10, n=2 + Edit1 + Edit2 beegl Помощь студентам 1 14.01.2013 23:45
Заполнить динамический массив через while Shouldercannon Общие вопросы Delphi 1 06.05.2012 12:38
Как правильно передать через ссылку двумерный динамический массив? amerhant Общие вопросы C/C++ 2 21.04.2010 23:50