我有一个一维数组int *data
,我知道它的数量rows
和cols
有效存储.也就是说,我可以(i,j)
通过使用类似的东西来访问二维矩阵的元素data[i*cols+j]
.
具体来说,这些存储在结构中:
typedef struct {
int *data;
int rows;
int cols;
} matrix_t;
Run Code Online (Sandbox Code Playgroud)
在过去的某个时刻,我也写了这个巫毒代码:
#define MATRIXP(m) __typeof__(__typeof__(__typeof__(*((m).data))[(m).cols]) *)
#define MATRIXD(m) ((MATRIXP(m)) ((m).data))
Run Code Online (Sandbox Code Playgroud)
有了这些定义,我能够做到:
MATRIXP(matrix) m = MATRIXD(matrix);
Run Code Online (Sandbox Code Playgroud)
然后我可以使用矩阵m
作为二维矩阵指针进行访问data
.
m[3][2] = 5; /* assign the element in row 3 and column 2 */
Run Code Online (Sandbox Code Playgroud)
这非常好,意味着我不需要记住总是有一个表达式data[i*cols+j]
.但是,我不久前写了这段代码,现在我不记得它是如何工作的.
有人可以准确解释所有这些__typeof__
运营商是如何工作的,以及如何阅读类似的表达方式?变量的类型是m
什么?
我知道它扩展到类似的东西:
__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *) m = ((__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *)) ((matrix).data));
Run Code Online (Sandbox Code Playgroud)这种访问方法data
安全吗?这是最好的方法吗?
我正在尝试使用vim的compl-filename
feature(Ctrl-XCtrl-F)来完成INSERT
模式中的路径,但是我无法弄清楚如何在没有(暂时)结束完成模式的情况下遍历目录:
假设我想完成这条道路/etc/sysconfig/network-scripts/ifup
.
我希望能够做到这样的事情:
/eCtrl-XCtrl-F /etc/ /etc/sysCtrl-F /etc/sysconfig/ /etc/sysconfig/netCtrl-F /etc/sysconfig/netconsoleCtrl-N /etc/sysconfig/networkCtrl-N /etc/sysconfig/network-scripts/ /etc/sysconfig/network-scripts/ifupCtrl-Y /etc/sysconfig/network-scripts/ifup
问题是,一旦我在路径匹配(如/etc/
)之后开始键入*,它就会结束文件名完成.我希望它保持文件名完成,所以我仍然可以使用Ctrl-F,Ctrl-N等等.因为它结束完成,我必须Ctrl-XCtrl-F再次键入以重新启动它,并在此期间有用的完成弹出菜单消失.
我可以设置一个选项来改变它吗?
*通过'输入'这里,我指的是字符'isfname'
- 当然,输入其他字符(如空格或标点符号)不应该继续文件名完成.
我有一个 bash 脚本,它使用文件名作为关联数组中的键。一些文件名中有引号,我似乎找不到任何方法来取消它们。
这是从终端复制问题的示例:
$ declare -A x
$ y="key with spaces"
$ z="key with spaces and ' quote"
$ x[$y]=5 # this works fine
$ x[$z]=44 # as does this
$ echo "${x[$y]}" "${x[$z]}" # no problems here
5 44
$ unset x["$y"] # works
$ unset x["$z"] # does not work
bash: unset: `x[key with spaces and ' quote]': not a valid identifier
$ echo "${x[$y]}" "${x[$z]}" # second key was not deleted
44
Run Code Online (Sandbox Code Playgroud)
在我的脚本中处理的文件名是任意的,无论它们包含什么字符都需要工作(在合理范围内,至少需要使用可打印的字符。) unset 用于清除具有某些属性的文件上的标志。
当它们可能包含引号时,如何让 …