小编SMi*_*Mir的帖子

在VBA和dll之间传递任意类型的数据

所以我正在开发一个Excel项目,它将使用VBA加载C++ dll.我想要做的是能够将没有特定类型的Excel范围(数据可以是数字或分类)传递给C++ dll(我可以描述我的Excel范围的最佳方式是类型variant).

所以步骤可能涉及:

  1. 在VBA中加载dll
  2. 将excel范围发送到dll(范围可能包含数字和/或字符串列)
  3. 操纵dll文件中excel的数据

我正在考虑使用excel变体和C++变体.但是我不清楚如何使用C++变体,因为我找不到任何好的文档.

我收到的另一个建议是使用COM编程.

我的问题:

  • 一个善良的灵魂可能会为我提供如何进行的指示吗?(例如,通过提供C++原型,以及如何处理变体的简单示例)
  • 有没有人知道任何关于使用C++ Variants(也许还有VBA)的好文档/教程?
  • 如果速度是一个问题,使用COM优先使用VARIANTS吗?
  • 使用C API是一个选项吗?

更新:

  • 我需要操作的范围的大小可能很大(约500,000行).
  • 速度是一个因素,因此,我希望尽可能避免不必要的复制.

com dll excel vba variant excel-vba

6
推荐指数
1
解决办法
1846
查看次数

以编程方式在VBA代码中设置断点

我有一大堆用VBA编写的代码(> 50,000行 - 大量模块).有一个我感兴趣的数组,我想找到这个数组的任何元素的值发生变化的所有条件.值可以在任何模块中更改.由于代码的大小,逐行运行脚本不是最有效的选项.

我正在寻找更好的方法来解决这个问题.我想到的两种方法是以编程方式设置断点(我不确定是否可以完成)或以编程方式在每次赋值后插入一个if块,以某种方式提醒我值已更改.(不是优选的).

所以我的问题归结为:

  1. 是否可以在VBA代码中以编程方式设置断点?
  2. 如果上述问题的答案为,那么解决这个问题的有效方法是什么?

更新: 感谢您的评论/回复.正如我暗示的那样,我感兴趣的是对当前代码的最少量修改(即插入if-blocks等)并且最感兴趣的是断点概念.我想知道它是否可行.

excel vba breakpoints excel-vba

6
推荐指数
3
解决办法
1万
查看次数

在C++中未读取文件

我正在尝试读取同时写入磁盘的文件.我需要阅读特定大小的块.如果读取的大小小于特定大小,我想要读取文件(类似于ungetc所做的,而不是char []),然后再试一次.附加到已读取的字节对我来说不是一个选项.

这怎么可能?

我尝试通过以下方式保存当前位置:

FILE *fd = fopen("test.txt","r+");
fpos_t position;
fgetpos (fd, &position);
Run Code Online (Sandbox Code Playgroud)

然后读取文件并将指针放回其前面的位置.

numberOfBytes = fread(buff, sizeof(unsigned char), desiredSize, fd) 
if (numberByBytes < desiredSize) {
    fsetpos (fd, &position);
}
Run Code Online (Sandbox Code Playgroud)

但它似乎没有奏效.

c c++ io fstream libc

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

如何对齐16位整数以与SSE内在函数一起使用

我正在使用定义为16位整数的二维数组

int16_t e[MAX_SIZE*MAX_NODE][MAX_SIZE];
int16_t C[MAX_SIZE][MAX_SIZE];
Run Code Online (Sandbox Code Playgroud)

其中Max_SIZEMAX_NODE是恒定值.我不是一个专业的程序员,但是在StackOverflow的人的帮助下,我设法写了一段代码,在我的数据上部署SSE指令并实现了显着的加速.目前,我正在使用不需要数据对齐的内在函数(主要_mm_loadu_si128_mm_storeu_si128).

for (b=0; b<n; b+=8){
    v1 = _mm_loadu_si128((__m128i*)&C[level][b]); // level defined elsewhere.
    v2 = _mm_loadu_si128((__m128i*)&e1[node][b]); // node defined elsewhere.
    v3 = _mm_and_si128(v1,v2);
    _mm_storeu_si128((__m128i*)&C[level+1][b],v3);
}
Run Code Online (Sandbox Code Playgroud)

当我将内在函数更改为对齐数据(即_mm_load_si128_mm_store_si128)时,我得到运行时错误,这导致我假设我的数据没有正确对齐.

我现在的问题是,如果我的数据没有正确对齐,我如何调整它以便能够使用相应的内在函数?我想因为整数是16位,它们会自动对齐.但我似乎错了!

任何有关这方面的见解将受到高度赞赏.

谢谢!

c sse simd memory-alignment sse2

2
推荐指数
1
解决办法
4962
查看次数

如何使用SSE逻辑指令

我需要一些关于如何在 Visual Studio 上使用 SSE 逻辑指令的帮助。基于MSDN 网站

__m128 _mm_and_ps(__m128 a , __m128 b );
ANDPS
Run Code Online (Sandbox Code Playgroud)

可用于对操作数ab执行逻辑与操作。但我无法弄清楚获取结果所需的确切步骤(内存加载和初始化、设置、存储等)。

具体来说,我想知道如何:

  1. 执行操作,
  2. 返回结果,然后
  3. 获得结果的大小(有效位数)。

有人可以在一个例子中告诉我如何做到这一点吗?

谢谢!

x86 sse simd

0
推荐指数
1
解决办法
806
查看次数

标签 统计

c ×2

excel ×2

excel-vba ×2

simd ×2

sse ×2

vba ×2

breakpoints ×1

c++ ×1

com ×1

dll ×1

fstream ×1

io ×1

libc ×1

memory-alignment ×1

sse2 ×1

variant ×1

x86 ×1