Правильный тип для дескрипторов в интерфейсах C

Чтобы рассчитать мощность матрицы, вы можете использовать пакет expm или пакет matrixcalc:

A <- toeplitz(c(1,2,3)) # a square matrix
A
#       [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    2    1    2
# [3,]    3    2    1

library(expm)
A %^% 2
#       [,1] [,2] [,3]
# [1,]   14   10   10
# [2,]   10    9   10
# [3,]   10   10   14

library(matrixcalc)
matrix.power(A, 2)
#       [,1] [,2] [,3]
# [1,]   14   10   10
# [2,]   10    9   10
# [3,]   10   10   14

Для графика:

powers <- 0:8
Apowers <- lapply(powers, function(k) A %^% k)
norms <- sapply(Apowers, norm, type = "1")

plot(powers, norms)
15
задан Laserallan 10 May 2009 в 10:18
поделиться

3 ответа

Если вы посмотрите, как Microsoft определяет свои дескрипторы winapi (winnt.h), то на самом деле это выглядит так:

struct HWND__ { int unused; }; typedef struct HWND__ *HWND

фактически у них есть макрос для этого:

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

, так что ... это похоже, что это обычная практика. К сожалению, я не могу сделать еще одно предложение, кроме этого, которое вы уже упоминается, но я надеюсь, что это все равно поможет.

14
ответ дан 1 December 2019 в 02:46
поделиться

Использовать непрозрачную структуру. Это хорошая идея во многих случаях при определении интерфейса к библиотеке на C: это улучшает модульность, скрывает ненужные детали

. Как сказал JamieH, вы получаете непрозрачную структуру, объявляя - но не определяя - структуру. Совершенно допустимо иметь и передавать указатели на непрозрачную структуру в функции библиотеки в качестве аргументов и возвращать их как значения. Однако пользователи библиотеки не могут создавать или изменять объекты непрозрачной структуры, поскольку ее размер и содержимое неизвестны.

Стандартная библиотека C и многие другие уже используют этот подход, поэтому он должен быть знаком. Канонический пример - использование FILE * : fopen () создает и инициализирует структуру и возвращает указатель на нее,

8
ответ дан 1 December 2019 в 02:46
поделиться

I think you can just declare, but not define, the source structures:

struct MyType1;

typedef struct MyType1* MyType1Handle;

3
ответ дан 1 December 2019 в 02:46
поделиться