小编cod*_*ard的帖子

将一维数组作为二维数组访问

我有一个一维数组int *data,我知道它的数量rowscols有效存储.也就是说,我可以(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].但是,我不久前写了这段代码,现在我不记得它是如何工作的.

  1. 有人可以准确解释所有这些__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)
  2. 这种访问方法data安全吗?这是最好的方法吗?

c arrays typeof matrix multidimensional-array

9
推荐指数
1
解决办法
1051
查看次数

在插入模式下遍历vim文件名完成的目录(Ctrl-X Ctrl-F)

我正在尝试使用vim的compl-filenamefeature(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'- 当然,输入其他字符(如空格或标点符号)不应该继续文件名完成.

vim keyboard-shortcuts autocomplete

7
推荐指数
1
解决办法
3225
查看次数

当键包含引号时取消设置关联 bash 数组中的值

我有一个 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 用于清除具有某些属性的文件上的标志。

当它们可能包含引号时,如何让 …

arrays bash associative-array escaping

5
推荐指数
1
解决办法
902
查看次数