LINUX.ORG.RU

Указатели в Фортране


0

0

Читал много документации и учебников по Фортрану. Нигде не смог найти, как объявить указатель на переменную типа массива? Знаю, как это будет на пакскале и на с++.

На паскале: type arr = array [0..MaxPixelCountA - 1] of TRGB; var p : ^arr; ....... Обращение к массиву p^[i + w * j].r

На С++: typedef TRGB[MaxPixelCountA] arr arr *p; .... Обращение к массиву (*p)[i].r

Буду рад, если подскажете, как это реализовать на Фортране.

В Фортране 77 нет динамических массивов, выделение памяти происходит на этапе инициализации.

В фортране 90 и выше есть директива ::allocatable, код что-то типа real*8 my_array(*)::allocatable

allocate(my_array,100)

вроде так. Проверьте по учебнику, фортран 90 не использую.

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

Я нашел какой-то пример TYPE row REAL, POINTER :: r(:) END TYPE .... TYPE(row) :: s(n), t(n) ....... DO i = 1, n ALLOCATE (t(i)%r(1:i)) Но это не совсем то...(((

mavraleus
() автор топика
Ответ на: комментарий от mavraleus

AFAIK, типа данных "указатель" в стандарте, по крайней мере 77 фортрана не было, хотя компиляторы, вроде компилятора фортрана для CRAY его реализовывали.

Если я правильно понимаю, то указатели Вам нужны для реализации выделения памяти для массивов на этапе выполнения. Тогда вам нужны allocatable массивы

Поищите в гугле по

allocatable arrays in fortran

Если же Вам нужны указатели для чего-то другого, тогда поясните, для чего конкретно

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

Хочу этот код на фортран перевести.

type

Trgb = packed record

b,g,r : byte

end;

const

MaxPixelCountA = MaxInt div Sizeof(TRGB);

type

arr = array [0..MaxPixelCountA - 1] of TRGB;

var

p : ^arr;

brg:=0.3*GetRValue(p^[i + w * j].r)+0.59*GetGValue(p^[i + w * j].g)+0.11*GetBValue(p^[i + w * j].b);

Это для перевода интенсивности каждого пикселя картинки bmp в число и запись в файл..

mavraleus
() автор топика
Ответ на: комментарий от mavraleus

> p : ^arr;

Полагаю, что указатель нужен только для того, чтобы не аллоцировать массив на стэке. Попробуй выдели много стэка и обойдись без указателя. Ну или другой костыль в том же духе.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от annoynimous

Правильно, это паскаль.

В самом первом сообщении я про это и говорил, просто,

я подумал, что, может быть, понятнее будет о чем я спрашиваю,

если буду приводить куски кода, где это реализовано.

На паскале я сделал. но нужно на фортране.

mavraleus
() автор топика
Ответ на: комментарий от mavraleus

Видишь ли в чем дело: у тебя имеется, фактически, массив составных обектов -- записей из 3-х чисел. В 90 фортране, вроде бы есть возможность определять новые типы, однако 77 прямой как палка, поэтому все, что ты можешь сделать --- это объявить массив длиной 3N, где N -- число пикселей, тогда ты получишь что-то вроде

PICTURE=(R1,G1,B1,R2,G2,B2, ...

и с ним работать. Смещения же k-ой точки вычислять как 3*k,тогда ее цвета будут

Rk= PICTURE(3*(k-1)+1)
Gk= PICTURE(3*(k-1)+2)
Bk= PICTURE(3*(k-1)+3)

в общем, развивай идею. Успехов!

annoynimous ★★★★★
()
Ответ на: комментарий от mavraleus

Я не понял ваш пример на Паскале, особенно с учетом форматирования.
Если можно, переведите его на Си (без плюсов) и зашлите с нормальным форматированием (Preformated text).
А так, можно попробовать такое:

TYPE TRGB
  INTEGER*1 B,G,R
END TYPE

TYPE (TRGB), ALLOCATABLE :: P(:)

ALLOCATE(P(MaxPixelCountA))

BRG = 0.3*GetRValue(P(i+w*j)%r)+0.59*GetGValue(P(i+w* j)%g)+0.11*GetBValue(P(i+w*j)%b)



  

mky ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>Полагаю, что указатель нужен только для того, чтобы не аллоцировать массив на стэке.

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

kss ★★★★★
()
Ответ на: комментарий от mky

Можно и на Си.

вот:

typedef TRGB[MaxPixelCountA] arr

arr *p;

Обращение к этой переменной (*p)[i + w * j].r

mavraleus
() автор топика
Ответ на: комментарий от mky

Ну или так

typedef struct

{

unsigned char r,g,b;

} TRGB;

typedef TRGB *p;

mavraleus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.