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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

akaGM

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

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

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


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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А n, часом не становиться больше 170?

Всего записей: 107 | Зарегистр. 29-05-2007 | Отправлено: 15:22 12-01-2011
Damien2106

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вроде бы нет. я использовал строку в которой даже 40 символов нету. поэтому врятли. хотя идея хорошая. препод конечно не будет проверять на строках больших 170, но это в принципе можно считать ошибкой потому что n меняется до длины строки, а она может и привысить норму.
 
мне в принципе в самой программе не надо ничего вроде менять. просто скажите хотя бы что это за ошибка которую он выдает в черном окне

Всего записей: 9 | Зарегистр. 12-01-2011 | Отправлено: 15:52 12-01-2011
plazmon



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

Цитата:
Program exception - array bounds exceeded

По русски - индекс массива вышел за границу.  
Почему - сходи не видно надо разбиратся. Если просто нужно сдать задачу - попробуй в опциях компилятора отключить проверку индексов. Как сделать это для CFV я не знаю.
 
Добавлено:
Стоп! Что это?

Код:
 
  sp = 0  
      do i = 2, n  
        if (p(i)-p(i-1)-1<=l) then  
               s(sp:sp+p(i)-p(i-1)) = s(p(i-1):p(i))  
               sp = sp+p(i)-p(i-1)  
            endif          
    end do
 

При первом проходе у тебя sp=0 и ты копируешь в s(0:чтото_там), что естественно выходит за границу, т.к. в Фортране, по умолчанию все индексы начинаются с 1

Всего записей: 107 | Зарегистр. 29-05-2007 | Отправлено: 16:15 12-01-2011 | Исправлено: plazmon, 16:21 12-01-2011
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Damien2106
 
1. Задай при компиляции параметр
/nocheck:bounds
тогда проверка выхода за пределы массива будет отключена
2. Даже если после этого программа заработает, такая диагностика говорит о том, что есть ошибка в логике программы, которую хорошо бы исправить.

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 16:33 12-01-2011
Damien2106

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну помогите плз. мне завтра зачет надо получить. я уже 2 дня с этой задачей сижу
 
Добавлено:
а как задать параметр при компиляции??? я ни разу так не делал просто.
исправлять естественно надо, только проблема в том что я даже не понимаю как он выходит за границу. вроде бы все как надо, даже n поставил такой чтобы не выходил. но не в этом дело видимо. а так определить тоже не выходит

Всего записей: 9 | Зарегистр. 12-01-2011 | Отправлено: 16:38 12-01-2011
plazmon



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

Код:
    character(1000) s  
    integer i, n, l, p(170), sp  
    open (23,file='1.txt')      
    read(23,'(a)'), s      
    n=1  
    p(1)=1  
    do i = 1, len_trim(s)  
       if (s(i:i) == ' ') then  
          n = n + 1  
          p(n) = i  
       endif  
    enddo  
    n = n + 1  
    p(n) = len_trim(s) + 1  
      print '(a\)', 'l='  
    read '(i)', l  
      sp = 1  
      do i = 2, n  
        if (p(i)-p(i-1)-1<=l) then  
               s(sp:sp+p(i)-p(i-1)) = s(p(i-1):p(i))  
               sp = sp+p(i)-p(i-1)  
            endif          
    end do  
      print '(a)', s(1:sp)  
      read *  
 
 


Всего записей: 107 | Зарегистр. 29-05-2007 | Отправлено: 16:55 12-01-2011
Damien2106

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
извини, не заметил. привык что сообщения не добавляются а идут подряд. и не увидел поэтому твоего
 
Добавлено:
кстати да. спасибо большое. я что-то не обратил внимания. только теперь один косяк. он первую букву всё равно захватывает. допустим в строке "dfkgjh dwe qweqqet" при l = 2 он выдает d. и при l=5 он первое слово в котором 6 букв (как видно) тоже почему-то не удаляет. как вариант можно  
 
Код:
sp = 0  
      do i = 2, n  
        if (p(i)-p(i-1)-1<=l) then    
               s(sp+1:sp+p(i)-p(i-1)) = s(p(i-1):p(i))    
               sp = sp+p(i)-p(i-1)  
            endif          
    end do

теперь при 1 и 2 всё нормально, а при 5 так и остается
 
Добавлено:
ну что. кто-нибудь знает как исправить этот недочет
 
Добавлено:
всё. я сделал. вопрос закрыт

Всего записей: 9 | Зарегистр. 12-01-2011 | Отправлено: 16:59 12-01-2011
Lapochka ili Chai



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, есть ли в современном ФОРТРАНе способ программу, работающую с каким-то пользовательским типом данных (т.е. вроде как классом),  крепко-накрепко пришить именно к этому типу данных?
 
Ведь если в модуле M у меня объявлены типы данных A, B, С и в секции contains описаны программы F1, F2, F3, то совершенно неясно, к каким из этих типов они относятся (да они могут и не относиться к ним).

Всего записей: 847 | Зарегистр. 27-11-2003 | Отправлено: 07:38 13-01-2011
aleksiu



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Lapochka ili Chai
 
Возможно Ссылка - это Вам поможет

Всего записей: 8 | Зарегистр. 10-12-2006 | Отправлено: 08:32 13-01-2011
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Lapochka ili Chai
Bы хоть четко сформулируйте, чего хотите. Чтобы описанный в модуле тип данных работал именно с конкретной программой из этого модуля? Что-то не понял. Указываете в соответствующей подпрограмме этот тип, в чем дальше проблемы? Другие проги из этого модуля нагло стремятся подключиться к этому типу данных? Или основная программа стремится подгадить, ибо под именами A, B, С в ней уже что-то другое прописано? Так имена поменяйте!
 
ЗЫ: При некотором размышлении, не понял еще больше. У Вас есть некий модуль с описанием переменных (пользовательского типа) и подпрограмм, одна из которых использует этот тип? Описанный прямо в этом модуле? Боюсь, не будет работать в принципе. Возможно, ошибаюсь, но должно быть так: мухи отдельно, пиво отдельно. В отдельном модуле описываете пользовательский тип, в другом модуле пишете подпрограммы, и в нужной (из них) указываете: используется такой-то модуль (где описан пользовательский тип).
 
PPS: Ну вообще-то да, по логике... Вы пишете модуль с объявлением переменных + подпрограммы, и подключаете его к основной программе. Это означает: Вы объявили некий пользовательский тип в основной программе, и только в ней, а подпрограммы о нем ни фига знать не будут. Использование implicit none спасет отца русской демократии от подобных ошибок!

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 15:54 13-01-2011 | Исправлено: XPEHOMETP, 16:24 13-01-2011
Lapochka ili Chai



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPEHOMETP
Имелись в виду несколько вещей.  
Первое: для начала надо, чтобы среда знала, что данная программа относится к данному типу.
Второе, чего хотелось бы, чтобы среда могла подсказать, какие функции я могу вызвать для типа, который сейчас в данный момент под курсором.  
 
А почему нет? Ведь в сиобразных языках-то это есть.
Может, и в ФОРТРАНе есть? Я не знаю.
 
aleksiu
Спасибо, полиморфизм это здорово, я как раз собирался его освоить.
То есть мы помещаем в наш тип указатель на наш же абстрактный интерфейс,  описанный чуть ниже, а дальше я пока не успеваю уследить за руками.. так, появляется незнакомое мне слово CLASS (ага, читаем: он как раз используется для полиморфизма),.. ну в общем, надо думать. Сама программка вроде понятна: устанавливаем указатель на кошку, вызывается кошка, на собаку -- собака. С ктулху пока не понял.. а, ну да, тут почти то же самое, только процедура не в модуле, а внешняя. Ладно, спасибо, буду дальше изучать.
 
Ну, вообще-то уж говоря, в книжке Адамса и других по ФОРТРАНу-2003 приведён более простой пример, по крайней мере он без интерфейсов.
 

Всего записей: 847 | Зарегистр. 27-11-2003 | Отправлено: 07:48 14-01-2011 | Исправлено: Lapochka ili Chai, 09:19 14-01-2011
XPEHOMETP

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

Цитата:
Имелись в виду несколько вещей.  
Первое: для начала надо, чтобы среда знала, что данная программа относится к данному типу.
Второе, чего хотелось бы, чтобы среда могла подсказать, какие функции я могу вызвать для типа, который сейчас в данный момент под курсором.  

Первое - таки надо, чтобы данная подпрограмма знала, что ей надо обрабатывать данный конкретный пользовательский тип. Очень часто убеждаюсь, что модули и прочие примочки нагло запутывают юзеров. Уровень Фортрана-77 просто оптимален для понимания. Лишних вопросов, во всяком случае, не возникает. Честно говоря, я свои проги так примерно в Ф77 и пишу, правда, с использованием динамических массивов, и циклов do...end do. Типа, в "свободном формате", но caм текст программы только с 7-й позиции, или еще дальше. А как иначе выделить численные метки? Для оператора continue, к примеру? Да, я фанат старых циклов с меткой, и циклы do...end do использую только в самых примитивных случаях, когда пара операторов в теле цикла. Ф-77 - он, однако, до сих пор рулит!
 
Ну, конкретно, для данного случая... Да наплюйте Вы на все эти модули, и ручками пропишите этот самый пользовательский тип конкретно в данной подпрограме. И только в ней. И все будет гарантированно работать. А все эти модули, как я уже говорил, только для затуманивания мозгов не вполне уверенных в себе юзеров. Не вполне понимаете, как эта фича работает - значит, обходитесь без нее, еще Ф77 позволял вполне корректно (без всякого там пресловутого спагетти-кода) выстроить алгоритм. Даунгрейд еще ни кому не мешал.  
 
Ну, на счет "второго", Про подсказки среды. Это уже зависит от возможностей конкретного компилятора и IDE. Укажите, с чем Вы работаете, тогда, может, кто-нибудь что-то дельное подскажет.

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 12:28 14-01-2011
anvivar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте!
Господа, вот такая проблема: в QuickWin – программе при запуске только под Windows7 после диалога ввода данных (dlginit…) отказывается работать мышь – даже без всяких registermouseevent, просто программу закрыть за «крестик» справа вверху не удается.
 Под WindowsXP, Vista, 95, 98 этой проблемы нет.
 Раньше грешил на старую версию фортрана (Dec-5, Compaq-6), а на днях Intel-11 поставил, и то же самое.
 Да, если вместо своего диалога вызывать стандартный (ввод имени файла getopenfilename) – все работает нормально. Но нужен свой.
Не посоветуете? Если надо, проект вышлю (скажите, куда) – маленький, все лишнее убрано.

Всего записей: 6 | Зарегистр. 23-01-2009 | Отправлено: 20:59 14-01-2011
bubanoid



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для сдвига элементов массива пробую использовать встроенную ф-цию EOSHIFT:

Код:
break(:,2)=EOSHIFT(break(:,2), SHIFT = n)

Размер первого измерения действительного массива break порядка 10000, второго измерения порядка 2. Выполняется этот сдвиг невероятно долго. Если выполнять сдвиг руками (написать свою процедуру) - то выполняется сдвиг в 1000 раз быстрее. Может у кого-то есть соображения, в чём дело?

Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 15:28 15-01-2011 | Исправлено: bubanoid, 15:30 15-01-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid
я бы предположил, что процедура вида А=EOSHIFT(А, SHIFT = n) замедлена из-за необходимости массы промежуточных сохранений для удержания получаемых результатов и корректной адресации источника...
попробуй понасиловать копию, что-то типа
B = A
А=EOSHIFT(B, SHIFT = n)
для разных областей памяти...
 
а вообще, если
Цитата:
(написать свою процедуру), то выполняется сдвиг в 1000 раз быстрее. Может у кого-то есть соображения, в чём дело?
что тебя смущает? если твои п/п в 1000 раз быстрее, так и пользуйся ими... :)

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 16:00 15-01-2011
bubanoid



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Спасибо, попробую. Дочитываю теорию и после сего попробую экспериментировать.

Цитата:
что тебя смущает? если твои п/п в 1000 раз быстрее, так и пользуйся ими...
У меня глубокое убеждение, что невозможно самому написать процедуру, которая будет работать быстрее соответствующей встроенной. Если моё быстрее встроенного - значит я вот это встроенное использую неправильно и чего-то не понимаю. Следовательно надо копАть. Вот и копаю )

Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 16:35 15-01-2011 | Исправлено: bubanoid, 16:37 15-01-2011
KChernov



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

Цитата:
Выполняется этот сдвиг невероятно долго. Если выполнять сдвиг руками (написать свою процедуру) - то выполняется сдвиг в 1000 раз быстрее.

А какой собственно фортран?
 

Цитата:
Если моё быстрее встроенного - значит я вот это встроенное использую неправильно и чего-то не понимаю.

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

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 18:59 15-01-2011
Henry2023

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

 
 Помогите решить задачку по Фортрану
 
Задача:
   
Введенная строка содержит несколько слов , разделенных пробелами. Преобразовать ее к новому виду, в котором эти слова располагаются в обратном порядке.
 
Например (I Live in Moscow) надо чтобы было наоборот Moscow in live I  
 
 
Очень надо )

Всего записей: 2 | Зарегистр. 18-01-2011 | Отправлено: 15:02 18-01-2011
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Henry2023
Читай шапку темы

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 17:55 18-01-2011
Henry2023

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята помогите пожалуйста я понимаю,что может не по теме но все равно, очень надо)

Всего записей: 2 | Зарегистр. 18-01-2011 | Отправлено: 19:31 18-01-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

Компьютерный форум 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