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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2018, 20:08   #1
Ванчезз
 
Регистрация: 17.12.2018
Сообщений: 3
По умолчанию Ошибка "exeption class EAcessViolation with message..." (Deplhi)

Вечер добрый! При решении задачи "Дана вещественная матрица размером 5х4. Упорядочить ее строки по неубыванию их наибольших элементов" столкнулся с проблемой. При попытке записать максимальные числа в каждой из 5 строк в массив MaxInCol выходит следующая ошибка: "Project Project1.exe raised exception class EAcessViolation with message 'Access violation at address 0045C4AB in module 'Project1.exe'. Write of adress 00000004'. Process stopped.". Указывает на 50 строчку кода. Помогите разобраться, пожалуйста.

Код:
unit Strings;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  max: integer;
  x: array [1..4, 1..5] of integer;
  MaxInCol: array of integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, k: byte;
begin
for i := 1 to 4 do                      // столбец
  for j := 1 to 5 do                    // строка
  begin
    if StringGrid1.Cells[i,j] <> '' then
    x[i,j] := StrToInt(StringGrid1.Cells[i,j]);
  end;
for j := 1 to 5 do
begin
  max := 0;
  for i := 1 to 4 do
    begin
      if StringGrid1.Cells[i,j] <> '' then
      if StrToInt(StringGrid1.Cells[i,j]) > max then
      max := StrToInt(StringGrid1.Cells[i,j]);
    end;
    MaxInCol[j] := max;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
  var
    i: byte;
begin
for i := 1 to 4 do
  StringGrid1.Cells[i,0] := IntToStr(i);
for i := 1 to 5 do
  StringGrid1.Cells[0,i] := IntToStr(i);
end;

end.


Последний раз редактировалось Ванчезз; 17.12.2018 в 20:11.
Ванчезз вне форума Ответить с цитированием
Старый 17.12.2018, 20:13   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А где под MaxInCol память выделена?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.12.2018, 20:18   #3
Ванчезз
 
Регистрация: 17.12.2018
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А где под MaxInCol память выделена?
В разделе объявления переменных var
Код:
var
  Form1: TForm1;
  max: integer;
  x: array [1..4, 1..5] of integer;
  MaxInCol: array of integer;
Ванчезз вне форума Ответить с цитированием
Старый 17.12.2018, 20:22   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

У тебя там динамический массив. Для него кроме описания нужно еще память и выделить, динамически
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.12.2018, 20:24   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Это обхявление. Память для динамического массива выделяется заданием размера.
p51x вне форума Ответить с цитированием
Старый 17.12.2018, 20:32   #6
Ванчезз
 
Регистрация: 17.12.2018
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
У тебя там динамический массив. Для него кроме описания нужно еще память и выделить, динамически
Цитата:
Сообщение от p51x Посмотреть сообщение
Это обхявление. Память для динамического массива выделяется заданием размера.
Действительно, помогло. Благодарю за оперативность!
Ванчезз вне форума Ответить с цитированием
Старый 18.12.2018, 09:07   #7
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

все верно, .. или почему нет результата в StringGrid1?

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j ,k: byte;
begin
for i := 1 to 4 do                      
  for j := 1 to 5 do                    
  begin
    if StringGrid1.Cells[i,j] <> '' then
    x[i,j] := StrToInt(StringGrid1.Cells[i,j]);
  end;
SetLength(MaxInCol, j); // верно выделил??
for j := 1 to 5 do
begin
  max := 0;
  for i := 1 to 4 do
    begin
      if StringGrid1.Cells[i,j] <> '' then
      if StrToInt(StringGrid1.Cells[i,j]) > max then
      max := StrToInt(StringGrid1.Cells[i,j]);
    end;
    MaxInCol[j] := max;
//    FreeMem(MaxInCol, j); // гг))
end;
beegl вне форума Ответить с цитированием
Старый 18.12.2018, 09:10   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Выделил верно, красненьким. Только чему там j будет равно в этот момент?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.12.2018, 09:19   #9
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
чему там j будет равно в этот момент?
Код:
var
  Form1: TForm1;
  max: integer;
  x: array [1..4, 1..5] of integer;
  MaxInCol: array of integer;
если выделяю max, .. ошибка. .. ( SetLength(MaxInCol, max); // выделил для max)
beegl вне форума Ответить с цитированием
Старый 18.12.2018, 09:21   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

и будущая "ошибка"
Цитата:
Дана вещественная матрица размером 5х4
x: array [1..4, 1..5] of integer;
Код:
:=StrToInt(StringGrid1.Cells[i,j])
и еще (почему неправильно считает)
Цитата:
Код:
  max := 0;
а в строке могут случиться и все до одного отрицательными (<0)
-1.4 -7.06 -5 -11.5 .... и что здесь максимум ?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка: " class EAccessViolatiossViolation with n with message 'Access violation at address 0052D1D5..." lutdan Помощь студентам 4 02.04.2011 04:29
Ошибка! exeption class raised EAccess... Davlet M Помощь студентам 0 30.01.2010 23:51
"Project Project1.exe raised class EConvertError with message'''is not a valid floating point value'." Doz1metr Помощь студентам 9 24.06.2009 19:06
Ошибка:"Project raised exception class EConvertError..." Gambit90 Помощь студентам 6 14.01.2009 14:12
Ошибка: "EAccessViolation with message..." Ravnica Помощь студентам 4 04.11.2007 20:46