Вы хотите использовать распределяемые массивы:
PROGRAM mytest
IMPLICIT NONE
INTEGER :: i, j, k, mysum
REAL, DIMENSION(:,:), allocatable :: c !<- c is allocatable, rank 2
! Let array c be a k-by-k**2 array
! Determine k within the program by some means...for example,
mysum=0
DO i=1, 3
mysum=mysum+1
END DO
k=mysum
WRITE(*,*) "k=", k
WRITE(*,*) "k**2=", k**2
WRITE(*,*)
allocate(c(k,k**2)) ! <-- allocate array c with supplied shape
DO i=1,size(c,1)
WRITE(*,"(100(3X,F3.1))") (c(i,j), j=1,size(c,2))
END DO
deallocate(c) ! <-- deallocate when done
END PROGRAM mytest
(Извините, я не могу опубликовать это как «комментарий» к ответу Питера Кордеса из-за примеров кода, поэтому я должен опубликовать это как «ответ».)
Созданы старые компиляторы C ++ C вместо кода сборки. Следующий класс:
class foo {
int m_a;
void inc_a(void);
...
};
... приведет к следующему C-коду:
struct _t_foo_functions {
void (*inc_a)(struct _class_foo *_this);
...
};
struct _class_foo {
struct _t_foo_functions *functions;
int m_a;
...
};
«Класс» становится «структурой», «объект» становится элемент данных типа struct. Все функции имеют дополнительный элемент в C (по сравнению с C ++): «этот» указатель. Первый элемент «struct» - это указатель на список всех функций класса.
Итак, следующий код C ++:
m_x=1; // implicit this->m_x
thisMethod(); // implicit this->thisMethod()
myObject.m_a=5;
myObject.inc_a();
myObjectp->some_other_method(1,2,3);
... будет смотреть следующий путь в C:
_this->m_x=1;
_this->functions->thisMethod(_this);
myObject.m_a=5;
myObject.functions->inc_a(&myObject);
myObjectp->some_other_method(myObjectp,1,2,3);
Используя эти старые компиляторы, код C был переведен на ассемблерный или машинный код. Вам нужно только знать, как обрабатываются структуры в коде ассемблера и как обрабатываются обращения к указателям на функции ...
Хотя современные компиляторы больше не конвертируют код C ++ в код C, полученный в результате код ассемблера по-прежнему выглядит одинаково как если бы вы сначала выполнили шаг C ++-to-C.
«new» и «delete» приведет к вызову функций для функций памяти (вместо этого вы можете называть «malloc» или «free» ), вызов конструктора или деструктора и инициализация структурных элементов.
free()
не гарантируется совместимость с памятью, выделенной new
, и наоборот. Да, они оба доступны на C ++, но вы должны рассматривать их как отдельные распределители.
– Peter Cordes
5 November 2017 в 11:31