![]() |
|
![]() ![]() ![]() |
|
f999t1 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 11.4.2006 Репутация: нет Всего: нет |
как реализовать следующее действие:
нужно из текстового файла, в котором записан набор чисел-массив MxN перегнать его в массив a(m,n) |
|||
|
||||
popovda |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Очень просто. Если данные записаны по строкам, то так:
M - число строк, N-столбцов. Допустим, данные - вещественные числа, разделенные пробелами open(1111,file='имя_файла.txt') do i = 1,M read(1111,*) a(i,:) end do; close(1111); Добавлено @ 15:23 Или можно так: real(8) :: a(m,n), tmp(n,m) ......... read(1111,*) tmp; a = transpose(tmp) Пользуясь тем, что в Фортране массивы расположены ПО СТОЛБЦАМ, а не по строкам. Это сообщение отредактировал(а) Cr@$h - 18.1.2009, 18:12 -------------------- С уважением, Попов Д.А. |
|||
|
||||
Иванофф |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 8.9.2006 Репутация: нет Всего: нет |
тов.popovda с педагогической точки зрения с такими вопросами нужно посылать как минимум читать учебник. любой учебник по фортрану начиная с 70-х годов содержит подобную информацию.
|
|||
|
||||
popovda |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Ну а на кой тогда форумы нужны, тов. Иванофф? Я сам когда ковыряться не хочу - не брезгую ими.
-------------------- С уважением, Попов Д.А. |
|||
|
||||
Иванофф |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 8.9.2006 Репутация: нет Всего: нет |
на форуме должен быть некий уровень вопросов, ответы на которые не достаточно очевидны и требуют специфических знаний. пересказ учебников начального уровня не способствует развитию форума, тем более такого "посещаемого и динамичного".
|
|||
|
||||
Cr@$h |
|
||||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Да ну бросьте вы. Посмотрите на самые развитые форумы по языкам на Винграде. Там везде есть подфорумы "Для новичков". Когда-нибудь подобные темы пойдут именно в подобный форум, лишь бы развитие состоялось.
А я то по другому поводу..
Мне кажется запись в памяти и чтение из файла вещи не одни и те же. Да, пусть он в память пишет по столбцам, но матрица остаётся матрицей. И если читать её из файла, то всё должно быть нормально:
Нет? Не могу проверить сейчас :-( |
||||||
|
|||||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
Есть более интересный вопрос...
![]()
Все. Разработчки стандарта Fortran90 уже обо всем подумали. ![]() |
|||
|
||||
Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
![]() |
|||
|
||||
sfes |
|
||||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 20.6.2005 Репутация: нет Всего: нет |
А как сделать то же самое, но только если одна размерность не известна? Т.е. если количество строк в матрице переменное? |
||||
|
|||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Задача нехитрая, еще на уровне Фортрана77 были нормальные средства для ее решения. Вот я в пределах Ф77 и объясню, честно говоря, сам не знаю, как это сделать более современными средствами языка.
Если количество строк заранее не определено, придется, во-первых, заранее объявить массив заведомо больших размеров, чтобы вся матрица гарантированно влезла. Во-вторых, запустить цикл чтения с заполнением объявленного нами массива, считая, что мы должны заполнить его целиком. По ходу чтения программа прочитает всю матрицу и неизбежно налетит на конец файла. Если мы заранее не примем никаких мер, тут наша программа и вылетит с ошибкой. Чтобы этого не произошло, в Ф77 можно использовать такой вариант: указать параметр ERR при записи оператора READ. Запись примерно такая: READ (UNIT=12, FMT=*, ERR=666) тут - элементы матрицы, которые надо прочитать При обнаружении ошибки ввода-вывода программа должна перейти на метку 666, которую, по логике вещей, мы должны поставить сразу за пределами описанного выше цикла чтения матрицы. Это не красиво, завершение работы цикла безусловным переходом за его пределы не способствует оптимизации, но это работает. Да и в циклах чтения-записи и оптимизировать-то нечего. Вообще-то, кажется, последние стандарты Фортрана запрещают выход из цикла по безусловному переходу, так что, по логике вещей, должен быть и более кошерный способ сделать это же самое. Но я его не знаю ![]() Это сообщение отредактировал(а) FatalError - 7.4.2009, 11:30 |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Если матрица записана по строкам, после каждой из которых следует перевод строки (т.е. одна строка = одна запись) и число элементов в строке известно, то можно объявить allocatable 2-мерный массив, затем сделать холостой прогон цикла типа DO WHILE( .NOT.EOF(UNIT_NUMBER)), в котором вычислить количество строк, затем сделать REWIND, разместить массив и считать в него матрицу. Это сообщение отредактировал(а) FCM - 10.4.2009, 10:14 |
|||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
FCM
Да, оказывается, есть такая встроенная логическая функция - EOF. А я и не знал! Вариант вполне годится. З.Ы.: Пардон, данная функция не встроенная, а имеет характер Intrinsic procedure Extensions. Типа, нестандартная и не везде работает. Это сообщение отредактировал(а) FatalError - 9.4.2009, 15:18 |
|||
|
||||
popovda |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Во всех случаях я поступаю одинаково, именно так вывожу матрицы. И вот почему - вывод данных в файл в стандартной последовательности (именно так, как он лежит в памяти), как предложил один из форумчан удобна, если вводить потом куда-нибудь вы их будите то же по столбцам, а не по строкам. Но, экселю, C/C++ и самому человеку удобнее восприятие матриц по строкам. Поэтому я так и написал. Мало ли куда пойдет этот файл потом
![]() Это сообщение отредактировал(а) popovda - 9.4.2009, 22:04 -------------------- С уважением, Попов Д.А. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Fortran | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |