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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
и отключать графические смайлики при размещении фортран-кода

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

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть пара вопросов по передаче параметров из С++ в Фортран и обратно:
 
Вопрос 1:
1) в C++ имеется:
    double* pD = new double[2*100*100];
2) в Фортран передается адрес массива pD и его половина заполняется некими вычисленными величинами, которые потом используются в С++:
    SUBROUTINE FSUB(pD)
    DOUBLE PRECISION  pD(100,100)
Вопрос: сможет ли Фортран использовать неуказанную часть памяти массива pD для своих внутренних нужд и тем самым попортив вторую половину массива?  
 
Вопрос 2:
1) в C++ имеется:
    double* pD = NULL;
2) в Фортран передается адрес массива pD, равный нулю, но с "его" элементами никаких действий не осуществляется:
    SUBROUTINE FSUB(pD)
    DOUBLE PRECISION  pD(100,100)
Вопрос: испортит ли Фортран где-либо содержимое памяти?

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 22:37 23-10-2011 | Исправлено: Igorr, 22:39 23-10-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
что-то не очень я понял эти вопросы, но отвечаю...
 
1) ответ: вообще говоря испортить может
и вообще сразу совет использовать одномерные массивы, т.к. адресация элементов у Ф и С разная, а типа [2*100*100] в С == (2*100*100) в Фор
думаю, что пересчёт линейной адресации проще пересчёта того что в С строки, а в Фортране -- столбцы и наоборот...
 
например, если в фортране работают только со второй половиной массива
то ничего страшного не произойдёт, если всё аккуратно делать...
 
2) адрес массива равный NULL это никакой адрес
и ответ прост: испортить может, если ты это сделаешь сам намеренно :)
в общем за второй случай не беспокойся...

Всего записей: 24102 | Зарегистр. 06-12-2002 | Отправлено: 23:13 23-10-2011 | Исправлено: akaGM, 23:19 23-10-2011
Igorr

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

Цитата:
что-то не очень я понял эти вопросы
Врпросы возникли потому, что обращения к фортрановской dll с такими параметрами работают нормально в ~80%. Вижу, что в ~20% портится помять - ищу где и почему?

Цитата:
1) ответ: вообще говоря испортить может  
где можно почитать про такие случаи?
 
Добавлено:

Цитата:
если в фортране работают только со второй половиной массива  
то ничего страшного не произойдёт
У меня как раз случай работы с первой половиной.

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 23:25 23-10-2011
akaGM

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

Цитата:
где можно почитать про такие случаи?
ну не знаю...
прочитай, например, mixed-language prog guide у интела

Цитата:
У меня как раз случай работы с первой половиной.
это без разницы в случае работы с одномерным массивом...

Всего записей: 24102 | Зарегистр. 06-12-2002 | Отправлено: 23:38 23-10-2011
Andrew10

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

Цитата:
Вопрос 1:
1) в C++ имеется:
    double* pD = new double[2*100*100];
2) в Фортран передается адрес массива pD и его половина заполняется некими вычисленными величинами, которые потом используются в С++:
    SUBROUTINE FSUB(pD)
    DOUBLE PRECISION  pD(100,100)
Вопрос: сможет ли Фортран использовать неуказанную часть памяти массива pD для своих внутренних нужд и тем самым попортив вторую половину массива?  

 
IMHO, в таком случае ничего портиться не будет. Строка в подпрограмме  
   DOUBLE PRECISION  pD(100,100)  не служит указанием для распределения памяти под массив pD, так как она уже выделена в вызывающей программе, а служит для организации адресации элементов массива pD.

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 14:04 24-10-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
double* pD = new double[2*100*100];
    DOUBLE PRECISION  pD(100,100)
 
память точно не будет портиться, а вот элементы массива очень даже могут, т.к. фортран при таком описании будет работать _всегда с первой половиной_ pD[] и ответ на
Цитата:
Вопрос: сможет ли Фортран использовать неуказанную часть памяти массива
-- нет
и "да" -- только при pD(2*100, 100) или pD(100, 2*100), или если принудительно писать в необъявленные ячейки, отключив проверку диапазонов, что есть изврат и геморрой...
я настоятельно рекомендую линейную адресацию для фортрана...

Всего записей: 24102 | Зарегистр. 06-12-2002 | Отправлено: 14:28 24-10-2011 | Исправлено: akaGM, 14:44 24-10-2011
Igorr

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

Цитата:
DOUBLE PRECISION  pD(100,100)  не служит указанием для распределения памяти под массив pD, так как она уже выделена в вызывающей программе, а служит для организации адресации элементов массива pD

По-моему вы не поняли этот Вопрос 1. Поподробнее: Фортран явно видит, что массив pD занимает только 100х100х8 байт, следовательно, второй кусок памяти для него может являться незанятой (так ли это?) памятью , т.е. он может ее использовать, например, при вызове какого-нибудь ALLOCATE - и зарезервирует (может ли?) ее для другого массива, и действия над элементами этого нового массива изменят содержимое второй части массива pD, тем самым его попортив. Так вопрос: возможно ли такое? (Хочется услышать знание или обоснованное мнение.)
 
Добавлено:
Я думаю, что такого быть не может.

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 17:30 24-10-2011
akaGM

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

Цитата:
Хочется услышать знание или обоснованное мнение

так как я не обладаю ни тем ни другим, то поэтому задам встречный вопрос :)
 
а можно услышать саму суть проблемы, а не её привязку к виду и размерностям массивов?
т.е. без самой реализации, именно ЧТО нужно, а не КАК сделать то-то и то-то?
 
потому что сделать можно что угодно, фортран сделает всё что его попросят, например так:
 

Код:
double* pD = new double[2*100*100];
    SUBROUTINE FSUB(pD)
    DOUBLE PRECISION  pD(:,:)
 
    pD(102, 104) = 3.14
или так
Код:
double* pD = new double[2*100*100];
    SUBROUTINE FSUB(pD)
    DOUBLE PRECISION  pD(100,100)
 
    pD(102, 104) = 3.14

Всего записей: 24102 | Зарегистр. 06-12-2002 | Отправлено: 18:34 24-10-2011 | Исправлено: akaGM, 18:38 24-10-2011
Igorr

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

Цитата:
а можно услышать саму суть проблемы
\
Сама суть, как и любаю другая, проста как... Вообщем, есть фортрановская dll c вычислительной подпрограммой которая вызывается из С++ и ей передается несколько групп параметров, каждая для своего типа вычислений. Вычисления используют THREADPRIVATE (St) из OpenMP. Dll загружается один раз, а подпрограмма из нее вызывается несколько раз. Так вот что интересно, при втором вызове подпрограммы при входе в параллельные вычисления массив структур St для 0-потока, созданный ALLOCATE-ом, ведет себя странно: при первом параллельном блоке массивы создается и успешно заполняются. При втором параллельном блоке, который вызывает некую функцию в том же файле, массивы всех потоков существуют в этой функции, а массив 0-потока - .NOT. ALLOCATED (?). Причем, если перед каждым вызовом подпрограммы загружать dll и выгружать ее после завершения работы подпрограммы, то такого эффекта нет! Стал смотреть в чем дело. Обнаружил то, что по вопросу 2. Ну заодно и то, что по вопросу 1.

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 19:13 24-10-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
ясно...
а фортран и С свои или чужие, т.е. правка возможна или чёрный ящик?

Всего записей: 24102 | Зарегистр. 06-12-2002 | Отправлено: 20:20 24-10-2011
Igorr

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

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 20:36 24-10-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
это уже лучше...
 
тогда последний вопрос:
почему в Сях вектор, а в фортране 100х100?

Всего записей: 24102 | Зарегистр. 06-12-2002 | Отправлено: 22:21 24-10-2011
Andrew10

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

Цитата:
По-моему вы не поняли этот Вопрос 1. Поподробнее: Фортран явно видит, что массив pD занимает только 100х100х8 байт, следовательно, второй кусок памяти для него может являться незанятой (так ли это?) памятью , т.е. он может ее использовать, например, при вызове какого-нибудь ALLOCATE - и зарезервирует (может ли?) ее для другого массива, и действия над элементами этого нового массива изменят содержимое второй части массива pD, тем самым его попортив. Так вопрос: возможно ли такое? (Хочется услышать знание или обоснованное мнение.)  

 
 
Может быть я не понял, но мне пока кажется, что понял .  И дал ответ именно на Ваш вопрос. Еще раз:
 
В вызываемой подпрограмме есть декларация
DOUBLE PRECISION  pD(100,100)  
причем имя массива pD фигурирует в списке передаваемых в подпрограмму переменных. При работе подпрограммы не происходит выделения дополнительной памяти. В подпрограмму передается только ссылка на первый элемент массива. Размерности массива из этого описания в самой подпрограмме используются только для адресации его элементов относительно этого первого элемента.  
Никакие динамические и статические распределения памяти не затронут той области памяти, которая уже распределена под массив в вызывающей программе, независимо от того, написана она на С, или на Фортране.
 
Вот пример, подтверждающий мои слова.
 
На заре моей туманной юности   было принято писать на Фортране что-то вроде такого:
 
       PROGRAM FOO
       ...
       REAL A(100)
       ...
 
       CALL BAR(A)
 
       ....
       END
 
       SUBROUTINE BAR(A)
       REAL A(1)
       ...
       ...
       ...
       RETURN
       END  
 
Это позволяло задавать размерности всех массивов только в основной программе и не следить за ними в подпрограммах. Но это, конечно, накладывало на программиста дополнительную ответственность за правильность кода в подпрограммах, чтобы не было выхода за пределы массива.
 
Конечно, если код самой подпрограммы написан некорректно, например где-нибудь будет изменен элемент с индексами pD(150,150), то произойдет выход за пределы описанного в подпрограмме массива и вторая его половина запортится. Но это ошибка программиста, а не компилятора.
В современных компиляторах по умолчанию включены опции проверки таких ситуаций, что-нибудь вроде \check:bounds. Они замедляют работу программы и после отладки их обычно отключают.
 

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 22:55 24-10-2011
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Цитата:
тогда последний вопрос:  
почему в Сях вектор, а в фортране 100х100?
Мне так удобно.
 
Andrew10
Пример с Фортран-Фортран - все понятно. Меня интересовало именно С++-Фортран.
Цитата:
Никакие динамические и статические распределения памяти не затронут той области памяти, которая уже распределена под массив в вызывающей программе, независимо от того, написана она на С, или на Фортране.
Эта фраза и есть то, что меня интересует. Если это так, а я думаю что так, тогда дело здесь скорее всего не в компиляторах, а в операционной системе, т.е. в ее системе "маркеров занятости" памяти или в чем-то подобном (я к таким тонкостям не близок).

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 23:32 24-10-2011
akaGM

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

Цитата:
Мне так удобно.
всё равно непонятно, почему использовать весь массив в фортране хочешь, а описывать его там -- нет...
 
помятуя о том, что фортран -- "столбовой дворянин хранитель" (т.е. в памяти хранит массив по столбцам), можно к твоему pd() декларативно "приклеить" справа ещё 100 столбцов и спокойно оперировать ими там (1..100, 101..200), в старом коде ничего менять не придётся...
 
чем не выход?

Всего записей: 24102 | Зарегистр. 06-12-2002 | Отправлено: 13:52 25-10-2011 | Исправлено: akaGM, 15:23 25-10-2011
ESV1987

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Оказывается опция компилятору -K пришла ещё из ф77, её аналог в ф90 +save. Но у меня всё равно не получается в VS2010 задать +save в опциях проекта. Не подскажите где это нужно прописать?

Всего записей: 56 | Зарегистр. 31-03-2007 | Отправлено: 16:04 25-10-2011
akaGM

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

Цитата:
опция компилятору -K пришла ещё из ф77
опции компилятора никак не связаны с языком...
 
вот ты сидишь в VS (купили, да?) и что, трудно посмотреть в мануале или тупо просмотреть все чекбоксы?
 
ты б хоть написал, что она в линуксе делает...
 
ну хорошо...
предположу, что это аналог
 
/noautomatic
 
а уж где это "в студии прописать", извини, -- мне фортран по минимуму купили, без студии,
и у многих тут так...

Всего записей: 24102 | Зарегистр. 06-12-2002 | Отправлено: 16:18 25-10-2011
karakurt2



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у Бартеньева в книгах было как передавать массивы между программными модулями, написанными на С и на Фортране. в Фортране массивы описываются дескрипторами, почитайте. я во времена CVF использовал приём, описанный в его книгах, только у меня память под массивы выделялась с помощью файлов, отображаемых на память, кода этого сейчас нет под рукой.
 

Всего записей: 733 | Зарегистр. 06-12-2003 | Отправлено: 04:45 26-10-2011 | Исправлено: karakurt2, 04:50 26-10-2011
ESV1987

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
методом подбора из мануала фортрана подошла опция /qsave .

Всего записей: 56 | Зарегистр. 31-03-2007 | Отправлено: 09:23 26-10-2011
akaGM

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

Цитата:
/Qsave    save all variables (static allocation) (same as /noautomatic,
          opposite of /auto)

зато ты теперь знаешь чтО это и где это посмотреть...
 
karakurt2
это ты к чему и к кому?
с дополнительными дескрипторами в фортране передаются только массивы символов
character(xxx), все остальные -- обычным образом...

Всего записей: 24102 | Зарегистр. 06-12-2002 | Отправлено: 10:03 26-10-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