Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вопрос про кусок кода


Автор: DarlkElfTen 13.10.2006, 17:35
вот мой вопрос:
почему он пишет "[Error] NS.pas(63): Array type required"
вот код:

Код

var
  N:array of real;
...
procedure NFS(n:real);//N First Setting
begin
  N[0]:=n;
end;
примечание: длина массива устанавливается в другой процедуре...что не такЪ?( smile 

Автор: Rennigth 13.10.2006, 17:42
у тебя и массив и параметр проседуры одинаково называються, наверное из-за этого smile

Код

var
  NDynArray:array of real;
...
procedure NFS(n:real);//N First Setting
begin
  if Length(NDynArray)  > 0 then
    NDynArray[0]:=n;
end;

Автор: Zero 13.10.2006, 17:43
Во первых, ошибка сама потому что ты имя массива и имя параметры процедуры написал одинаково.
Во вторых, в последующе ты выявиш ещё одну ошибку во время выполнения, т.к. для динамического массива N не выделена память.
Т.е. твой код будет таким:
Код

procedure NFS(r:real);
begin
  SetLength(N,1);
  N[0]:=r;
end;

Автор: DarlkElfTen 13.10.2006, 17:44
хм...ща попробую..кстати..не обязательно делать проверку..поверь мне) smile 
УРА КОД КАТТИТЪ
ща выложу если полуится програмку smile 

Автор: smartov 13.10.2006, 17:45
Паскаль не сфыу-ыутышешмую
Возможно он просто тупит. Назови параметр не n а i например. 
Код

procedure NFS(i:real);//N First Setting
begin
  N[0]:=i;
end;

Автор: DarlkElfTen 13.10.2006, 17:45
все ясно, 
Цитата

Во вторых, в последующе ты выявиш ещё одну ошибку во время выполнения, т.к. для динамического массива N не выделена память

читай примечание..длина устанавливается в лругой процедуре!

Автор: smartov 13.10.2006, 17:46
уже написали. smile

Автор: DarlkElfTen 15.10.2006, 20:23
Решил не создавать еще одной темки и пишу здесь..опять возникла проблема с массивами, проде имена не путал
вотЪ описание класса с которым надо работать(частичное)

Код

type

  TNeiron = class(TObject)
  constructor Create;//Êîíñòðóêòîð

  procedure SetF(Value:real);
  procedure ClearF;
  procedure SetD;
  //Çàùèùåííûå
  protected
    FFunction:real;
  //÷àñòíûå
  private
  //ïàáëèê
  public
    FSCount:integer;
    FT:real;
    FWeight:array of real;
    FD:real;
    property FFunc:real read FFunction write SetF;
  end;


implementation

constructor TNeiron.Create;
var
  i:integer;
begin
  inherited;
  SetLength(Self.FWeight,Self.FSCount);
  for i:=0 to Self.FSCount do
  begin
    Self.FWeight[i]:=RandomRange(-5,i*Random(3));
  end;
  Self.FT:=RandomRange(-5,3);
end;

procedure TNeiron.SetF(value:real);
begin
  Self.FFunction:=Self.FFunction+value;
end;

procedure TNeiron.ClearF;
begin
  Self.FFunction:=0;
end;

procedure TNeiron.SetD;
begin
  if Self.FFunc<=Self.FT then Self.FD:= Self.FFunc else Self.FD:=0;
end;

-с этим все в норме


и далее описание процедуры в которой идет ошибка
[Error] NMain.pas(54): Array type required

Код


...
var
  Form1: TForm1;
  NArray:array of array of TNeiron;
  NX:array of real;

const
  Number=4;
...

procedure NActive;
var
  i,j,h:integer;
begin
  for i:=0 to Length(NArray[0]) do
  begin
    NArray[0,i].FFunc:=NArray[0,i].FWeight[0,i]*NX[i];
  end;

  for i:=1 to Length(NArray) do
    for j:=0 to Length(NArray[i]) do
      for h:=0 to Length(NArray[i-1]) do
      begin
        NArray[i,j].FFunc:=NArray[i,h].FD*NArray[i,j].FWeight[i,h];
      end;
end;

с учетом что у массивов уже задана длина!!!
вот тутЪ
Код

procedure SetNS;
var
  i,j:integer;
begin
  SetLength(NArray,Number+1);
  SetLength(NX,Length(NArray[0]));
  for i:=0 to Number+1 do
  begin
    if i=0 then SetLength(NArray[i],0);
    if i>0 then SetLength(NArray[i],Number-1)
  end;
  //VoidNess
  for i:=0 to Length(NArray) do
    for j:=0 to Length(NArray[i]) do
    begin
      NArray[i,j]:=TNeiron.Create;
    end;
end;




Автор: Демо 15.10.2006, 21:21
Цитата(DarlkElfTen @  15.10.2006,  20:23 Найти цитируемый пост)
-с этим все в норме


Не в норме.
Индекс выйдет за пределы массива:

Код

 SetLength(Self.FWeight,Self.FSCount);
  for i:=0 to Self.FSCount do


То же самое везде далее.

Где определение NArray?

Автор: DarlkElfTen 15.10.2006, 21:29
установкаразмеров ??? - в отдельной процедуре...
зы: исправил
но ошибка вотЪ тутъ !!!!
 
Код

NArray[0,i].FFunc:=NArray[0,i].FWeight[0,i]*NX[i];



!!! и далее когда я из элемента массива класса вызываю массив риалов smile 
блин..реально стена...

Добавлено @ 21:29 
Код

 SetLength(Self.FWeight,Self.FSCount);
  for i:=0 to Self.FSCount do

это ябы по любому исправил бы при полной отладке)

Автор: bems 16.10.2006, 00:11
Цитата(DarlkElfTen @  15.10.2006,  20:23 Найти цитируемый пост)
NArray[0,i].FFunc:=NArray[0,i].FWeight[0,i]*NX[i];

а между тем FWeight одномерный
Цитата(DarlkElfTen @  15.10.2006,  20:23 Найти цитируемый пост)
FWeight:array of real;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)