Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

передача массивов в функцию в виде параметров   Найти похожие ветки 

 
jose   (2006-11-12 20:36) [0]

У меня есть 2 модуля. Form1 и Form2.

Если в модуле Form1 описать массив a: array of integer, а в модуле Form2 описать процедуру Func(b:array of integer), то следующий вызов:
Form2.Func(a) - срабатывает, никаких ошибок нет.

А теперь я хочу передать в другой модуль массив записей - и тут начинаются непонятные проблемы..

Делаю в модуле Form1:
type
 rec=record
  id:integer
 end;
...
var
a:array of rec;

а в модуле Form2 пишу:
type
 rec=record
  id:integer;
 end;
...
procedure func(b: array of rec);

Так вот, когда делаю вызов из модуля  Form1:
Form2.func(a);
То он начинает ругаться на несовместимость типов ([Error] Unit1.pas(33): Incompatible types: "Array" and "dynamic array"). В чем причина и как быть?


 
jose   (2006-11-12 20:40) [1]

Если в обоих модулях описать такой тип:
 atype=array of rec
то ошибка получается просто: [Error] Unit1.pas(34): Incompatible types, хотя типы на вид совершенно идентичны.

В общем, вопрос - как передать массив из одного модуля в другой? Хотелось бы обойтись без глобальных переменных (т.е. передавать в функцию-метод)


 
Palladin ©   (2006-11-12 20:41) [2]

так написали же в чем причина... или с переводом проблеммы?


 
jose   (2006-11-12 20:42) [3]

Palladin, я не понимаю, почему они несовместимые и как их сделать совместимыми....


 
sniknik ©   (2006-11-12 20:44) [4]

> procedure func(b: array of rec);
это не совсем массив определен, это открытый список параметров (открытый массив) для передачи переменного числа параметров

сделай

type
rec=record
 id:integer
end;

Ta = array of rec;
...
var
 a: Ta;

и в процедуре определяй также через Ta.
procedure func(b: Ta);


 
KilkennyCat ©   (2006-11-12 20:44) [5]

вынести все вообще в отдельный модуль, все функции работы с ним туда же, работать только с результатами. масляное масло иначе.


 
Palladin ©   (2006-11-12 20:45) [6]

хм... в обоих модулях... правильный шаг, направленье не то... так типы одинаково заданные, но объявленные в разных модулях считаются разными типами, ты уж или в одном или в другом... определяйся...


 
Kolan ©   (2006-11-12 20:46) [7]

> Делаю в модуле Form1:
> type
> rec=record
>  id:integer
> end;


> а в модуле Form2 пишу:
> type
> rec=record
>  id:integer;
> end;


А зачем в обоих модулях писать? Хоть это и одинаковые типы(для тебя) компилятор их отличает...

ЗЫ
 Или я вопрос не понял..


 
Ketmar ©   (2006-11-12 20:51) [8]

>[6] Palladin(c) 12-Nov-2006, 20:45
>.. так типы одинаково заданные, но объявленные в разных
>модулях считаются разными типами
да даже в одном -- всё равно разными будут. потому что Вирт так решил. %-)


 
Palladin ©   (2006-11-12 20:55) [9]

эээ... как это в одном, в смысле в случае локальных типов? ) так оно сам бог велел :) области видимости то разные... а два одноименных типа в интерфейсе так это... эээ... на этом у меня мысли заканчиваются.


 
jose   (2006-11-12 20:56) [10]

sniknik,
>сделай

>type
>rec=record
> id:integer
>end;

>Ta = array of rec;
>...
>var
> a: Ta;

>и в процедуре определяй также через Ta.
>procedure func(b: Ta);

так и делал - дельфи считает, что это различные типы (вернее - несовместимые).

KilkennyCat,
ну у меня в одном модуле получается результат (массив значений), а в другом хочу по нему график сделать.

Palladin,
ок, наверное надо тип в одном модуле описать, а переменные принадлежащие этому типу - в разных. Таким образом и без глобальных переменных обойдусь (разве что глобальный тип)). Сейчас попробую.


 
jose   (2006-11-12 20:57) [11]

sniknik, прошу прощения, наверное не так Вас понял. Вы скорее всего дело посоветовали (т.е. только в одном модуле описывать тип)


 
Palladin ©   (2006-11-12 20:58) [12]


> наверное надо тип в одном модуле описать


> разве что глобальный тип)


самле правильное... хотя конечно по обстановке...


 
Плохиш ©   (2006-11-12 21:01) [13]

Интересно, когда дети начнут читать хотя бы описания языка, на котором пытаются что-то своять?


 
jose   (2006-11-12 21:01) [14]

Сделал, вроде работает (всем спасибо).

Кстати, если использовать динамический массив (т.е. без указания размера), то как к нему потом обращаться? Попробовал сделать inc(s[1].id) в своей функции, так он с access violation вылетел. А если описать тип s как array [1..2] of rec - тогда всё ок.

Надо во время работы как-то размер задавать?


 
Palladin ©   (2006-11-12 21:03) [15]

представь себе да, читай литературу по поводу SetLength...


 
jose   (2006-11-12 21:03) [16]

Плохиш, это банально - в F1 и описание языка посылать (мне может срочно надо написать что-то). Я спросил глупый вопрос (сам сейчас понял, что он глупый) - но добрые люди помогли. Им за это воздастся :)


 
jose   (2006-11-12 21:03) [17]

Palladin, ок :)


 
Ketmar ©   (2006-11-12 21:19) [18]

>[9] Palladin(c) 12-Nov-2006, 20:55
>а два одноименных типа в интерфейсе так это... эээ... на
>этом у меня мысли заканчиваются.
так кто сказал "одноимённые"? я сказал "одинаковые" (визуально, окромя имён). %-)

>[16] jose 12-Nov-2006, 21:03
>Плохиш, это банально - в F1 и описание языка посылать
да-да-да. читать -- это по теперешним временам немодно! совсем ты, Плохиш, от жизни отстал.


 
Palladin ©   (2006-11-12 21:27) [19]


> [18] Ketmar ©

ааааа... :) ну, я считаю что, пр. Вирт был абсолютно прав.


 
Ketmar ©   (2006-11-12 21:29) [20]

>[19] Palladin(c) 12-Nov-2006, 21:27
>ааааа... :) ну, я считаю что, пр. Вирт был абсолютно прав.
так и я с ним согласен. %-)


 
Anatoly Podgoretsky ©   (2006-11-12 21:42) [21]

> jose  (12.11.2006 21:03:16)  [16]

> мне может срочно надо написать что-то

Ой, а зачем срочно?
Быстро только кошки родятся.


 
Anatoly Podgoretsky ©   (2006-11-12 21:43) [22]

> Ketmar  (12.11.2006 21:19:18)  [18]

> Плохиш, от жизни отстал.

Не переживат он этого.


 
Anatoly Podgoretsky ©   (2006-11-12 21:43) [23]

> Ketmar  (12.11.2006 21:29:20)  [20]

А что есть не согласные, ну так Вирту это пофигу.


 
Palladin ©   (2006-11-12 21:51) [24]


> [23] Anatoly Podgoretsky ©

нет ну могут найтись идеологические противники... мне по крайней мере встречались... это что то вроде фимисток... "Все типы должны быть равноправными!", "Даешь корень из "сто сорок четыре"!"


 
Ketmar ©   (2006-11-12 22:01) [25]

>[22] Anatoly Podgoretsky(c) 12-Nov-2006, 21:43
>Не переживат он этого.
что-то замолчал Плохиш... неужели наелся варенья с горя и спать лёг в слезах???


 
inkvizitor ©   (2006-11-13 09:03) [26]

Плохиш ты советы дельные давай, а не унижай начинающих. Не красиво как то получается. Там же написано(наверху) профи будьте снисходительны к новичкам:-))



Страницы: 1 вся ветка

Текущий архив: 2006.12.03;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.068 c
9-1139377193
Серый
2006-02-08 08:39
2006.12.03
Какой вид боевой системы выбрать


2-1163243363
lsvit
2006-11-11 14:09
2006.12.03
TList


2-1163044004
TMemoUser
2006-11-09 06:46
2006.12.03
Можно ли в TMemo сделать подчёркивание волнистой линиией как в Во


15-1163707107
oxffff
2006-11-16 22:58
2006.12.03
Какое будущее у языка Object Pascal?


15-1163336735
nordic3
2006-11-12 16:05
2006.12.03
Музыкальный диск и магнитофон