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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2013, 15:34   #1
viktor178
Новичок
Джуниор
 
Регистрация: 17.06.2013
Сообщений: 5
По умолчанию Delphi7 Многомодульная программа

На форме: Panel1; Button1; Memo1;

Пытаюсь создать программу состоящую из двух модулей Unit1 и Unit2.
В главном модуле Unit1 в секции type создал пользовательский тип данных - массив(type Tmas = array[1..4] of string.
Инициализировал переменную этим типом(var mas1:Tmas и передал её в качестве параметра процедуры во второй модуль(Unit2.str(mas1), где создал процедуру обработки массива.
В главном модуле Unit1 создал вывод результата в Memo1.

При компиляции программы происходит ошибка в строке (Unit2.str(mas1):
-------------
[Error] Unit1.pas(28): Types of actual and formal var parameters must be identical
-------------
Подскажите пожайлуста, что я не так делаю?
Заранее спасибо.

Вот полный код программы с обоими модулями:

----------------------------------------------------

Модуль Unit1:

Код:
	// Unit1 главный модуль программы

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Unit2;
type
  Tmas = array[1..4] of string; // создаём пользовательский тип массив
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation
{$R *.dfm}

// главная программа
procedure TForm1.Button1Click(Sender: TObject);
var mas1:Tmas;
begin
 Unit2.str(mas1); // вызов прцедуры из модуля Unit2
 Memo1.Lines.Add(mas1[1]); 
end;
end.
Модуль Unit2:

Код:
	// Unit2 второстепенный модуль программы

unit Unit2;

interface
type Tmas = array[1..4] of string;

    // объявление прцедуры
    procedure str(var mas2:Tmas);

implementation
// прцедура
procedure str(var mas2:Tmas); // прцедура
begin
 mas2[1]:='Privet'; // присваиваем первому элементу массива
end;
end.
viktor178 вне форума Ответить с цитированием
Старый 17.06.2013, 16:59   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

опишите тип TMas ОДИН раз.
два описания - с точки зрения компилятора это РАЗНЫЕ типы!!!

Последний раз редактировалось Serge_Bliznykov; 17.06.2013 в 17:02.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.06.2013, 17:21   #3
viktor178
Новичок
Джуниор
 
Регистрация: 17.06.2013
Сообщений: 5
По умолчанию

Я так уже делал.
Создавал тип TMas только в модуле unit1, в этом случае компилятор выдавал ошибку в модуле unit2 в строке:
procedure str(var mas2:Tmas);

Текст ошибки:
[Error] Unit2.pas(6): Undeclared identifier: 'Tmas'

Я и подумал, может быть пользовательский тип нужно создавать и во втором модуле.

Сейчас ещё раз убрал строку
type Tmas = array[1..4] of string;
из модуля unit2, но бесполезно, всё равно ошибка.

Сейчас код в unit2 такой:
Код:
unit Unit2;
interface

    // объявление прцедуры
    procedure str(var mas2:Tmas);

implementation

 // прцедура
procedure str(var mas2:Tmas); // прцедура
begin
 mas2[1]:='Privet'; // присваиваем первому элементу массива
end;
end.
ошибка в модуле unit2 в строке:
procedure str(var mas2:Tmas);

Текст ошибки:
[Error] Unit2.pas(6): Undeclared identifier: 'Tmas'
viktor178 вне форума Ответить с цитированием
Старый 17.06.2013, 17:51   #4
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

допиши во втором юните uses Unit1
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 17:59   #5
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Цитата:
допиши во втором юните uses Unit1
И получим ошибку перекрестного использования модулей. Думаю лучше будет вынести описание типа массива в отдельный модуль и подключать его к другим модулям, в которых будет использовать описанный в нем тип.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 17.06.2013, 18:23   #6
viktor178
Новичок
Джуниор
 
Регистрация: 17.06.2013
Сообщений: 5
По умолчанию

Всё сделал так как посоветовал GetMax.
Программа откомпилировалась и заработала!
Огромное спасибо всем участникам форума за советы!

Вот полный код программы:

Модуль Unit1:

Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, Unit3, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}

// главная программа
procedure TForm1.Button1Click(Sender: TObject);
var mas1:Tmas;
begin
Unit2.str(mas1); // вызов прцедуры из модуля Unit2
 Memo1.Lines.Add(mas1[1]);
end;
end.
Модуль Unit2:

Код:
unit Unit2;
interface
uses
   Unit3;

    // объявление прцедуры
    procedure str(var mas2:Tmas);

implementation

 // прцедура
procedure str(var mas2:Tmas); // прцедура
begin
 mas2[1]:='Privet'; // присваиваем первому элементу массива
end;
end.
Модуль Unit3:

Код:
unit Unit3;
interface

type Tmas = array[1..4] of string; // создаём пользовательский тип массив

implementation
end.
viktor178 вне форума Ответить с цитированием
Старый 17.06.2013, 19:18   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
И получим ошибку перекрестного использования модулей
Не обязательно. Если в одном модуле ссылка на другой в разделе interface, а в другом на первый - в разделе implementation, то все будет корректно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 17.06.2013 в 19:22.
Аватар вне форума Ответить с цитированием
Старый 17.06.2013, 19:39   #8
viktor178
Новичок
Джуниор
 
Регистрация: 17.06.2013
Сообщений: 5
По умолчанию

Попробовал сделать так как посоветовал Аватар, произошла ошибка в строке
procedure str(var mas2:Tmas);
модуля Unit2.

[Error] Unit2.pas(5): Undeclared identifier: 'Tmas'

Вот полный код программы:

Модуль Unit1:

Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, StdCtrls, ExtCtrls;
type
  Tmas = array[1..4] of string; // создаём пользовательский тип массив
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}

// главная программа
procedure TForm1.Button1Click(Sender: TObject);
var mas1:Tmas;
begin
Unit2.str(mas1); // вызов прцедуры из модуля Unit2
 Memo1.Lines.Add(mas1[1]);
end;
end.

Модуль Unit2:

Код:
unit Unit2;
interface

    // объявление прцедуры
    procedure str(var mas2:Tmas);

implementation
uses
   Unit1;

 // прцедура
procedure str(var mas2:Tmas); // прцедура
begin
 mas2[1]:='Privet'; // присваиваем первому элементу массива
end;
end.
viktor178 вне форума Ответить с цитированием
Старый 17.06.2013, 19:50   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

viktor178, наоборот сделай ссылки
Код:
unit Unit1;
interface
implementation
uses Unit2;
...
unit Unit2;
interface
uses Unit1;
implementation
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.06.2013, 20:03   #10
viktor178
Новичок
Джуниор
 
Регистрация: 17.06.2013
Сообщений: 5
По умолчанию

Действительно, всё получилось, спасибо Аватар!
viktor178 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа в Delphi7!!! Mark188 Помощь студентам 2 31.03.2013 12:34
НУЖНА ПРОГРАММА НА DELPHI7 DIAMONDS Фриланс 10 13.02.2010 15:10
Нужна программа по базам данных на Delphi7 DIAMONDS Помощь студентам 4 19.01.2010 13:18
delphi7 программа после компиляции сразу закрывается fredd Помощь студентам 1 30.10.2008 14:25
Строки. Программа в Delphi7 Настена Помощь студентам 3 09.01.2008 12:33