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

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

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



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

Цитата:
Есть ли целесообразность по времени всё реализовывать на C++.
нет...  

Зависит от соотношения написано/надо написать.
Если 90% уже написано - конечно мало смысла всё менять.
Но если написано только 10% - никогда не поздно сменить платформу.
 

Цитата:
Формат НЕ фиксированный.  
да какая разница?  

Большая!
Там слишком много искусственных ограничений, которые ухудшают структуру кода.
Меня учили, что если есть простое средство уменьшить шанс ошибки - его надо использовать - это сэкономит время для устранения более серьёзных.
 
akuaku

Цитата:
Можно по-простому объяснить ещё раз, чем правильно заменить common-блоки на аналоги.  

module по сути аналог класса, но исключительно со статическими полями и методами + не гарантируется уникальность имён.
 

Цитата:
У этой сетки есть массив значений координат в точках, шаг сетки и число точек. Все эти дополнительные параметры не имеют отношения к постановке физической задачи, поэтому они не должны быть в числе физических аргументов функциональных единиц на схеме программы. Но эти параметры сетки должны быть почти в каждой процедуре. Т. е. их надо передавать и хранить как глобальные переменные.

Тут и начинаются проблемы процедурного программирования (в ООП это всё решается).
На уровне передачи данных всё конечно можно загнать в структуры - тогда все параметры сетки будут 1-й переменной в вызове.
Но избавиться от излишнего дублирования кода будет весьма проблематично и это будет выглядеть не очень естественно.
 
AZA_N

Цитата:
Самое главное (imho, т.к. я самоучка и общаться по поводу фортрана ни с кем не приходилось) хорошо продумать структуру программы, структуру вводимых и выводимых данных и не отступать от стандарта (я в свое время много шишек на этом набила при переходе с транслятора на транслятор).  

Это всё так, но...
Очень сложно сразу продумать структуру большой программы (разве что только что написал аналогичную) - именно поэтому экстремальное программирование (ХР) - достаточно популярная и продуктивная методика.
Только вот не видел ни одного редактора с рефакторингом для Фортрана.
Да и процедурное программирование - отнюдь не гибкая методика - скорее под вариант
Цитата:
хорошо продумать структуру программы, структуру вводимых и выводимых данных и не отступать от стандарта

 
akuaku

Цитата:
массивы - динамические
? - Т. е.
Код:
real, dimension(, pointer :: a
...
allocate (a(100))
...
deallocate (a(100))  

Вообще-то динамические массивы - это скорее
Код:
real,allocatable :: a(
...
allocate (a(size
))
...
deallocate (a)
.
 

Цитата:
Как разделять переменные по смыслу (главные и все вспомогательные) - по разным модулям? Бывает, что вспомогательные переменные нужны в нескольких подпрограммах, т. е. они не могут быть локальными.  

Вообще есть книги по декомпозиции.
В принципе основные идеи тут уже насоветовали.
 
AZA_N

Цитата:
И еще из рекомендаций - не забывать implicit none

Не просто не забывать, а наоборот - он должен быть в заголовках всех программных структур.
 
 
Добавлено:
AZA_N

Цитата:
см. ссылку в соответствующей теме

Спасибо за ссылки
По ООП ссылка познавательная, только вот какое-то оно недоделанное - скорее на реферат смахивает.
Особенно настораживает, когда наследование путают с агрегированием
 
Но всё равно для ознакомления рекомендую (хотя примеров могло быть и поболее)

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 23:29 16-02-2009
AZA_N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Раз уж зашел разговор о сетках. Кто-нибудь использовал какие-либо программы (у которых можно достать исходники, например, с netlib и т.п.), аналогичные программам   IMSL – QD2VL, QD3VL, QD3DR, etc. (линейная, квадратичная, … интерполяция на регулярных и нерегулярных 2d и 3d сетках). Если да, то поделитесь, пожалуйста, ссылками и впечатлениями. (Я бы конечно предпочла исходники этих функций из IMSL, но в старых исходниках этих функций нет, а новых исходников, увы, нет у меня)
 
KChernov, ссылка на ООП – это ее припринт в Келдыше.

Всего записей: 853 | Зарегистр. 10-11-2007 | Отправлено: 13:44 17-02-2009 | Исправлено: AZA_N, 22:27 17-02-2009
KChernov



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

Цитата:
ссылка на ООП – это ее припринт в Келдыше

А в чём разница?

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 23:23 17-02-2009
pir0texnik1

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите плиз добрым советом...
Хочу передать в фортрановскую dll 2x мерных массив с помощью vector<vector<double>> и вывести из нее тоже в массив такого же типа. Как это сделать?
В dll пишу

Код:
 
subroutine test (in_dim,s1i,s2i,out_dim,s1o,s2o)
!DEC$ ATTRIBUTES DLLEXPORT :: TEST
 
implicit none
 
        Integer, intent(in) :: s1i, s2i
        Integer, intent(in) :: s1o, s2o
        real(8), intent(in) :: in_dim
 
        real(8), intent(out) :: out_dim
             
        DIMENSION in_dim(s1i,s2i)
        DIMENSION out_dim(s1o,s2o)
 
 

 
s* - это размеры массивов
вызываестся это из с++ нормально, только передается внутрь вместо вектора - ерунда... помогите... спасибо!

Всего записей: 10 | Зарегистр. 06-09-2007 | Отправлено: 16:31 19-02-2009
Igorr

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

Цитата:
вызываестся это из с++ нормально, только передается внутрь вместо вектора - ерунда

При правильном вызове все передается нориально. Обратите внимание на разницу в порядке элментов массивов в C++ (по строкам) и в Фортране (по столбцам).

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 19:00 19-02-2009
Nag

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka
AZA_N
 
Я ни в коем случае не хотел начинать джихад, не подумайте ничего плохого Насчет VMWare согласен - сам пользуюсь для запуска старых программ. Еще и Bosch emulator помогает - полегче будет, хотя далеко не для всего пригоден. Зато весит мало, автозапуск настроен и т.п. )
Занимательный факт: есть такая программа - Ansys. В версии 5 фортран-кода было около 70%. в 7ой - менее 40%. в 9ой - около 15%. в более новые не смотрел причем, код явно мигрировал с фортрана на C.
 
pir0texnik1
Кроме  как послать в документацию ничего придумать не могу. Потому что есть такое понятие - "calling convention", в старой советской литературе это называлось "соглашение о связях". Смысл в том, что каждый язык имеет свои соглашения о порядке передачи параметров и эксплуатации стека, причем это зависит еще и от мнения производителя компилятора. Единого стандарта нет. Поэтому надо искать пересечение двух множеств - со стороны вызывающей программы и со стороны вызываемой. И не забывать что в C/C++ существуют только одномерные массивы (вектора), все что более - вектор указателей на массив меньшей размерности.

Всего записей: 632 | Зарегистр. 05-02-2003 | Отправлено: 22:09 19-02-2009
AZA_N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Nag, я когда начинала осваивать ANSYS (сразу с 11й версии), то по привычке в APDL поставила фортрановский формат вывода, а оказалось, там форматы из С. Там коды именно С или С++? (простите за оффтоп).
Есть еще в CERN библиотеки Geant4 - чисто расчетные вещи, они на С++, а Geant3 был на Фортране.
 
Я как раз сейчас на распутье - новые (переписывать старые я точно не буду) расчетные программы (если пытаться использовать ООП) писать на С++ (т.к. все равно приходится С++ осваивать из-за Geant4) или остаться на Фортране. Кто что по этому поводу думает?

Всего записей: 853 | Зарегистр. 10-11-2007 | Отправлено: 22:45 19-02-2009
KChernov



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

Цитата:
Кто что по этому поводу думает?

Собственно я несколькими постами выше про это распинался - или я не понял вопроса?
 
Вообще ещё вопрос: С++ ли?..
 
Чисто теоретически: используя несколько разноуровневых языков, можно гибче подбирать нужный уровень абстракции.
Чисто практически: это всё надо уметь эффективно и без лишних издержек стыковать.
 
Пока на ум приходит только одна технология, где это может получиться сделать - .Net.
Но вот как оно будет на практике???
 
В принципе, взаимодействие можно осуществлять исключительно по данным - например через БД.
Но тогда надо прорабатывать структуру этой самой БД.
Хотя возможно такое уже и существует?..

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 23:56 19-02-2009
pir0texnik2



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
Вы уверены, что таки нормально? передается вектор заполненый 1, в дебагере в фортране вижу числа вроде 869765965.87Е+302. Простые переменные передались нормально.
Nag
Да то я знаю... Начитался уже всего. Пока я так понял самый простой способ делать а-ля врапер: свернуть этот вектор в одномерный массив передать, там развернуть, и с выводом действовать наоборот. Но как это это криво...
Видел и этот(http://www-zeus.desy.de/~burow/cfortran/cfortran.html)интерфейс, но это монстр какой-то... должен жы быть способ проще...
Вызываю из борланда ее вот так...
 

Код:
 
typedef void (__stdcall *sub_fortran_1)(const vector<vector<double> >*,const int*,const int*,vector<vector<double> >*,const int*,const int* );
 
HIns=::LoadLibrary("test_dll.dll");
if(HIns==NULL){ Application->MessageBox("test_dll.dll not found!", "Error", MB_OK); return;}
sub_fortran_1 test;
 
test=(sub_fortran_1)(GetProcAddress((HMODULE) HIns,"TEST"));
 
test (&in_dim,&s1i,&s2i,&out_dim,&s1o,&s2o);
 

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 04:18 20-02-2009
Igorr

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

Цитата:
Вы уверены, что таки нормально?

Абсолютно. Пльзую связку VC++ (интерфейс) и CVF/IFC (расчетные dll) уже несколько лет. У вас ошибка: вы передуете указатель на класс "vector", а надо передавать указатель на "double".

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 04:41 20-02-2009
Nag

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZA_N
 
Расчетные - C и C++. Соотношение сказать не могу, не анализировал, не было такой задачи. Интерфейсные - C++, очевидно потому что GUI библиотека обьектно-ориентированная.
 
Насчет С/C++
С, бесспорно, эффективнее. Потому что косвенная адресация на современных процессорах вещь очень дорогая, классы по сути своей - "указатель на структуру набора списка указателей методов (имеются в виду виртуальные методы) ". Во загнул
Но: зато писать удобно. и это, пожалуй, стоит тех 10-15% производительности, которые вы потеряете. Опять-таки, если вам удастся удачно построить структуру данных, то, возможно, накладки на классах уже не будут иметь такого значения. Например, чисто матричные операции
 
Я не рассматриваю ситуацию когда человек использует cout << "hello" << endl и считает что использует C++
 
 
Насчет производительности:
Можно попробовать использовать локальный матсопроцессор типа NVidia видеокарты. По заявлениям, теоретически до 80 раз. Реальные цифры опубликованные на NVidea от 5 до 50 раз на разных проектах. Посмотрите, http://nvidia.com/cuda - очень познавательно
Так что тут ваша потеря компенсируется с приличным избытком.
Есть еще варианты Cell сопроцессора - но это уже совсем другие деньги.
Или PlayStation 3 - но тут еще и масса мороки с использованием её.
 
Насчет Net:
Да, язык красивый. Но: связь с внешними библиотеками на других языках зачастую очень проблематична. То есть: передать 1-2 параметра проблем нет. Передать массив (а тем более вернуть его) - проблема. Тем более структуру, тем более по указателю.
Да и с отдачей приложения клиенту периодически вылазят очень большие, плохо диагностируемые проблемы.

Всего записей: 632 | Зарегистр. 05-02-2003 | Отправлено: 06:35 20-02-2009 | Исправлено: Nag, 06:53 20-02-2009
pir0texnik2



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за наводку!!  Практически заработало, за исключением...
 
в с++ написал....

Код:
 
typedef void (__stdcall *sub_fortran_1)(const double*,const int*,const int*,double*,const int*,const int* );
 
int s1i=2,s2i=4,s1o=2,s2o=4;
vector<vector<double> >  in_dim(s1i);
vector<vector<double> > out_dim(s1o);
 
for(int i=0;i<s1i;i++)  in_dim[i].resize(s2i);
for(int i=0;i<s1o;i++) out_dim[i].resize(s2o);
 
  for(int i=0;i<s1i;i++)
   for(int j=0;j<s2i;j++) in_dim[i][j]=(i+1)*(j+1);
 
 test (&in_dim[0][0],&s1i,&s2i,&out_dim[0][0],&s1o,&s2o);
 

на фортране

Код:
 
subroutine test (in_dim,s1i,s2i,out_dim,s1o,s2o)
!DEC$ ATTRIBUTES DLLEXPORT :: TEST
implicit none
        Integer, intent(in) :: s1i, s2i
        Integer, intent(in) :: s1o, s2o
        real(8), intent(in) :: in_dim(s2i,s1i)
 
        real(8), intent(out) :: out_dim(s2o,s1o)
 

и вот, что вижу в отладчике...

Код:
 
-        IN_DIM    {...}    REAL(8)  
        IN_DIM(1,1)    1.00000000000000    REAL(8)  
        IN_DIM(2,1)    2.00000000000000    REAL(8)  
        IN_DIM(3,1)    3.00000000000000    REAL(8)  
        IN_DIM(4,1)    4.00000000000000    REAL(8)  
        IN_DIM(1,2)    1.752714624041975E-154    REAL(8)  
        IN_DIM(2,2)    2.127420912385896E-314    REAL(8)  
        IN_DIM(3,2)    4.668390740321225E-313    REAL(8)  
        IN_DIM(4,2)    5.424720239319302E-317    REAL(8)  
 

Почему неправильная часть матрицы? Что потерялось?? Правильно, независимо от размера матрицы отображается только первый столбец, дальше идет какое-то чередование, где индекс нечетный - правильно со сдвижкой на один адрес вниз, где четный - ерунда...

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 06:53 20-02-2009 | Исправлено: pir0texnik2, 06:54 20-02-2009
Igorr

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

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 07:38 20-02-2009
KChernov



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

Цитата:
вызываестся это из с++ нормально, только передается внутрь вместо вектора - ерунда... помогите... спасибо!

Может имеет смысл принимать в С++ этот параметр не как вектор векторов, а как массив (двумерный), а уже потом преобразовывать в вектор?..
 

Цитата:
Пока я так понял самый простой способ делать а-ля врапер: свернуть этот вектор в одномерный массив передать, там развернуть, и с выводом действовать наоборот.

Так точно должно работать.
Причём в фортране ничего преобразовывать не надо будет.
 
Nag

Цитата:
С, бесспорно, эффективнее.

Собственно тогда и особого смысла с субжа переходить нет.
Ну разве что чтобы облегчить взаимодействие с библиотеками на С++.
 

Цитата:
Можно попробовать использовать локальный матсопроцессор типа NVidia видеокарты

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

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

Даже в пределах .Нет? Или именно с языками вне технологии?
 

Цитата:
Да и с отдачей приложения клиенту периодически вылазят очень большие, плохо диагностируемые проблемы.  

А нельзя ли с примерами? Очень интересно услышать.
 
Просто сам щас озадачен выбором.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 08:17 20-02-2009
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pir0texnik2
Посмотрите, для себя хотя бы, что означают структуры, типа двумерных массивов в С и в фортране. В фортране, говоря сишным языком, имя массива - ссылка на место в  памяти, где линейно, развернуто по столбцам хранятся элементы массива. В С же это ссылка на массив ссылок, каждая из которых указывает на место, где хранится строка массива. По сути, в фортране двумерный массив - сие фикция. Есть одномерный массив, трактуемый как двумерный. Поэтому и трактовать надо для С, как одномерный.
В связи со всем этим, есть у меня некоторые сомнения в правильности Вашего обращения к процедуре test. Что вы туда передаете-то? Разберитесь.    

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 11:59 20-02-2009
pir0texnik2



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

Код:
 
    vector<double> temp_in (s1i*s2i);
    vector<double> temp_out(s1o*s2o);
     for(int i=0;i<s1i;++i)
       for(int j=0;j<s2i;++j) temp_in[s2i*i+j] = in_dim[i][j];
         test (&temp_in[0],&s1i,&s2i,&temp_out[0],&s1o,&s2o);
      for(int i=0;i<s1o;++i)
        for(int j=0;j<s2o;++j) out_dim[i][j]=temp_out[s2o*i+j];
 

Vskazka
Туда передается ссылка на первый элемент массива, то, что нужно фортрану...
 
Правда, теперь задумался над другим.. По идее я так понимаю в С++ с такой ссылочной структурой массива ничто не мешает данным быть фрагментированными... или нет? Если да, то такая передача массивов не подойдет, т.к. здесь подразумевается, что все идет по порядку... Будут ли проблемы с большими векторами?

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 18:42 21-02-2009
Vskazka

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

Цитата:
Туда передается ссылка на первый элемент массива, то, что нужно фортрану...  

Фортрану - да. Там, вообще, передаются ссылки. Но Вы то передаете в том куске на самом деле ссылку на первый элемент первой строки. И дальше Вам гарантируется, и то, по-моему не всегда, что подряд в памяти будет лежать только эта строка (как мне кажется и это - вопрос к системе, не помню точно. Но, представьте, что массив больше, чем оперативная память. В юниксах, вообще-то нет разделения на оперативную и виртуальную память. Система разводит все.).  Нигде не гарантируется (посмотрите стандарты языка), что в памяти двумерный массив будет хранится подряд. От компиляторов зависит, от наличия свободной памяти и т.д. Не говоря уж о том, что фортран будет считать, что в памяти будет все храниться столбец за столбцом.  
Вы знаете, когда хотят писать параллельно на С и фортране, то в С любые массивы объявляются одномерными. Если с ними еще работают в Фортрановских кусках. Ну а уж в фортране, объявляйти их хоть пятимерными. Там это просто для удобства. В С же это существенное различие.      

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 19:00 21-02-2009 | Исправлено: Vskazka, 19:08 21-02-2009
pir0texnik2



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka, я уже из всего выше сказаного понял, что оперировать напрямую с многомерными массивами не получится, поэтому в последнем моем куске кода, приведенном тут, это все и отобразил...
Собственно, вопрос о массивах у меня отался только один - как не наступить на грабли возможной фрагментированности массива(1 мерного) в С?.. Фортран-то как-то должен тянуть большие массивы....

Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 22:03 21-02-2009
Vskazka

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

Цитата:
Собственно, вопрос о массивах у меня отался только один - как не наступить на грабли возможной фрагментированности массива(1 мерного) в С?

Если у Вас будет одномерный массив и там и там (в фортране - все массивы одномерные по сути), то вопрос фрагментированности - это не Ваши проблемы, не языка даже - а системы. Если Вы, конечно, не полезете в С адресоваться к элементам массива по абсолютному адресу, узнав абсолютный адрес начала массива. Это система сама решает, где там ей что разместить. И сдвигаясь по индексу - получать следующий элемент - это проблема системы, а не Ваша и не программы. Хотя, конечно система по возможности размещает массив одним куском. Особенно, если он умещается в один сегмент.

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 08:07 22-02-2009
Nag

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pir0texnik2
 
Можно подробнее про фрагментированность 1мерного массива в C ? где Вы про это прочитали ? Первый раз такое слышу. Все что я знаю на настоящее время - компилятор ОБЯЗАН размещать его подряд, одним куском. C точки зрения С array[number] есть полный эквивалент *(array+number).
Что же касается того, что массив может лежать в виртуальной памяти и часть её под него может даже пока быть не выделена - это проблемы системы, которые она вполне успешно решает.

Всего записей: 632 | Зарегистр. 05-02-2003 | Отправлено: 14:53 22-02-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 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