Напомните, как передать ссылку на структуру из модуля

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Напомните, как передать ссылку на структуру из модуля

Сообщение gooroong » 06.08.2012 20:54:20

Господа, мои познания в области программирования остановились в 98м году на BP 7.0, поэтому ничего не помню, а строить надо :-)

Итак, в модуле создана структура данных, т.е. некий "стэк" с возможностью перемещения по нему назад и вперед. На начало этой структуры у меня есть ссылка, которую надо вернуть из подпрограммы.

Вот начало модуля с описанием типов и переменных (которые, по моему, видны в программе, которая вызывает модуль)
Код: Выделить всё
unit gsc;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

type

  TData=^DataRecord;
  DataRecord= record
    sigma,
    t3,
    t2,
    R,
    S,
    F,
    invZ: real;

    z,
    dz_dt3,
    dz_dt2,
    q,
    b,
    y,
    inv_z,
    g1,
    g2: array[1..3] of real;

    l:array[1..3,1..3]of real;

    up,
    down,
    sim1,
    sim2,
    sim3: pointer;
  end;

  TSim= ^SimRecord;
  SimRecord= record
    belt,
    Umdl,
    y_n,
    y_i,
    z_y:array[1..10] of real;

    n:integer;

    data: pointer
  end;

  function SimulationX( stt2, stt3, sti, sist: integer): TData;

var
  A,_A,A_: TData;
  Sim: TSim;



так вот, в программе я вызываю это вот так

Код: Выделить всё
procedure Tsimulation.CalculateClick(Sender: TObject);
var
  i, j, k: integer;
  outf: text;
begin
  B:=SimulationX(t2.Value, t3.Value, Sigma.Value, VSigma.Value);
  for i:=1 to 27 do begin
    while B^.Down<>NIL do B:=B^.Down;


и тут "while B^.Down<>NIL do B:=B^.Down;" возникает ошибка при исполнении.

структура создается верно, я в модуле запускал этот цикл и все было хорошо
gooroong
новенький
 
Сообщения: 11
Зарегистрирован: 06.08.2012 13:59:42

Re: Напомните, как передать ссылку на структуру из модуля

Сообщение Oleg_D » 06.08.2012 23:12:54

gooroong писал(а):for i:=1 to 27 do begin    while B^.Down<>NIL do B:=B^.Down;

Здесь цикл while вложен в цикл for, стало быть инициализация B ещё и внутри for должна быть.
Да и функцию надо бы посмотреть, что там внутри?
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Напомните, как передать ссылку на структуру из модуля

Сообщение gooroong » 06.08.2012 23:51:26

Модуль 500 строк выкладывать не резон :-), да и, как отдельная программа он полностью работает. выложу часть, где происходить инициализация структуры.

Код: Выделить всё
procedure Calculon;
begin

  {время последнего и предпоследнего интервала положительно и ограничено }
  t3_max:=-ln(2)/Sigma;
  t3_step:=t3_max/step_t3;
  t2_max:=-ln(2)*Sigma;
  t2_step:=t2_max/(step_t2+2);

  t3:=t3_step;

  cnt2:=1;


  while  cnt2<=step_t3 do begin

    t2:=t2_step;
    {пусть}
    timeshift:=t2_step;

    cnt3:=1;
    while cnt3<=step_t2+3 do begin

      {здесь исключаем область времени t2 при которой оно почти равно t3}
      if (t2<t3-timeshift) or (t2>t3+timeshift) then begin
        New(A);
        Find_Coord;
        New(Sim);
        {по поверхности шара}
        Sphere;
        A^.Sim1:=Sim;
        New(Sim);
        {по объему равномерное}
        Ball;
        A^.Sim2:=Sim;
        New(Sim);
        {нормальное распределени по объему шара}
        Normaly;
        A^.Sim3:=Sim;
        if _A <> NIL then _A^.Up:=A;
        A^.Down:=_A;
        A^.Up:=NIL;
        inc(cnt3);
        _A:=A;
      end;
      t2:=t2+t2_step;

    end;

    t3:=t3+t3_step;

    inc(cnt2);

  end;

  sigma:=sigma+step;

  inc(cnt1);

end;

{------------------------------------------------------------------------------}
function SimulationX( stt2, stt3, sti, sist: integer): TData;
var
  outf: text;
  i, j, k: integer;
begin

  Sigma_begin:= sist;
  step_t2:=stt2;
  step_t3:=stt3;
  step_interval:=sti;

  Prepare_Data;
  FindIntegral;

  cnt1:=1;
  _A:=NIL;

  while cnt1<=step_interval do begin

    Calculon;

  end;
end;



а вот тот самый цикл, который 27 раз исполняется (тело цикла я убил)

Код: Выделить всё
procedure Tsimulation.CalculateClick(Sender: TObject);
var
  i, j, k: integer;
  outf: text;
begin
  B:=SimulationX(t2.Value, t3.Value, Sigma.Value, VSigma.Value);
  for i:=1 to 27 do begin
    while B^.Down<>NIL do B:=B^.Down;
    case i of
      1: AssignFile(outf,'gs_sigma.out');
      далее 27 вариантов
    end;
    rewrite(outf);
    repeat
      case i of
        1: write(outf, B^.sigma:15:12, ' ');
        далее 27 вариантов
      end;
      writeln(outf);
      В:=B^.up;
    until B^.up=NIL;
    CloseFile(outf);
  end;
end;
gooroong
новенький
 
Сообщения: 11
Зарегистрирован: 06.08.2012 13:59:42

Re: Напомните, как передать ссылку на структуру из модуля

Сообщение Oleg_D » 07.08.2012 00:55:21

Во-первых, где в этой функции
Код: Выделить всё
function SimulationX( stt2, stt3, sti, sist: integer): TData;
...
end;

возвращается результат? Не вижу.
Во-вторых, инициализация переменной B неверно сделана
Код: Выделить всё
  for i:=1 to 27 do begin
    { здесь надо инициализировать B }
    while B^.Down<>NIL do B:=B^.Down;
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Напомните, как передать ссылку на структуру из модуля

Сообщение gooroong » 07.08.2012 01:07:13

вот засада :-), как я такого очевидного не заметил, а мозг сломал порядочно, спасибо!
Код: Выделить всё
function SimulationX( stt2, stt3, sti, sist: integer): TData;
...
SimulationX:=A;
end;


а по второму вопросу, там присвоение идет первой строчкой,
Код: Выделить всё
B:=SimulationX(t2.Value, t3.Value, Sigma.Value, VSigma.Value);
gooroong
новенький
 
Сообщения: 11
Зарегистрирован: 06.08.2012 13:59:42

Re: Напомните, как передать ссылку на структуру из модуля

Сообщение Oleg_D » 07.08.2012 08:33:36

gooroong писал(а):вот засада , как я такого очевидного не заметил, а мозг сломал порядочно, спасибо!

Со всеми бывает! :D
gooroong писал(а):а по второму вопросу, там присвоение идет первой строчкой,

Ага, поутру рассмотрел, что там по двусвязному списку вверх-вниз бегаете.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru