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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2010, 16:06   #1
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
Стрелка Cannot run a unit.

При запуске проги вылезает ошибка: Cannot run a unit.
Программа рабочая и ошибок быть не должно, но...
Помогите плиз.
Суть программы - работа с матрицами, все основные действия расписаны.
Код:
{$N+}
unit Matr_Op;
interface
type
  Rl=^extended;
  TArray=array[0..3000] of extended;
  Arl=^TArray;
  Mp=^Matr;
  Matr=object
    m,n:byte;
    ar:Arl;
    st:boolean;
    constructor Init(a,b:byte);
    destructor Done;
    procedure SwapL(l1,l2:byte);
    function e(l,j:byte):Rl;
    function Det:extended;
    function I:Mp;
    function NUL:Mp;
    function T:Mp;
    function Rg:byte;
    function tr:extended;
  end;

function MulD(A:Mp;b:extended):Mp;
function RExpand(A,B:Mp):Mp;
function Inv(A:Mp):Mp;
function AA(A:Mp;k0,k1:byte):Mp;
procedure SetM(var A:Mp;B:Mp);
procedure Print(A:Mp);
implementation
{------- Конструктор матрицы NxM -------}
constructor Matr.Init(a,b:byte);
begin
  GetMem(ar,a*b*SizeOf(extended));
  st:=FALSE;
  n:=a;
  m:=b
end;
{------- Деструктор матрицы NxM -------}
destructor Matr.Done;
begin
  FreeMem(ar,m*n*SizeOf(extended))
end;
{-------------- Статические методы (функции с одним аргументом) -----------}
function Matr.e(l,j:byte):Rl;    {------- Элемент матрицы }
begin
  e:=@ar^[(l-1)*m+j-1]
end;
function Matr.Det:extended;          {------- Вычисление определителя }
label 1;
var
  l,j,k:byte;
  sk,det0:extended;
  tmp:Mp;
  Sgn:boolean;
begin
  new(tmp,Init(n,n));
  Move(ar^,tmp^.ar^,n*n*SizeOf(extended));
  det0:=e(1,1)^;
  Sgn:=false;
  with tmp^ do
    for k:=2 to n do begin
      for j:=k to n do begin
        l:=k-1;
        while ((Abs(e(l,k-1)^)<1e-6) and (l<=n)) do inc(l);
        if l>(k-1) then
          if l>=n then begin
            SwapL(l,k-1);
            Sgn:=NOT Sgn
          end
          else begin
            det:=0;
            goto 1
          end;
              sk:=e(j,k-1)^/e(k-1,k-1)^;
              for l:=k to n do e(j,l)^:=e(j,l)^-e(k-1,l)^*sk;
      end;
      det0:=det0*e(k,k)^
    end;

1:Dispose(tmp,Done);
  if Sgn then det0:=-det0;
  Det:=det0
end;

function Matr.I:Mp;              {------- Единичная матрица }
var
  tmp:Mp;
  l,j:byte;

begin
  new(tmp,Init(n,n));
  for l:=1 to n do
    for j:=1 to n do begin
      if l<>j then tmp^.e(l,j)^:=0
      else tmp^.e(l,j)^:=1
    end;
  tmp^.st:=TRUE;
  I:=tmp
end;

function Matr.NUL:Mp;              {------- Нулевая матрица }
var
  tmp:Mp;
  l,j:byte;

begin
  new(tmp,Init(n,m));
  for l:=1 to n do
    for j:=1 to m do tmp^.e(l,j)^:=0;
  tmp^.st:=TRUE;
  NUL:=tmp
end;



function Matr.T:Mp;              {------- Транспонирование }
var
  tmp:Mp;
  l,j:byte;

begin
  new(tmp,Init(m,n));
  for l:=1 to m do
    for j:=1 to n do tmp^.e(l,j)^:=e(j,l)^;
  tmp^.m:=n;
  tmp^.n:=m;
  tmp^.st:=TRUE;
  T:=tmp
end;

function Matr.Rg:byte;           {------- Вычисление ранга матрицы }
var
  l,j,k,min,rang:byte;
  sz:extended;
  tmp:Mp;
begin
  min:=m;

  new(tmp,Init(n,m));
  Move(ar^,tmp^.ar^,n*m*SizeOf(extended));

  if n<m then begin
    min:=n;
    SetM(tmp,tmp^.T)
  end;

  with tmp^ do begin
    for k:=1 to min do
      for l:=1 to n do
        if l<>k then begin
          if e(k,k)^=0 then continue else sz:=e(l,k)^/e(k,k)^;
          for j:=1 to m do e(l,j)^:=e(l,j)^-sz*e(k,j)^
        end;
    rang:=0;
    for l:=1 to min do if e(l,l)^<>0 then inc(rang);
  end;
  Dispose(tmp,Done);
  Rg:=rang
end;

function Matr.tr:extended;           {------- Нахождение следа матрицы }
var
  l:byte;
  ttr:extended;

begin
  ttr:=0.;
  for l:=1 to n do ttr:=ttr+e(l,l)^;
  tr:=ttr
end;

procedure Matr.SwapL(l1,l2:byte);{------- Поменять местами строки l1 и l2 }
var
  l:byte;
  tmp:extended;

begin
  for l:=1 to m do begin
    tmp:=e(l1,l)^;
    e(l1,l)^:=e(l2,l)^;
    e(l2,l)^:=tmp
  end
end;

{-------------- Внешние процедуры и функции (не методы матрицы) -----------}

procedure SetM(var A:Mp;B:Mp);   {------- Присваивание }
begin
  if A<>NIL then Dispose(A,Done);
  if B^.st then A:=B
  else begin
    new(A,Init(B^.n,B^.m));
    Move(B^.ar^,A^.ar^,A^.n*A^.m*SizeOf(extended))
  end;
  A^.st:=FALSE
end;

function MMul(A,B:Mp):Mp;       {------- Умножение матриц }
var
  i,j,k:byte;
  tmp:Mp;
begin
  new(tmp,Init(A^.n,B^.m));
  for i:=1 to A^.n do
    for j:=1 to B^.m do begin
      tmp^.e(i,j)^:=0.;
      for k:=1 to B^.n do tmp^.e(i,j)^:=tmp^.e(i,j)^+A^.e(i,k)^*B^.e(k,j)^
    end;
  if A^.st then Dispose(A,Done);
  if B^.st then Dispose(B,Done);
  tmp^.st:=TRUE;
  MMul:=tmp
end;


 end; end;

Последний раз редактировалось Stilet; 16.02.2010 в 09:16.
sllh_111 вне форума Ответить с цитированием
Старый 14.02.2010, 16:08   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

1) Оформляйте код с помощью кнопки
2) Может покажете весь текст ошибки?
3) Может покажете строку, на которой происходят чудеса?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 14.02.2010, 16:22   #3
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

1) сори не знал, впредь буду использовать
2) текст ошибки Cannot run a unit(только это не совсем обычная ошибка, она в табличке вылетает)
3) строчку она не показывает, только ошибка в табличке и всё.
но проблема походу из-за unit(я его в проги красным выделил)
sllh_111 вне форума Ответить с цитированием
Старый 14.02.2010, 16:29   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Он(unit) один, ни к чему не подключён? Если да, то он не должен запускаться. Он только модуль с нужным кодом.
Если хотите использовать опишите его в Uses программы и вызывайте из модуля, что хотите.
Где применяете, дельфи или паскаль определить не удалось.
Alter вне форума Ответить с цитированием
Старый 14.02.2010, 16:44   #5
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

Alter
делал в Паскале. Можешь помочь доделать, а то во вторник сдавать, сам же я в этой теме плохо шарю...
sllh_111 вне форума Ответить с цитированием
Старый 14.02.2010, 16:48   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...если вы хотите, чтобы в модуле автоматически делалась инициализация и деинит при подключении к проекту, то хорошо-бы еще добавить секции:
Код:
...

initialization
 constructor Init(ваши параметры);

finalization
 destructor Done;

end.
а вообще, управляющего модуля не видно или самого проекта.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 14.02.2010, 17:03   #7
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

initialization и finalization - для чего они нужны?

ещё есть каке-нибудь варианты?

Последний раз редактировалось Stilet; 16.02.2010 в 09:16.
sllh_111 вне форума Ответить с цитированием
Старый 15.02.2010, 17:34   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Вариант только один: Unit запустить нельзя.
Создавайте "главный файл" (тот, который обычно начинается с program) вашей программы и там подключайте, используйте Unit.
p51x вне форума Ответить с цитированием
Старый 15.02.2010, 20:34   #9
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

уже встречалось 2 правильных варинат, сейчас будет третий Вы открыли ваш ЮНИТ в каком-то редаторе кода и попытались скомпилировать. Обязательно должен быть файл конфигурации проекта. Создаете НОВЫЙ проект и с помощью Ctrl + C -> Ctrl + V вставте код. Других вариантов не может быть
подпись
liljon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Run в Delphi. Reggae Общие вопросы Delphi 4 27.05.2009 08:14
Unit expected Net* Паскаль, Turbo Pascal, PascalABC.NET 2 14.05.2008 21:01
Работа с Unit SunKnight Общие вопросы Delphi 2 16.02.2008 15:45