Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.11.2013, 18:12
Discipulus Discipulus вне форума
Прохожий
 
Регистрация: 18.11.2013
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Проблемы с процедурой

Есть задание (вложенный файл)

По нему есть программа с процедурой, которая переносит неправильные(начальные) значения p[i] из процедуры вместо конечных. При этом в программе без отдельной процедуры все работает. Хотелось бы узнать в чем ошибка и как ее исправить.

Код с отдельной процедурой
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)

    StringGrid1: TStringGrid;
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


type

TA = array of array of integer;

var
  Form1: TForm1;

  a : TA;

  i,j : integer;

  p : array[1..5] of integer;

implementation

{$R *.dfm}
procedure one( p : array of integer; var a : TA);
var
i,j:integer;

begin

  p[1]:=1;
  p[2]:=1;
  p[3]:=1;
  p[4]:=1;
  p[5]:=1;


  for i :=1 to 5 do

  for j :=1 to 4 do

  if a[i-1,j-1]<0 then


  if i=1 then p[1]:=p[1]*a[i,j];
  if i=2 then p[2]:=p[2]*a[i,j];
  if i=3 then p[3]:=p[3]*a[i,j];
  if i=4 then p[4]:=p[4]*a[i,j];
  if i=5 then p[5]:=p[5]*a[i,j];

end;

procedure TForm1.Button1Click(Sender: TObject);

var
i,j,Y:integer;


begin

 SetLength(a,5,4);

  for i :=1 to 5 do

  for j :=1 to 4 do

  if Length(StringGrid1.Cells[i-1,j-1])<>0

  then a[i-1,j-1] := StrToInt(StringGrid1.Cells[i-1,j-1])

  else a[i-1,j-1] := 0;

  Y:=0;

  one(p,a);

  for i :=1 to 5 do

   begin

    for j :=1 to 4 do

     if p[i]=1 then if a[i,j]<>-1 then p[i]:=0;

     Y:=Y+sqr((6-i)-p[i]);

    end;

  Edit1.Text:=IntToStr(Y);

  for i :=1 to 5 do

  for j :=1 to 4 do

  StringGrid1.Cells[i-1,j-1]:=IntToStr(a[i-1,j-1]);


end;

end.

Без нее.
Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);


var
 a : array[1..5,1..4] of integer;

  i,j,Y : integer;

  p : array[1..5] of integer;

begin


  for i :=1 to 5 do

  for j :=1 to 4 do

  if Length(StringGrid1.Cells[i-1,j-1])<>0

  then a[i,j] := StrToInt(StringGrid1.Cells[i-1,j-1])

  else a[i,j] := 0;




  p[1]:=1;
  p[2]:=1;
  p[3]:=1;
  p[4]:=1;
  p[5]:=1;


  for i :=1 to 5 do

  for j :=1 to 4 do

  if a[i,j]<0 then


  if i=1 then p[1]:=p[1]*a[i,j];
  if i=2 then p[2]:=p[2]*a[i,j];
  if i=3 then p[3]:=p[3]*a[i,j];
  if i=4 then p[4]:=p[4]*a[i,j];
  if i=5 then p[5]:=p[5]*a[i,j];


  Y:=0;

  for i :=1 to 5 do

begin

  for j :=1 to 4 do

  if p[i]=1 then if a[i,j]<>-1 then p[i]:=0;

  Y:=Y+sqr((6-i)-p[i]);

end;

  Edit1.Text:=IntToStr(Y);



end;

end.
Изображения
Тип файла: png Безымянный.png (39.1 Кбайт, 3 просмотров)
Ответить с цитированием
  #2  
Старый 18.11.2013, 18:38
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Discipulus
Есть задание (вложенный файл)

По нему есть программа с процедурой, которая переносит неправильные(начальные) значения p[i] из процедуры вместо конечных. При этом в программе без отдельной процедуры все работает. Хотелось бы узнать в чем ошибка и как ее исправить.

Код с отдельной процедурой
Код:
.....
procedure one( p : array of integer; var a : TA);
var
i,j:integer;

begin

  p[1]:=1;
  p[2]:=1;
  p[3]:=1;
  p[4]:=1;
  p[5]:=1;


  for i :=1 to 5 do

  for j :=1 to 4 do

  if a[i-1,j-1]<0 then


  if i=1 then p[1]:=p[1]*a[i,j];
  if i=2 then p[2]:=p[2]*a[i,j];
  if i=3 then p[3]:=p[3]*a[i,j];
  if i=4 then p[4]:=p[4]*a[i,j];
  if i=5 then p[5]:=p[5]*a[i,j];

end;
.....
Потому что здесь "p : array of integer" это не обычный массив, а открытый массив - он действителен только внутри процедуры "one" - тебе нужно также как и для параметра "a" - объявить тип и указать слово "var".
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter