Пишет Вам студент Иркутского технического университета. Я изучаю Фортран, поэтому у меня именно к Вам возник вопрос: какими средствами можно задавать массив (например F(i)) в диалоге QuikWin (DVF5.0), если размер массива i задается в диалоге с пользователем.
Заранее благодарен,
Игорь Васильков igor79@chat.ru
Должен признаться, что сам я - довольно слабый знаток современного Фортрана, потому что просто уже давно не работаю с ним.
Честно говоря, скорее, вам нужно иметь ответы на подобные вопросы.
Я работал реально с этой системой, когда там вообще не было динамических массивов, но мне казалось, что они все же появились там. Если это так, то не очень понятно - в чем проблема.
Тем не менее, я отправил ваш вопрос двум своим коллегам и вот, что они ответили:
Поэтому у него два выхода - либо написать программу с немодальным диалогом QWIN, где элементы массива задаются через управляющие элементы - EDIT CONTROL в диалогом окне в виде "ячеек" элементов (понятно, что количество таких ячеек ограничено), либо написать полноценное WIN32 приложение, а лучше MFC-приложение на C++ и связать его с вычислительными модулями, написанными на Фортране. На эту тему (С++) есть хорошая книжка David Kruglinsky Inside Visual C++ (есть перевод - Д. Круглинский Visual C++, примеры 15-16, Microsoft Press).
Честно говоря, мне оба ответа не очень понравились, так как что-то тут выглядит очень сложно. Мне кажется, что нужно просто найти, как задаются динамические массивы и все.
Если их нет, то второй ответ в принципе дает правильное направление. Мне кажется, что путь разделения приложения на диалоговую и расчетную части - стратегически более верный. При этом для каждой из частей выбирается наиболее удобный инструмент.
Дело в том, что с точки зрения пользовательского интерфейса, например Visual Basic, будет всегда сильнее, чем Фортран, а в плане расчетной части - наоборот. Применив такой ход, вы легко сделаете резервирование массивов в VB, а расчет с динамическим массивом - в Fortran.
Андрей Колесов
SUBROUTINE CommonsInit(Addres,Count) INTEGER*4 Addres INTEGER*4 Count !MS$ATTRIBUTES ALIAS: 'CommonsInit' :: CommonsInit !MS$ATTRIBUTES DLLEXPORT :: CommonsInit !MS$ATTRIBUTES REFERENCE :: Addres !MS$ATTRIBUTES REFERENCE :: Count TYPE TCommonInfo CHARACTER*32 Name INTEGER*4 Addres INTEGER*4 Size END TYPE TCommonInfo INTEGER*4, PARAMETER :: CommonsCount = 1 INTEGER*4, PARAMETER :: MainCommonSize = 100 REAL*4 MainCommonBlock(MainCommonSize) COMMON /MainCommon/ MainCommonBlock COMMON /MainCommon/MainCommonBegining TYPE (TCommonInfo), ALLOCATABLE, TARGET :: CommonInfos(:) ALLOCATE(CommonInfos(CommonsCount)) CommonInfos(1).Name = 'MainCommon'; CommonInfos(1).Addres = LOC(MainCommonBegining) CommonInfos(1).Size = MainCommonSize Addres = LOC(CommonInfos(1).Name) Count = CommonsCount END
Best regards, Digger mailto:klu@sbor.ru