- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚刚完成了一个用 C 编写的小 dll。它是第 3 方软件和占星术 dll 之间的接口(interface)。基本上,它根据出生日期、时间、经度和纬度获取沿黄道的占星术宫位经度。因为第 3 方软件需要一个返回字符串,所以我将房屋经度转换为 ascii,并使用 sprintf 将它们与逗号串在一起。如果我在函数“housecusps”中声明返回字符串“retrnString”,我的变量就会损坏(主要是“indx”)。然而,一旦“retrnString”被声明为全局的,它就可以完美地工作。谁能解释一下为什么???
#include <stdio.h>
#include <windows.h>
#include "swephexp.h"
#include "Wave59_SDK.h"
typedef int32 (*JULDAYPTR)(int32, int32, int32, int32, int32, double, int32, double*, char*);
typedef int (*HOUSECUSPSPTR)(double, double, double, int, double*, double*);
char retrnString[96];
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ );
char* __declspec(dllexport) housecusps(WAVE59_DATASTRUCT *price_ptr, int currentptr,
int *int_args,int num_int_args,double *double_args,
int num_double_args,char **string_args,int num_string_args)
{
int32 iyear = int_args[0];
int32 imnth = int_args[1];
int32 iday = int_args[2];
int32 ihr = int_args[3];
int32 imin = int_args[4];
int32 gregflag = SE_GREG_CAL;
double dret[2], cuspArray[13], ascmc[10], julianDays;
char serr[256];
const double zeroSecs = 0;
int hsys = 'P';
int ctr, indx;
JULDAYPTR JulDay;
HOUSECUSPSPTR HouseCusps;
HINSTANCE astrologyDLL = LoadLibrary("c:\\sweph\\bin\\swetrs32.dll");
if (astrologyDLL == NULL)
return "Error loading swedll32.dll";
JulDay = (JULDAYPTR)GetProcAddress(astrologyDLL, "_swe_utc_to_jd@40");
if (JulDay == NULL)
return "Error loading swe_utc_to_jd";
if (JulDay(iyear,imnth,iday,ihr,imin,zeroSecs,gregflag,dret,serr) == ERR)
return serr;
julianDays = dret[1];
HouseCusps = (HOUSECUSPSPTR)GetProcAddress(astrologyDLL, "_swe_houses@36");
if (HouseCusps == NULL)
return "Error loading swe_houses";
/*//Parms:- dret[1] = Julian day in UT, double_args[0] = Latitude, double_args[1] = Longitude.*/
if (HouseCusps(julianDays,double_args[0],double_args[1],hsys,cuspArray,ascmc) == ERR)
return "Error in swe_houses";
indx = 0;
for (ctr = 1;ctr < 13; ctr++)
{
indx += sprintf(retrnString + indx,"%.3f",cuspArray[ctr]);
if (ctr != 12)
indx += sprintf(retrnString + indx ,"%c",',');
}
FreeLibrary(astrologyDLL);
return retrnString;
}
最佳答案
如果你把 char retrnString[96];
放在 func housecusps(...)
中,当你从那个函数,这个堆栈空间将被清除,这就是它被破坏的原因。
还有一些方法可以从函数中“返回/获取”这样的内容,
一个全局变量 char retrnString[96];
就像您所做的一样。
malloc
一个内存来保存内容并返回它,然后记得稍后释放
它
注意事项:
更好的选择是让函数接受输出缓冲区作为参数。否则,如果调用者使用不同的分配器或不同的内存池,这里的第二个选项(malloc
内部)可能会出现问题。 ---- 来自@Matt McNabb
使用全局变量作为返回值的主要缺点是您的代码变得不可重入。不能有两个线程同时调用该函数。此外,调用函数一次后,您必须在第二次调用函数之前以第一个值结束,或者在进行第二次调用之前复制第一次调用中的字符串。 ----来自@Jonathan Leffler
的评论关于c - sprintf 给出未定义的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31307040/
我在使用带有 vector STL 的迭代器时遇到了这个错误。 代码:- #include #include void print_vec(std::vector vec) { auto
JAVA:两个引用“p”&&“pp”之间有区别吗? PrintStream p = new PrintStream(System.out); p.println("lol");
我尝试从主分支中拉出,但收到错误消息: $ git --no-optional-locks -c color.branch=false -c color.diff=false -c color.sta
我面临着一个让我抓狂的问题! 我有一个函数,这个: void load_weapons3(t_env *e, char *name, int x, t_weapon *w) { char
我正在尝试使用 CUDA 中的最小值、最大值、总和和平均值实现并行归约。 这是我目前的主要代码片段。 int main() { const auto count = 8; const
我知道 double free 或 corruption 错误通常是对 big 3 的违规,但在这种情况下,我找不到违规发生的地方。我有一个复制构造函数、析构函数和赋值运算符,适用于任何处理指针的东西
GTK+ 中的“focus”和“focus-in(out)-event”信号有什么区别?哪个先发射?它们与键盘(TAB)和鼠标点击有什么关系。他们互相依赖吗? 我问这个是因为我想在顶层窗口中跟踪当前聚
*** glibc detected *** /home/ghoshs/workspace/Simulator/Debug/Simulator: double free or corruption (
#include #include #include #include using namespace std; #define MAX_WEIGHT 1000000 class Set {
我在服务器上有两个分支一个叫 R2 的分支和一个叫 DEV 的分支我无意中登录了错误的服务器,进入了存储库并执行了GIT pull 源开发但是存储库在 R2 上。所以我意识到我的错误然后尝试通过做一个
我有一个包含循环的大约 1000 个顶点和 3000 个边的有向图。 我试图从给定的顶点找到所有下游(出)路径。 使用以下 Gremlin 查询时 g.V(45712).repeat(out().si
使用 Delphi XE 2 我试图确定缩放方向以将缩放效果应用于图像(TImage),但没有找到执行此操作的函数,并且图像的 OnGesture 事件中的 EventInfo 属性没有此信息. 我见
我正在尝试创建一个 Zoom_image 函数,它使用离散傅里叶变换来缩放灰度图像。如果图像大小小于或等于 4*4 但大小增加,我包含的代码可以工作。它给出“双重释放或损坏(出)中止(核心转储)”错误
当我执行 popAll 函数时,出现以下错误: 双重释放或腐败(出)中止(核心转储) 我想我已经将错误来源缩小到了这个函数。 IntegerStack 是我制作的一个简单的 ADT,其中包含一个名为
我有网络开发背景,我正在尝试创建类似于 this technique 的东西适用于 iOS(使用 Cocoa/Obj C)。我在谷歌搜索资源时遇到了很多困难,因为 iOS 中的“视差”往往指的是 iO
我想实现一个 faceted search对于我的一个项目。我正在使用 PHP5、Mysql 和 Symfony 1.4。显然社区指向Apache Solr这似乎正是我想要完成的。 问题是该网站将在不
我知道有 questions floating around当您没有提供明确的分支名称时,关于来自特定分支的 git pull,但是我想知道即使用户确实指定了不同的分支,是否也可以强制 pull 分支
我正在尝试将我的更改推送到 NAS 上的存储库。它以我无法理解的方式失败。 documentation声明默认情况下 push 仅适用于快进更新。很公平。所以我做了一个 git pull(我的 Rem
我刚开始使用 Oracle 的 Coherence 缓存,我注意到这一点:如果我在缓存中放入一个 ConcurrentHashMap 对象,当我检索它时,我可以看到它被转换为一个普通的 HashMap
我尝试创建一个连接到数据库的线程,从那里获取一些数据并打印到控制台。问题是当该线程完成时抛出异常: 双重免费或腐败(出局)中止(核心转储) 我尝试使用 sqlite3 和 pthread,但这两个并不
我是一名优秀的程序员,十分优秀!