我准备将我在Applescript和Objective C中编写的项目转移到Excel / VBA / dll。我已经开始使用Objective C函数,我想将它放在一个dll中并通过VBA调用。
首先,我是一名统计学家,他通过等量的运气,反复试验和坚持不懈的努力,设法建立了原始的Mac程序(一种非常方便的统计工具)。请考虑到这一点(如果答案非常明显)。我已经使用这个(减去64位部分)作为dll的起点:https://sites.google.com/site/jrlhost/links/excelcdll
Objective C是C,带有特殊的Obejctive C代码,可以让它与Applescript以及项目的其余部分进行对话,所以理论上应该很容易用它用C语言编写dll。
但我已经遇到了所有功能中最微小的问题。我相信它可以更有效地完成,但是现在我需要知道为什么它无法工作如果我能够将更大的函数从Objective C转移到C。
这是我正在尝试的C代码:
int _stdcall game(int *games, int *gameskifte)
{
if (*games == 0){
if (*gameskifte == 1) return *games + 1;
else return *games + 2;}
else{
if (*games < 3){
if (*gameskifte == 2) return *games + 2;
else return *games + 4;}
else{
if (*gameskifte == 2) return *games + 3;
else return games + 5;
}
}
return 0;
}
这是代码应该做的事情:
它做的是忽略gameshift的值,并且总是返回游戏+4
我试图改变一些事情......
此代码(所有比较均为“&lt;”但结果应相同)
int _stdcall game(int *games, int *gameskifte)
{
if (*games < 1){
if (*gameskifte < 2) return *games + 1;
else return *games + 2;}
else{
if (*games < 3){
if (*gameskifte < 2) return *games + 2;
else return *games + 4;}
else{
if (*gameskifte < 2) return *games + 3;
else return games + 5;
}
}
return 0;
}
总是给我游戏+ 1
这个(所有比较都是“&gt;”,结果不应该与上面相同):
int _stdcall game(int *games, int *gameskifte)
{
if (*games > 1){
if (*gameskifte > 2) return *games + 1;
else return *games + 2;}
else{
if (*games > 3){
if (*gameskifte > 2) return *games + 2;
else return *games + 4;}
else{
if (*gameskifte > 2) return *games + 3;
else return games + 5;
}
}
return 0;
}
总是给我游戏+5
因此,当进行返回计算时,它知道*游戏的值,但是当将*游戏与另一个硬编码值进行比较时,在执行直接或“&gt;”时会抛出错误做任何“&lt;”时比较和肯定比较无论价值是低还是高。
项目的其余部分是
def文件:defFile.def:
LIBRARY ”minfil”
EXPORTS
game=game
VBA:
Private Declare Function game Lib "c:\users\musholm\documents\visual studio 2013\Projects\mitprojekt\Debug\mitprojekt.dll" (ByRef games As Integer, ByRef gameskifte As Integer) As Integer
Function game1(games As Integer, gamesskifte As Integer) As Integer
game1 = game(games, gamesskifte)
End Function
Excel函数是= game1(x,y)
最后我想尝试在C中重新创建最初的目标:
- (NSNumber *)game:(NSNumber *)games gamechange:(NSNumber *)gameskifte
{
int gamesab = [games intValue];
int gameskifteab = [gameskifte intValue];
int gamesud = 0;
if (gamesab == 0){
if (gameskifteab == 1) gamesud=1;
else gamesud=2;}
else{
if (gamesab<3){
if (gameskifteab==1)gamesud=gamesab+2;
else gamesud=gamesab+4;}
else{
if (gameskifteab==1)gamesud=gamesab+3;
else gamesud=gamesab+5;
}
}
return [NSNumber numberWithInt:gamesud];
}
答案 0 :(得分:0)
VBA的Integer
对应于C short
您需要函数参数和VBA中的返回值As Long
。
您还错过了*
中的else return games + 5;
。虽然您首先不需要*
,但应将其全部删除,并使用ByVal
在VBA中重新声明函数参数。