fixfix
2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Сравнение массивов и ещё один вопрос по Fortran
Сообщение03.11.2015, 15:50 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Dmitriy40 в сообщении #1069837 писал(а):
Пока не нужны огромные (миллиарды элементов) массивы булевых переменных, в таком случае расходы памяти становятся неприемлимыми.

А они не нужны практически никогда. Практика показывает, что большие массивы нужны либо чисел (в расчётных задачах), либо нечисловых типов (в базах данных), и булевые там если и встречаются, то как сбоку припёка к чему-нибудь основному, и накладных расходов дают приемлемые проценты.

-- 03.11.2015 15:53:10 --

GAA в сообщении #1069866 писал(а):
К слову, где могут возникать проблемы.
При чтении двоичных файлов (записан в программе, написанной на одном компиляторе, а читается во второй программе, написанной на другом).

Ужас какой. В таких случаях надо тщательно прописывать формат файла, вплоть до битового уровня.

 Профиль  
                  
 
 Re: Сравнение массивов и ещё один вопрос по Fortran
Сообщение04.11.2015, 20:52 
Заслуженный участник


29/12/14
504
В общем, в очередной раз, чтобы темы не плодить, напишу здесь. Следуя совету товарища Pphantom, отошёл от использования составных типов и перешёл к двумерным массивам. То, что написано на данный момент, по логике должно создавать некоторое (определяемое из характеристик системы) число пор, расположенных хаотично и имеющих некоторое дискретное распределение по радиусам. Это работает вроде как нормально. Дальше должны определяться кластеры этих самых пор, за это отвечает подпрограмма findclusters. И вот тут уже всё не очень хорошо. Программа упорно выдаёт ошибку stack overflow (как я понимаю, это типичная ошибка в программах новичков, поскольку так назван крупнейший ресурс типа вопросы-ответы). Я, было дело, грешил на переполнение памяти из-за массива indx1, но его подчистка в конце итерации не помогла. В чём моя ошибка?

Код под катом или по ссылке.

(Оффтоп)


P.S. Ну и вообще, может, какие-нибудь замечания по коду есть, я бы с радостью послушал. :-)
(в частности, есть ощущение, что многие операции с массивами можно сделать значительно проще и элегантнее, чем у меня, но у меня при любых попытках что-нибудь подсократить начинал жаловаться компилятор)

 Профиль  
                  
 
 Re: Сравнение массивов и ещё один вопрос по Fortran
Сообщение04.11.2015, 21:35 
Заслуженный участник


09/05/12
25179
То, что "под катом", малочитаемо (но скачать код можно). Для поиска ошибок (и вообще удобства работы) сначала стоит записать вводимые параметры в текстовый файл и читать оттуда, а не вводить каждый раз вручную. Вообще это некое общее правило хорошего стиля - программа не должна требовать ввода чего-либо с клавиатуры во время работы и не должна выводить на экран ничего, кроме кратких диагностических сообщений, все содержательное - тоже только в файл. Сейчас же понять, что происходит, сложно хотя бы потому, что неизвестно, что именно нужно вводить.

А так... беглый просмотр кода позволяет разве что сократить некоторые участки. А именно:
Вместо
Используется синтаксис Fortran
                do p = 2, M
                if ((Q < sum(prob_distr(1:p,2))) .and. (Q > sum(prob_distr(1:(p-1),2)))) then
                lattice(4,s) = prob_distr(p,1)
                end if

явно стоит сделать что-то такое:
Используется синтаксис Fortran
                tempsum1=0.0
                tempsum2=prob_distr(1,2)
                do p = 2, M
                        tempsum1=tempsum1+prob_distr(p-1,2)
                        tempsum2=tempsum2+prob_distr(p,2)
                        if (Q < tempsum2 .and. Q > tempsum1) then lattice(4,s) = prob_distr(p,1)
                end do

Компилятор, конечно, может многое, но все же заставлять его постоянно считать суммы массивов в громадном количестве не стоит, если без этого можно обойтись (переменные tempsum1 и tempsum2, конечно, нужно определить).

Далее, вот это
Используется синтаксис Fortran
    do l = 1, N  
        do p = 1, 3
            locations(l,p) = lattice(p,l)                                                                  ! Задание матрицы координат пор              
        end do                                                                            
    end do

куда проще записать как
Используется синтаксис Fortran
locations=transpose(lattice(1:3,1:N))
Это, конечно, если подобное вообще зачем-то надо (по моим впечатлениям, массив locations на самом деле совершенно никому не нужен). Ну и т.д. и т.п.

 Профиль  
                  
 
 Re: Сравнение массивов и ещё один вопрос по Fortran
Сообщение05.11.2015, 01:20 
Заслуженный участник


29/12/14
504
Pphantom
ещё раз спасибо за советы. Причесал, где чего смог, вроде как отловил всё, из-за чего ничего не работало, теперь программа заводится.
Цитата:
Вообще это некое общее правило хорошего стиля - программа не должна требовать ввода чего-либо с клавиатуры во время работы и не должна выводить на экран ничего, кроме кратких диагностических сообщений, все содержательное - тоже только в файл.

Извиняюсь, впредь буду знать.

 Профиль  
                  
 
 Re: Сравнение массивов и ещё один вопрос по Fortran
Сообщение05.11.2015, 01:26 
Заслуженный участник


09/05/12
25179
Gickle в сообщении #1070357 писал(а):
Извиняюсь, впредь буду знать.
Извиняться не обязательно, это не норма вежливости, а просто естественное следствие процесса написания кода. При отладке неработающей программы Вы же первый замучаетесь постоянно вручную вводить ей одни и те же данные.

 Профиль  
                  
 
 Re: Сравнение массивов и ещё один вопрос по Fortran
Сообщение05.11.2015, 14:33 


24/11/11
75
Gickle в сообщении #1069500 писал(а):
Чтобы не засорять форум лишними темами, спрошу ещё несколько вопросов здесь, если никто не против:


В FORTRANе есть функция FORALL, если не ошибаюсь она должна позволить получить нужный результат в одну строку.
Что то типа:
FORALL(I = 1:N, A(I) > 5) A(I) = I

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group