将整数与从VBA调用的dll中的硬编码值进行比较的问题

时间:2015-03-29 09:27:04

标签: c excel-vba dll vba excel

我准备将我在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;
}

这是代码应该做的事情:

  • 如果games = 0且gameskifte = 1,则返回1
  • 如果游戏= 0(默认情况下,gameskifte不是1),则返回2
  • 如果游戏&lt; 3和gameskifte = 1,返回游戏+ 2
  • 如果游戏&lt; 3(默认情况下,gameshift不是1),返回游戏+ 4
  • 如果游戏&gt; 2和gameskifte = 1,返回游戏+ 3
  • 如果游戏&gt; 2(默认情况下,gameshift不是1),返回游戏+ 5

它做的是忽略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];
 }

1 个答案:

答案 0 :(得分:0)

VBA的Integer对应于C short 您需要函数参数和VBA中的返回值As Long

您还错过了*中的else return games + 5;。虽然您首先不需要*,但应将其全部删除,并使用ByVal在VBA中重新声明函数参数。