Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330

Открыть новую тему     Написать ответ в эту тему

akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на ФОРТРАН, как общего так и конкретного характера.
Постарайтесь дать как можно больше информации о возникшей проблеме -- это в конце концов в ваших же интересах чтобы вам помогли...

прежде чем просить помощи в задании
платное решение задач

ресурсы этого топика
ссылка на подборку ресурсов, собранных посетителями этого форума
 
то, чем мы решили поделиться
ссылка на страничку программ etc собственного изготовления, которыми любезно делятся наши форумчане


если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим
 
просьба к пишущим и отвечающим все большие листинги оформлять тегом more
и отключать графические смайлики при размещении фортран-кода

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 18:11 14-01-2007 | Исправлено: akaGM, 09:47 01-03-2020
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ничего подобного, борланды исправили все свои прошлые косяки...

Код:
{$APPTYPE CONSOLE}
begin
// на ХРюшке-32
  writeln(sizeof(integer)); // 4
  writeln(sizeof(longint)); //4
  writeln(sizeof(real));     //8
  writeln(sizeof(double)); //8
end.

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 18:08 24-03-2011
simlig

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov
Если Вы про дискуссию с ESV1987, то я ее внимательно прочитал. К сожалению, проблемы есть.
 
VitaliM
Я постарался везде указать явно длины типов переменных в Фортране, проверил длины в Дельфи (double поставил) и переделал массивы при передаче в статические. Очень нужна помощь.
 
Код программы тут
 
Код Фортрана тут
А рабочая функция на Фортране выглядит так
 
Программа передает в DLL N = 2, DLL получает 2, перед вызовом odef N = 2, возвращается выполнение в Delphi, выводится окошко ОоОоо, N из Фортрана выходит = 1637248, далее или на end вылетает invalid pointer operation, или после end privileged instruction.
Не понимаю почему значение неверно передается. Мб у вас есть еще какие-нибудь идеи?

Всего записей: 4 | Зарегистр. 24-03-2011 | Отправлено: 19:51 24-03-2011
VitaliM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
ничего подобного, борланды исправили все свои прошлые косяки...  

Это все зависит от того в какой версии Дельфи работать. В последних версиях да, все изменилось, а если товарищь работает в 7 или 2006 (или Турбо). Вот  я и предположил/предложил проверять.
simlig
Твоя ошибка, при которой в процедуре odef (в Delphi) выводится 1637248, состоит в том, что в фортране в теле подпрограммы radau5solver ты объявляешь интерфейс для odef как STDCALL, но когда в качестве фактического параметра ссылка на odef уходит в подпрограмму radau5, там уже ссылка на внешнюю подпрограмму FCN не имеет атрибута STDCALL.  Добавь перед External FCN строку   !DEC$ ATTRIBUTES STDCALL :: FCN и сразу получишь значение n в процедуре odef (в Delphi) равное 2. C другими ошибками без полноты исходников разобраться невозможно. Но, думаю, как только передача параметров будет правильной, так и другие ошибки вылечатся.

Всего записей: 2182 | Зарегистр. 12-01-2005 | Отправлено: 21:26 24-03-2011 | Исправлено: VitaliM, 01:07 25-03-2011
VitaliM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
simlig
Щас только обнаружил, что ко мне идет обращение на вы, а я на ты обращаюсь.
Прошу извинить если что не так. В ветке вроде как большинство на ты обращается, привычка, да и старый я , для меня все либо ровестники, либо дети.

Всего записей: 2182 | Зарегистр. 12-01-2005 | Отправлено: 01:04 25-03-2011
simlig

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VitaliM
Вчера прописал interface подобно odef у всех FCN вместо External - все заработало. Спасибо за ответ, жаль вовремя не увидел, сэкономил бы чуть времени =) Возможно достаточно только атрибут STDCALL добавить к External.

Всего записей: 4 | Зарегистр. 24-03-2011 | Отправлено: 11:28 26-03-2011
Ingve



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov
 

Цитата:
Конкретно это Интелловский компилятор сам выдаёт в виде предупреждений (по крайней мере в VSе).

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

Всего записей: 156 | Зарегистр. 26-11-2003 | Отправлено: 17:25 26-03-2011
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ingve
Цитата:
есть ли какие-либо анализаторы фортрановского кода: посмотреть неиспользуемые переменные
Правой кнопкой мыши на Фортрановском проекте --> Properties --> Configuration Properties --> Fortran --> Diagnostics --> Language Usage Warnings --> Warn For Unused Variables

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 20:05 26-03-2011
wlbmJames

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет народ.
Возникла проблема с написанием программы.  
Задание такое: Посчитать определенный интегралл cos(x) в пределах от a до b. для различных значений шага интегрирования h=(от hmin до hmax) через dh. Исходные данные a=0, b=pi/2, hmin=pi/24, hmax=pi/6, dh=pi/24. ДЛя подсчета инегралла нужно воспользоваться формулой Ньютона-Котеса (метод трапеций). Она выглядит так: Интеграл от a до b функции f(x) = h*(0.5*f(a) + f(a+h) + f(a+2*h) +...+ f(a+(n-2)*h) + 0.5*f(a+(n-1)*h))
Где n=(b-a)/h+1
т.е. нужно взять h=hmin, поставить в формулу, посчитать, потом h=hmin + dh, чнова посчитать и т.д.
 Программа у меня вышла такая

Код:
 subroutine resh(f,a,b,h)
    g=(b-a)/h+1
    k=0.5*cos(a)
    d=1
10    k=k+cos(a+d*h)
    d=d+1
    if (d.le.g) goto 10
    f=h*(k+0.5*cos(a+d*h))
return
end
program zkr3
write (*,*) 'Введите a,b,hmax,hmin,dh'
read (*,*) a,b,hmax,hmin,dh
open (1,file='rez.txt')
write (1,2)
2    format ('Таблица значений определенного интеграла. Вариант № 6')
do h=hmin,hmax,dh
    call resh(f,a,b,h)
    write (1,3) h,f
3    format ('для шага h=',f8.4,2x,'интеграл',f8.4)
enddo
end

 Выдает каку-то фогню. Уже фиг знает сколько пытаюсь поправить, никак не выходит. Что не так? С фортраном сталкиваюсь первый раз, потому ошибка скорее всего глупая, но никак не могу понять где.

Всего записей: 9 | Зарегистр. 26-03-2011 | Отправлено: 00:20 27-03-2011
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wlbmJames
Цитата:
никак не могу понять
Для понимания введите парочку IMPLICIT NONE

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 01:27 27-03-2011
Ingve



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
 
Огномное спасибо
 
 
 
wlbmJames
 

Код:
 
program main
 
    implicit none
     
    real (8)                :: a,b
    real (8)                :: h_min, h_max, h_delta, h_d
 integer (8)                :: N_x, N_h
 integer (8)                :: i,j
    real (8)                :: F
    real (8)                :: x
    real (8), parameter     :: Pi = 3.14159265358979323846_8
 
    a = 0.0_8;    b = Pi/2.0_8
    h_min = Pi/24.0_8;  h_max =  4.0_8*Pi/24.0_8; h_delta = Pi/24.0; N_h = int((h_max-h_min)/h_delta,8)
    do i=0,N_h
        h_d = h_min + i*h_delta
        F = 0.0_8
        N_x = (b - a)/ h_d
        do j=0,(N_x-1)       ! исправленно
            x = a + j*h_d
            F = F + cos(x) + cos(x+h_d)
        end do
        F = 0.5_8 * F * h_d
        write(*,'("h_d = "I1,"/24","   F = ",F10.8)') i,F
    end do
     
 

 
написано для Fortan 90, имена переменных немного не те

Всего записей: 156 | Зарегистр. 26-11-2003 | Отправлено: 04:22 27-03-2011 | Исправлено: Ingve, 12:10 28-03-2011
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wlbmJames

Цитата:
Выдает каку-то фогню.

Телепаты, как говорится, в отпуске.
Фигню в студию (если большая - под тег more).
На взгляд прога работать должна.
Но цикл для real может барахлить.
Да и в процедуре без goto понятнее было бы.
Ну и как оно там округляется - всякое может быть - для этого типы переменных явно и указывают (implicit none).

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 12:52 27-03-2011
wlbmJames

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Телепаты, как говорится, в отпуске.  
Фигню в студию (если большая - под тег more).  
На взгляд прога работать должна.  
Но цикл для real может барахлить.  
Да и в процедуре без goto понятнее было бы.  
Ну и как оно там округляется - всякое может быть - для этого типы переменных явно и указывают (implicit none).

 Прога то работает, только выдает отрицательные значения. До этого в теле подрограммы у меня был цикл do, вместо условия и goto, тогда выдавало значения порядка 0,01. Хотя поидее ответ это примерно еденица.
 Да, попробую явно задать тип переменных, спасиб.
 
Ingve
 Спс. Посмотрю сейчас.

Всего записей: 9 | Зарегистр. 26-03-2011 | Отправлено: 19:36 27-03-2011
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wlbmJames

Цитата:
ошибка скорее всего глупая, но никак не могу понять где

Ой! Ну, оно, надо бы все переменные описать правильно... Какие из них целочисленные, какие - с плавающей запятой. Директива implicit none, которую использовал Ingve, она как раз и служит для того, чтобы не было глупых ошибок с появлением неописанных переменных в результате неправильного написания их имен, а также с распределением переменных по их типу. На втором пункте следует остановиться особо. Поскольку Вы ни одной переменной не описали, то применяются обычные (с глубокой древности) для Фортрана правила: все переменные, начинающиеся с букв от i до n являются целыми, все остальные - дробными рациональными. Но есть еще вариант дробных чисел повышенной (двойной) точности (занимающих восемь байтов) и комплексных чисел - они по умолчанию начинаются, соответственно, с буковок d и c.  
 
Hy и что же мы видим в Вашей программе? Во-первых, в преамбуле есть некое уравнение
Цитата:
Где n=(b-a)/h+1
. Ну, по логике: это (похоже) число промежутков в заданном интервале от a до b. Это число - целое, переменная с именем n вполне к месту. Но: почему +1? Хотим число промежутков - значит, берем -1. Кроме того, так как a и b - рациональные числа, справа должно получиться рациональное число. Которое потом округляется до целого n, с явной потерей точности. Если, конечно, мы не прописали оператора явного перевода типа вроде real. Значит, вместо n мы должны иметь рациональную переменную. Но она, как бы, тогда теряет физический смысл, ибо число промежутков - целочисленная величина. Как быть?  
 
И это (несколько сомнительное) уравнение затем почти один в один переведено в фортрановский код. То есть, в subroutine resh есть строчка g=(b-a)/h+1. Тут как бы вопрос о том, целочисленная эта переменная или нет, временно снимается, ибо переменная g уж точно - по определению с плавающей запятой, но затем этот вопрос встает, но несколько лениво. Ибо: нужна эта переменная только для сравнения с некой переменной d. С которой проблем гораздо больше.
 
И так, во-вторых. Имеем в программе строчку d=1. Что это означает? Что некой переменной двойной точности (да, ведь она начинается с буковки d!) присваивается значение единицы. Вполне себе целочисленное. Далее, в той же подпрограмме resh эта переменная увеличивается на 1: d=d+1, т.е. она ведет себя абсолютно как целочисленная переменная. Наверно, так ее и следовало объявить? Но: насколько законно тогда сопоставление с ней действительного числа g?
 
Ну, еще в качестве мелочной придирки. На уровне придирок компилятора, который не хочет по-существу разобраться в предложенной программе, и начинает свои мелочные приколы. Вот у Вас заявлен цикл:  

Цитата:
do h=hmin,hmax,dh  
    call resh(f,a,b,h)  
    write (1,3) h,f  
3    format ('для шага h=',f8.4,2x,'интеграл',f8.4)  
enddo

Циклы с нецелой переменой цикла давно уже исключены из стандарта Фортрана, ибо они не гарантируют их правильного окончания. Поскольку числа с плавающей запятой хранятся в компьютере в приближенном виде. А не в точном, как целые. Целочисленную переменную цикла надо использовать, как сделано у Ingve. И KChernov про это совершенно справедливо написал. Тем не менее, даже все эти ошибки в совокупности вряд ли приведут к принципиально неверному результату - разнице на порядки. Что-то тут другое реально пакостит.
 
PS: Посмотрел вариант, который предложил Ingve. На мой взгляд, должно в основном работать. Нехороший момент - что число промежутков (?) N_x определяется фактически как у Вас, через +1 - просто цикл начинается с нуля. Опять же, выполняемое при этом округление рационального числа до целого (N_x = (b - a)/ h_d- не вполне однозначно понимаемая операция. Тем не менее, вроде, проколов на порядки не будет. Да и в Вашей программе, не смотря ни на что, я подобного криминала не нашел...

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 10:02 28-03-2011 | Исправлено: XPEHOMETP, 10:35 28-03-2011
Ingve



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPEHOMETP

Цитата:
 
PS: Посмотрел вариант, который предложил Ingve. На мой взгляд, должно в основном работать. Нехороший момент - что число промежутков (?) N_x определяется фактически как у Вас, через +1 - просто цикл начинается с нуля. Опять же, выполняемое при этом округление рационального числа до целого (N_x = (b - a)/ h_d- не вполне однозначно понимаемая операция. Тем не менее, вроде, проколов на порядки не будет. Да и в Вашей программе, не смотря ни на что, я подобного криминала не нашел...

 
Мне тоже не нравится такой вариант округления, но ничего лучшего я не смог придумать. А использовать переменную real в качестве счетчика цикла не рекомендуют по стандарту, как уже отмечалось.
 
Относительно границ интегрирования - таки есть ошибка. Если расписывать интеграл через сумму по методу трапеций, то f(a) + f(b) учитываются по одному разу, а промежуточные значения по два. Поэтому в цикле стоит сумма f(i) + f(i+1). Поэтому границы должны быть от 0 до (N_x-1).

Всего записей: 156 | Зарегистр. 26-11-2003 | Отправлено: 11:33 28-03-2011 | Исправлено: Ingve, 12:08 28-03-2011
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Опять же, выполняемое при этом округление рационального числа до целого (N_x = (b - a)/ h_d- не вполне однозначно понимаемая операция.  

Имхо тут постановка задачи неправильная:
1. Если уж надо поварьировать (как в задаче) - почему бы варьировать не h_d, а собственно число шагов разбиения;
2. Если уж надо варьировать именно шаг - надо сделать его адаптивным: то есть не просто округлить число шагов до ближайшего целого, но и после этого пересчитать шаг, с которым будет делаться расчёт интегральной суммы так, чтобы N_x == (b - a)/ h_d;
3. А вообще надо плясать со стороны решения самой задачи. Т.е. с обеспечения точности вычисления интеграла. По которой собственно этот шаг и должен вычисляться (для разных методов свои формулы, которые правда тоже придётся вычислять приближённо). Ну или использовать критерий расстояния между соседними интегральными суммами (или ещё какой критерий сходимости), в которых число шагов разбиения отличается в определённое число раз (в 2 например). Но тогда приходим к 1).

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 12:00 28-03-2011 | Исправлено: KChernov, 12:02 28-03-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а что вы зациклилилсь на цикле :) со счётчиком?
 
hcurr = hmin
do while (hcurr < hmax)
...
   hcurr =  hcurr + hstep
...
enddo

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 12:01 28-03-2011 | Исправлено: akaGM, 12:02 28-03-2011
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Мы не зациклились.
Просто концептуально правильнее оперировать номером шага.
Хотя в конкретном этом случае твой подход проще.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 12:04 28-03-2011
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
do while (hcurr < hmax)

Дык, оно можно верхний предел интегрирования запросто проигнорировать! Пофигу, если шаг очень мелкий. А если нет?

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 12:57 28-03-2011 | Исправлено: XPEHOMETP, 12:57 28-03-2011
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кстати да, есть ещё 1 вариант:
4. Изменить формулу так, чтобы один из шагов (первый или последний например) делались не по полному шагу, а по остатку.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 13:13 28-03-2011
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov

Цитата:
Изменить формулу так, чтобы один из шагов (первый или последний например) делались не по полному шагу, а по остатку.

На счет последнего шага - вполне! А что? Формула трапеций постоянного шага не требует, это не формула Симпсона (Гомера?).

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 13:19 28-03-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru