Функции сборки вызовов с указателями функций [duplicate]

Вы хотите использовать распределяемые массивы:

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
5
задан Peter Cordes 6 November 2015 в 03:22
поделиться

2 ответа

12
ответ дан Peter Cordes 20 August 2018 в 15:26
поделиться

(Извините, я не могу опубликовать это как «комментарий» к ответу Питера Кордеса из-за примеров кода, поэтому я должен опубликовать это как «ответ».)

Созданы старые компиляторы 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» ), вызов конструктора или деструктора и инициализация структурных элементов.

3
ответ дан Martin Rosenau 20 August 2018 в 15:26
поделиться
  • 1
    Очень хорошо. Я думал, что «это не отвечает на вопрос». но это хороший ответ > на ответ Питера. – usr2564301 6 November 2015 в 23:34
  • 2
    IIRC, free() не гарантируется совместимость с памятью, выделенной new, и наоборот. Да, они оба доступны на C ++, но вы должны рассматривать их как отдельные распределители. – Peter Cordes 5 November 2017 в 11:31
Другие вопросы по тегам:

Похожие вопросы: