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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2008, 13:50   #1
Albert2008
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 26
Подмигивание Работа с многомерными массивами в функции. Очередной вопос начинающего (#005)

День добрый.
Ни в одном из прочитанных мною мануалов не было написано, что в процедуре нельзя работать с массивами. А потому решил написать пример (под ту программу, которую пытаюсь написать). Подскажите пожалуйста, почему возникает ошибка и что делать ?)))

unit Unit1;

interface

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

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

var
Form1: TForm1;
s,e,f :integer ;
mas1 : array of array of integer ; //Задаётся двумерный массив

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Setlength(mas1, 50 , 50 ); //Устанавливается его размерность.
end;

function rrr ( var e,f,rrr :integer):integer ;// вот тут ошибка Identifier redeclared 'mas1'
// тут фомирутеся функция. var - было выбрано потомучто все эти
// переменные являются как входящими, так и исходящими.
begin
e:=2;
f:=4;
mas1[e,f]:= f+1 ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := IntToStr(mas1[5,5]);
end;

end.

Возможно ли также в процедуре задавть различные цыклы с двумерными массивами ?

С уважением к Вам. Альберт.

Последний раз редактировалось Albert2008; 11.08.2008 в 13:57.
Albert2008 вне форума Ответить с цитированием
Старый 11.08.2008, 13:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Потому что ты в корне неверно создал пример
во-первых желательно обьявлять процедуру так:
Код:
type ab=array of array of integer ;
...........
function rrr ( var e,f:integer;r:ab):integer ;
Во-вторых: проверять габариты массива:
Код:
if (high(rrr)<=e)and((high(rrr[e])<=f)) then
 rrr[e,f]:= f+1 ; // Типа такого
I'm learning to live...

Последний раз редактировалось Stilet; 11.08.2008 в 14:04.
Stilet вне форума Ответить с цитированием
Старый 11.08.2008, 14:22   #3
Albert2008
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 26
По умолчанию

procedure TForm1.FormCreate(Sender: TObject);
begin
Setlength(mas1, 50 , 50 );
end;

function rrr ( var e,f :integer; mas1 :ab):integer ;

begin
if (high(mas1)<=e) and((high(mas1[e])<=f)) then
begin

e:=2;
f:=4;
mas1[e,f]:= 5 ;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := IntToStr(mas1[5,5]);
end;

end.



Ошибок вроде нету, и код скомпилировался но вот в результате он почему-то выводит "0" вместо "5".
Ещё есть надпись: Return value of function 'rrr' might be undefined.

Подскажите пожалуйста - чего ещё не хватает ?
Изображения
Тип файла: jpg masinfunc.jpg (15.2 Кб, 140 просмотров)

Последний раз редактировалось Albert2008; 11.08.2008 в 15:01.
Albert2008 вне форума Ответить с цитированием
Старый 11.08.2008, 14:43   #4
Albert2008
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 26
По умолчанию

Кстати если перед
Edit2 вставить строку
rrr(e,f,mas1); типа вызов функции, то он и в неё поставит ошибку....
Albert2008 вне форума Ответить с цитированием
Старый 11.08.2008, 15:58   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
то он и в неё поставит ошибку....
Которая настолько секретна что ее текст нельзя даже шепоом написать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2008, 16:11   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
e:=2;
f:=4;
mas1[e,f]:= 5 ;
Задаем значение ячейки[2,4].
Цитата:
Edit2.Text := IntToStr(mas1[5,5]);
и хотим чтобы оно чудесным образом очутилось в ячейке [5,5];
puporev вне форума Ответить с цитированием
Старый 11.08.2008, 16:17   #7
Albert2008
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 26
По умолчанию

1.
При добавлении
rrr(e,f,mas1);
перед Edit2
Возникает ошибка: Return value of function 'rrr' might be undefined

2. Сымсле не в том что
e:=2;
f:=4;
mas1[e,f]:= 5
или
Edit2.Text := IntToStr(mas1[5,5]); написать.
Даже если написать
e:=2;
f:=4;
mas1[e,f]:= 5
Все равно нифига не будет.
Вопрос в том - почему он это выходное Return value of function 'rrr' считает каким-то не тем ?И как сделать , чтобы было тем.
Albert2008 вне форума Ответить с цитированием
Старый 11.08.2008, 16:34   #8
Банзай
Пользователь
 
Аватар для Банзай
 
Регистрация: 21.08.2007
Сообщений: 89
По умолчанию

Return value of function 'rrr' might be undefined
- значит что функция должна возвращать значение, если это не так, то это процедура.
з.ы. перезалей masinfunc.jpg если ещё нужно, потому как там без бинокля не разобраться
подписываюсь

Последний раз редактировалось Банзай; 11.08.2008 в 16:38.
Банзай вне форума Ответить с цитированием
Старый 11.08.2008, 16:44   #9
Albert2008
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 26
По умолчанию

В том-то и фишка. Что функция должна возвращать значение.Для этого и применятеся var. А именно значение это лежит в mas1[e,f]

На картинку забей. Она не в тему.
Albert2008 вне форума Ответить с цитированием
Старый 11.08.2008, 16:47   #10
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Чтобы функция возвращала результат, нужно не var, а волшебное слово result. Примерно так:
Код:
type ab=array of array of integer ;
var
  Form1: TForm1;
  mas1:ab;
implementation

{$R *.dfm}
function rrr ( e,f :integer):integer ;
begin
result:=sqr(mas1[e,f]) ;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
Setlength(mas1, 50 , 50 );
for i:=0 to length(mas1)-1 do
for j:=0 to length(mas1)-1 do
mas1[i,j]:=i*j;
Edit1.text:=inttostr(rrr(5,5));
end;

end.
puporev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с массивами mager JavaScript, Ajax 5 27.08.2008 22:02
Stringgrid, Procedure, cells[m,n]:=DynMas[a,b]. Очередной вопрос начинающего (#003) Albert2008 Компоненты Delphi 4 04.08.2008 12:00
Procedure,function,Stringgrid (#004) Очередной вопрос начинающего. Albert2008 Компоненты Delphi 4 01.08.2008 21:30
Stringgrid, cells[m,n] и двумерные массивы.(#002) Очередной вопрос начинающего. Albert2008 Компоненты Delphi 4 28.07.2008 19:02
Работа с массивами в C# MaskEdit Общие вопросы .NET 3 17.05.2008 17:59