首先,我必须承认我的编程技巧非常有限,我接手了一个(非常小的)现有的C++ OOP项目,我尝试将自己的东西推进去.不幸的是,我遇到的问题超出了我的知识范围.我希望在这里找到一些帮助.我正在使用第三方库(无法更改)从相机中抓取图像,并在此处使用一些占位符名称.
第三方库有一个函数"ThirdPartyGrab"来启动一个连续的实时抓取,并获取一个指向一个函数的指针,该函数将在每次新帧到达时被调用.所以在普通的C应用程序中它是这样的:
ThirdPartyGrab (HookFunction);
Run Code Online (Sandbox Code Playgroud)
"HookFunction"需要声明为:
long _stdcall HookFunction (long, long, void*);
Run Code Online (Sandbox Code Playgroud)
或"BUF_HOOK_FUNCTION_PTR",声明为
typedef long (_stdcall *HOOK_FUNCTION_PTR) (long, long, void*);
Run Code Online (Sandbox Code Playgroud)
现在我有一个C++应用程序和一个类"MyFrameGrabber",它应该封装我所做的一切.所以我将钩子函数作为私有成员放入这样的:
long _stdcall HookFunction (long, long, void*);
Run Code Online (Sandbox Code Playgroud)
在我班上还有一个公共无效函数"StartGrab",应该启动Grab.在里面我试着打电话:
ThirdPartyGrab (..., HookFunction, ...);
Run Code Online (Sandbox Code Playgroud)
(毫不奇怪)失败了.它说对MyFrameGrabber :: HookFunction的函数调用错过了参数列表,我应该尝试使用&MyFrameGrabber :: HookFunction来创建指针.但是,传递"&MyFrameGrabber :: HookFunction"会导致另一个错误,即无法将其转换为BUF_HOOK_FUNCTION_PTR.
通过阅读C++ FAQ函数指针后,我认为我理解了这个问题,但无法解决问题.我试图使钩子函数静态,但这也导致转换错误.我还想过把钩子函数放在类之外,但我需要在钩子函数中使用类函数.还有其他方式还是我需要改变我的整个概念?
编辑14.01.08:我测试了单例解决方法,因为我无法更改第三方库,并且void指针仅用于在钩子函数内使用的数据.不幸的是它并没有像我希望的那样开箱即用....我不知道静态函数是否需要在一个单独的类中,所以我把它放在我的"MyFrameGrabber"类中:
static MyFrameGrabber& instance()
{
static MyFrameGrabber _instance;
return _instance;
}
long Hook(long, long, void*); // Implementation is in a separate cpp file
Run Code Online (Sandbox Code Playgroud)
在我的cpp文件中,我有call_hook函数:
long MFTYPE call_hook(long x, MIL_ID y, void MPTYPE *z)
{
return MyFrameGrabber::instance().Hook(x,y,z);
} …Run Code Online (Sandbox Code Playgroud) 作为一个相当初级的开发人员,我遇到了一个问题,突出了我缺乏经验和我的知识漏洞.如果这里的序言太长,请原谅.
我发现自己正处于一个涉及我需要学习一些新的(对我而来)技术的项目,包括LINQ(对象来说是OBJECTS和XML).我在这一点上所读到的一切都表明,要利用LINQ,我需要完全理解以下内容(代理,匿名方法和Lambda表达式).
好的,所以现在很有趣.我曾经使用过.NET事件模型,但是我已经消费了代表,但是大多数细节都被隐藏了(感谢Microsoft!).我理解在基本层面上,委托实例是指向方法的指针(我知道这是一个过度简化的过程).
据我所知,匿名方法本质上是一种内联的未命名方法,通常(如果不是唯一的话)创建为委托的目标.
我也理解lambdas以不同的方式用于简化语法,可用于将简单的匿名方法指向委托.
请原谅我,如果我的任何描述都在这里,那么这就是我理解这些主题的基本层面.
所以,挑战:
如果我对这些项目的了解甚至更接近,至少在基本水平上有人能告诉我吗?我不是在寻找复杂的深奥细节,只是基础(现在).
在项目中应用LINQ以达到合理的效果之前,我需要在多大程度上真正理解这些概念?我想完全理解它,并愿意花时间.在我需要完成一些工作之前,我可能没有时间完全理解所有这些东西.
任何人都可以向我指出一些解释这些主题的好文章,并将它们应用到"真实世界"的例子中,这样我就可以了解这些主题和应用的基础知识吗?我的意思是现实世界,我是如何在"客户和发票"的背景下使用它而不是抽象的"矢量和形状"或"动物和奶牛".出于演示目的,这种情况可能有点人为,但希望不是严格的学术性的.我在网上和书中找到了一些例子,但似乎很少有"简单英语"的解释.
提前感谢您的耐心,时间和专业知识.
我有一块预先格式化的代码(<pre>)水平溢出,因此有一个水平滚动条允许用户查看内容.
overflow: auto;
Run Code Online (Sandbox Code Playgroud)
但是,在IE7(可能是其他IE版本)中,滚动条与我内容的最后一行重叠(当只有一行内容时,这尤其令人恼火).
我已经尝试过这里列出的解决方案,但它没有用.
唯一有效的解决方案是使用
overflow: scroll;
Run Code Online (Sandbox Code Playgroud)
它为我所有预先格式化的部分添加了一个滚动条,这非常糟糕.
注意:它在Firefox 3和Google Chrome中运行良好.
更新
我找到了一个解决方案(请参阅我的回答),但是如果有人找到了在IE7中每个预格式化部分都没有丑陋填充的方法,那将是完美的.
我很难丢掉我不想要的表达式,并保留我所做的位.
问题是 - 给定输入字符串:
{if cond}foo{else}bar{/if}
Run Code Online (Sandbox Code Playgroud)
我想要:
0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3: bar
Run Code Online (Sandbox Code Playgroud)
并为输入字符串:
{if cond}foo{/if}
Run Code Online (Sandbox Code Playgroud)
我想要:
0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3:
Run Code Online (Sandbox Code Playgroud)
我目前得到的正则表达式如下:
\{if ([a-z0-9]+)\}([^\{]*?)(((?:\{else\})?)(.*?)?)\{/if\}
Run Code Online (Sandbox Code Playgroud)
我收到以下数据:
0: {if cond}foo{else}bar{/if}
1: cond
2:
3: foo{else}bar
4:
5: foo{else}bar
Run Code Online (Sandbox Code Playgroud)
这将需要进一步解析该foo{else}bar位以获得相应的值.
我的正则表达式是否近在咫尺?
我不太关心可能会运行的数据类型 - 包括{在if语句的主体中允许打破正则表达式.值的foo和bar可以是任何不包括a的值{.
谢谢,
大教堂
有没有人有关于如何在C或C++中安装等效字典(VB6)的信息或示例?
此实现用于作为名为DLL VB6的参数传递.
我的目的是在C中创建一个Dictionary(win32使用VARIANT/ARRAYs等)并传递它来调用VB.所以我必须学习如何创建这个数据结构.
坦克.
我有一串数字,例如"123456789",我需要提取它们中的每一个以在计算中使用它们.我当然可以通过索引访问每个char,但是如何将其转换为int?
我查看了atoi(),但它需要一个字符串作为参数.因此,我必须将每个char转换为字符串,然后在其上调用atoi.有没有更好的办法?
偶尔我会遇到一些参数不舒服的方法.通常情况下,他们似乎是建设者.似乎应该有更好的方式,但我看不出它是什么.
return new Shniz(foo, bar, baz, quux, fred, wilma, barney, dino, donkey)
Run Code Online (Sandbox Code Playgroud)
我曾想过使用结构来表示参数列表,但这似乎只是将问题从一个地方转移到另一个地方,并在流程中创建另一个类型.
ShnizArgs args = new ShnizArgs(foo, bar, baz, quux, fred, wilma, barney, dino, donkey)
return new Shniz(args);
Run Code Online (Sandbox Code Playgroud)
所以这似乎不是一种改进.那么最好的方法是什么?
我正在寻找一个允许我以编程方式修改Excel文件以将数据添加到某些单元格的库.我目前的想法是使用命名范围来确定插入新数据的位置(基本上是1x1的范围),然后更新命名范围以指向数据.这个要集成的现有应用程序完全是用C++编写的,所以我理想地寻找一个C++解决方案(因此这个线程的用处有限).如果所有其他方法都失败了,我会使用.NET解决方案,如果有某种方法可以将它与我们的C++应用程序相关联.
一个理想的解决方案是开源,但到目前为止我所看到的(MyXls和XLSSTREAM)似乎都没有达到挑战.我喜欢Aspose.Cells的外观,但它适用于.NET或Java,而不是C++(并且需要花钱).我需要支持从97到现在的所有Excel格式,包括XLSX和XLSB格式.理想情况下,它还支持OpenOffice和(用于输出)PDF和HTML等格式.
我需要支持的一些用例:
任何帮助,你可以给我找到一个合适的图书馆会很棒.我还想听听一些关于各种建议的推荐(包括我的帖子中的建议),这样我就可以做出更明智的决定 - 什么方便使用,无错误,便宜等等?
我在svn.exe周围写了一个快速而又脏的包装器来检索一些内容并用它做一些事情,但对于某些输入它偶尔会重复挂起并且无法完成.例如,一个调用是svn列表:
svn list "http://myserver:84/svn/Documents/Instruments/" --xml --no-auth-cache --username myuser --password mypassword
Run Code Online (Sandbox Code Playgroud)
当我从命令shell执行此操作时,此命令行运行正常,但它在我的应用程序中挂起.运行它的我的c#代码是:
string cmd = "svn.exe";
string arguments = "list \"http://myserver:84/svn/Documents/Instruments/\" --xml --no-auth-cache --username myuser --password mypassword";
int ms = 5000;
ProcessStartInfo psi = new ProcessStartInfo(cmd);
psi.Arguments = arguments;
psi.RedirectStandardOutput = true;
psi.WindowStyle = ProcessWindowStyle.Normal;
psi.UseShellExecute = false;
Process proc = Process.Start(psi);
StreamReader output = new StreamReader(proc.StandardOutput.BaseStream, Encoding.UTF8);
proc.WaitForExit(ms);
if (proc.HasExited)
{
return output.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)
这需要整整5000毫秒,永远不会完成.延长时间并没有帮助.在一个单独的命令提示符中,它立即运行,所以我很确定它与等待时间不足无关.但是,对于其他输入,这似乎工作正常.
我也尝试在这里运行一个单独的cmd.exe(其中exe是svn.exe,而args是原始的arg字符串),但仍然发生了挂起:
string cmd = "cmd";
string arguments = "/S /C \"" + exe + " …Run Code Online (Sandbox Code Playgroud) 我有一个网页,每天,每月和每年有三个下拉菜单.如果我使用Date带有数字的JavaScript 构造函数,那么我得到一个Date当前时区的对象:
new Date(xiYear, xiMonth, xiDate)
Run Code Online (Sandbox Code Playgroud)
给出正确的日期,但由于夏令时,它认为日期是GMT + 01:00.
这里的问题是我然后将它传递Date给Ajax方法,当日期在服务器上反序列化时,它已经转换为GMT,因此丢失了一个小时,将一天移回一.现在我可以将日,月和年单独传递到Ajax方法中,但似乎应该有更好的方法.
接受的答案指出了我正确的方向,但只是单独使用setUTCHours()改变了:
Apr 5th 00:00 GMT+01:00
Run Code Online (Sandbox Code Playgroud)
至
Apr 4th 23:00 GMT+01:00
Run Code Online (Sandbox Code Playgroud)
然后我还必须设置UTC日期,月份和年份以结束
Apr 5th 01:00 GMT+01:00
Run Code Online (Sandbox Code Playgroud)
这就是我想要的.