我想为OpenGL对象(纹理,帧缓冲区等)编写一个简单的RAII包装器.我注意到,所有glGen*
和glDelete*
函数共享相同的签名,所以我的第一次尝试是这样的:
typedef void (__stdcall *GLGenFunction)(GLsizei, GLuint *);
typedef void (__stdcall *GLDelFunction)(GLsizei, const GLuint *);
template <GLGenFunction glGenFunction, GLDelFunction glDelFunction>
class GLObject
{
GLuint m_name;
public:
GLObject()
{
glGenFunction(1, &m_name);
}
~GLObject()
{
glDelFunction(1, &m_name);
}
GLuint getName() {return m_name;}
};
typedef GLObject<glGenTextures, glDeleteTextures> GLTexture;
Run Code Online (Sandbox Code Playgroud)
它工作正常的纹理,但没有对帧缓冲器:glGenFramebuffers
和glDeleteFramebuffers
函数地址在编译时不知道,并不能作为模板参数.所以我做了第二个版本:
class GLObjectBase
{
GLuint m_name;
GLDelFunction m_delFunction;
public:
GLObjectBase(GLGenFunction genFunc, GLDelFunction delFunction)
: m_delFunction(delFunction)
{
genFunc(1, &m_name);
}
GLuint getName()
{
return m_name;
}
protected:
~GLObjectBase()
{ …
Run Code Online (Sandbox Code Playgroud) perl字符串如何在内部表示?使用什么编码?如何正确处理不同的编码?
我已经使用perl很长一段时间了,但它不包括很多字符串处理在不同的编码,当我遇到一个与编码有关的小问题时,我通常采取一些萨满行动.
直到这一刻我才将perl字符串视为字节序列,这对我的任务非常适合.现在我需要对UTF-8编码文件进行一些处理,这里就麻烦了.
首先,我将文件读入字符串,如下所示:
open(my $in, '<', $ARGV[0]) or die "cannot open file $ARGV[0] for reading";
binmode($in, ':utf8');
my $contents;
{
local $/;
$contents = <$in>;
}
close($in);
Run Code Online (Sandbox Code Playgroud)
然后只需打印它:
print $contents;
Run Code Online (Sandbox Code Playgroud)
我得到两件事:警告Wide character in print at <scriptname> line <n>
和控制台中的垃圾.所以我可以得出结论,perl字符串有一个"字符"的概念,可以是"宽"或不是,但是当打印时,这些"宽"字符在控制台中表示为多个字节,而不是单个"字符".(我现在想知道为什么我以前使用二进制文件的所有经验都非常适合我预期它在没有任何"字符"问题的情况下工作的方式).
为什么然后我在控制台看到垃圾?如果perl在某些已知编码中将字符串存储为字符,我认为找到控制台编码和正确打印文本并不是一个大问题.(我使用Windows,BTW).
如果perl将字符串存储为可变宽度字符序列(例如,使用相同的UTF-8编码),为什么这样做?从我的C经验来看,处理字符串是PAIN.
更新.
我使用两台计算机进行测试,一台运行安装了英语语言包的Windows 7 x64,但使用ActivePerl 5.10.1 x64进行俄语区域设置(因此我将cp866作为OEM代码页,cp1251作为ANSI); 另一个运行Windows XP 32位俄语本地化与Cygwin Perl 5.10.0.
感谢链接,现在我对正在发生的事情以及应该如何完成工作有了更深刻的理解.
我正在使用带有IR接收器的WinLIRC连接到Windows 7 x64上的串行端口COM1.WinLIRC
添加到Startup文件夹(开始 - >所有应用程序 - >启动),所以每次登录时都会启动.很多时候(但不是所有时间)我看到初始化错误消息WinLIRC
,持续一段时间(几分钟)如果我重试初始化,并在一些重试后,它正确初始化并正常工作.如果我从启动中删除它并在任何其他时刻手动启动它启动没有错误.
我已经在这里和那里下载了WinLIRC
源代码并添加了MessageBox
调用,因此我可以看到初始化期间发生的情况并发现CreateFile
调用失败:
if((hPort=CreateFile(
settings.port,GENERIC_READ | GENERIC_WRITE,
0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0))==INVALID_HANDLE_VALUE)
{
char buffer[256];
sprintf_s(buffer, "CreateFile(%s) failed with %d", settings.port, GetLastError());
MessageBox(NULL, buffer, "debug", MB_OK);
hPort=NULL;
return false;
}
Run Code Online (Sandbox Code Playgroud)
我看到消息框说"CreateFile(COM1)失败了5",5是根据此链接 "拒绝访问"错误的错误代码.
所以问题是为什么在启动Windows之后打开COM端口会出现这样的错误并在几秒钟或几分钟之后正常进行?
更新:COM端口是真实的.
Update2:关于之前打开串口的其他应用程序WinLIRC
.我做了以下操作:我将Process Explorer放到Startup文件夹中,因此它也会在登录时启动,然后重新启动.一旦进程浏览器启动,我运行"查找句柄或Dll"对话框,将"Serial0"放入输入并点击"搜索".到那时,WinLIRC已经显示消息框,说"CreateFile(COM1)失败了5".然后我等到进程资源管理器搜索结束,看到它什么也没找到,然后尝试重新初始化WinLIRC并再次失败.所以我建议不是其他应用程序打开串口的情况.如果有人能提出更好的检查方法,我会很高兴地重新检查.
当我在WinLIRC运行时在进程资源管理器中搜索"Serial0"时,它会找到该winlirc.exe
进程,因此看起来它是正确的搜索术语.
Update3:关于串行鼠标驱动程序.它不是在设备管理器中列出,所以我没能有禁用它,但是我发现这对如何禁用指令sermouse
服务,并没有帮助.
Update4:我还忘了提一件事.只有在我启动PC后很快登录才会发生这种情况.如果我在登录屏幕上将窗口保留几分钟并稍后登录,则WinLIRC会始终初始化而不会出现任何问题.
Update5:不幸的是,我无法访问出现此问题的计算机,因此我无法再进行实验了.
我有一个带有表单模板的.erb文件,它使用form_for
帮助器生成表单,并使用text_field
方法生成一些字段.在结果HTML中,我看到size
属性被添加到使用上述方法生成的每个输入.
我想用CSS控制输入大小,该size
属性阻止我这样做.有没有办法告诉text_field
方法我不想要它们?
我试图:size => nil
将该方法作为选项传递,但这没有帮助.
我需要从Flash发送一个类似于以下内容的HTTP请求(并获取XML响应):
http://example.com/somepath?data=1&data=2&data=3
Run Code Online (Sandbox Code Playgroud)
即具有多个共享相同名称但具有不同值的参数.
到目前为止,我使用以下代码来发出HTTP请求:
var resp:XML = new XML();
resp.onLoad = function(success:Boolean) {/*...*/};
resp.ignoreWhite = true;
var req:LoadVars = new LoadVars();
req["someParam1"] = 3;
req["someParam2"] = 12;
req.sendAndLoad("http://example.com/somepath", resp, "GET");
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这不会:只有一个参数具有最后一个值.
我有什么选择?我正在使用动作2.
添加
我想,我可以这样做:
var url:String = myCustomFunctionForBuildingRequestString();
var resp:XML = new XML();
resp.onLoad = function(success:Boolean) {/*...*/};
resp.load(url);
Run Code Online (Sandbox Code Playgroud)
但在那种情况下,我失去了执行POST请求的能力.任何替代品?
更改请求不合适.
我有一个自托管的WCF服务,其端点设置使用WebHttpBinding监听HTTP请求.我需要访问通过这些请求传递的cookie.我可以得到Cookie:
标头值,但我坚持实际解析.我的实现尝试使用CookieContainer
:
var container = new CookieContainer();
var uri = new Uri("http://localhost/");
container.SetCookies(uri, cookieHeader);
var cookies = container.GetCookies(uri).OfType<Cookie>();
foreach (var cookie in cookies)
{
Console.WriteLine("{0} = {1}", cookie.Name, cookie.Value);
}
Run Code Online (Sandbox Code Playgroud)
这段代码的问题是,CookieContainer
期望cookie用逗号(cookieHeader="c1=v1,c2=v2"
)分隔,而浏览器倾向于使用分号(cookieHeader="c1=v1;c2=v2"
).由于RFC 6265只允许使用分号作为分隔符(虽然旧的RFC允许),我有点困惑为什么CookieContainer
只支持逗号.现在我正在努力寻找一个似乎非常典型的问题的替代解决方案.如何正确解析cookie?ASP.NET应该能够做到这一点,它是否公开了任何可公开使用的类?
我有一个perl脚本,用俄语向控制台输出一些信息.脚本将在多个操作系统上执行,因此控制台编码可以是cp866,koi8-r,utf-8或其他一些.有没有一种可移植的方法来检测控制台编码,所以我可以相应地设置STDOUT,以便正确打印文本?
我ILoggerFactory
在 Autofac 容器中注册了一个实现。我希望能够使用 Autofac 注册以下类并能够实例化它:
public class Test
{
public Test(ILogger<Test> logger)
{
logger.LogInformation("Works!");
}
}
Run Code Online (Sandbox Code Playgroud)
为此,我需要能够“教” Autofac 生成实现ILogger<T>
任何类的实例T
。有一个ILoggerFactory
扩展方法CreateLogger<T>()
,并CreateLogger(Type)
认为能够生产所需类型的实例,但我不能换我围绕着如何使Autofac打电话给他们的头。
如果我想要非泛型ILogger
,我会写
containerBuilder.Register(c => c.Resolve<ILoggerFactory>().CreateLogger("default"))
Run Code Online (Sandbox Code Playgroud)
但我不确定如何处理通用的。任何指针?
更新:阅读更多文档后,我想出了这个:
public class LoggingModule: Autofac.Module
{
private readonly MethodInfo mi;
public LoggingModule()
{
this.mi = typeof(LoggerFactoryExtensions)
.GetMethod(nameof(LoggerFactoryExtensions.CreateLogger), new[] { typeof(ILoggerFactory) });
}
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
registration.Preparing += OnComponentPreparing;
}
private void OnComponentPreparing(object sender, PreparingEventArgs …
Run Code Online (Sandbox Code Playgroud) 我想了解在boost :: spirit :: qi的引擎下究竟发生了什么.假设我们有简单的解析器,它解析并计算由数字和加/减操作组成的表达式:
int main()
{
std::string INPUT_DATA = "12e-1 + 3.4 - .67";
typedef std::string::iterator iterator_type;
iterator_type begin = std::begin(INPUT_DATA);
iterator_type end = std::end(INPUT_DATA);
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::qi::ascii;
auto parser = qi::double_[qi::_val = qi::_1] // (1)
>> *(
(qi::lit('+') >> qi::double_[qi::_val += qi::_1]) // (2)
|
(qi::lit('-') >> qi::double_[qi::_val -= qi::_1]) // (3)
);
double result;
bool ok = qi::phrase_parse(begin, end, parser, ascii::space, result);
if ( ok && begin == end)
{
std::cout …
Run Code Online (Sandbox Code Playgroud) 我有一个powershell脚本,使用call运算符运行一些可执行文件.像这样的东西:
$executable = 'c:\dev\test.exe'
& $executable | Out-Host
Write-Host 'done'
Run Code Online (Sandbox Code Playgroud)
这test.exe
反过来运行另一个程序(server.exe
)并通过TCP/IP与它通信(这个程序需要管理权限,因此我的powershell脚本以管理员身份运行),它也运行琐碎的批处理脚本(运行并在1秒内终止) .一旦启动,server.exe
运行直到终止test.exe
.涉及的所有程序都是控制台应用 另一个值得注意的事实是,由于server.exe
需要管理员权限,因此它在单独的控制台窗口中运行test.exe
.
有时 test.exe
不会终止server.exe
(有时由于崩溃,有时是由于其中的错误).发生这种情况时,test.exe
终止执行后不会返回powershell脚本(我没有看到'done'被打印).如果我server.exe
手动终止,我会立即在powershell控制台中看到"完成".为什么会这样?为什么powershell会等待进程终止它尚未启动但哪个甚至不在同一个控制台中运行?
在我的调查尝试中,我尝试用我创建的少量代码来重现问题,这些代码test2.exe
只是简单地运行server.exe
(完全相同的方式,我可以访问test.exe
源代码)并终止.现在,当我运行相同的powershell脚本但是使用test2.exe
as时$executable
,我看到了我最初期望看到的内容:server.exe
在单独的窗口中启动,然后在powershell窗口中打印'done'(并且powershell脚本终止),同时server.exe
仍然运行.
我在test.exe
运行时看过Process Explorer ,我确信server.exe
在test.exe
终止后没有其他进程正在运行.
我没有找到任何深入解释&
操作员做什么以及等待什么,也许你有一些想法?
更新:我尝试使用调用运算符而不是运行Start-Process
:
$executable = 'c:\dev\test.exe'
Start-Process $executable -Wait
Write-Host 'done'
Run Code Online (Sandbox Code Playgroud)
现在test.exe
在它自己的控制台中运行,终止并且powershell仍然等待server.exe
完成.
我也尝试运行批处理脚本:
c:\dev\test.exe …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个简单的抽象类,以便多个子类可以实现一个方法.
我的抽象类:Component.h
#ifndef COMPONENT_H
#define COMPONENT_H
class Component {
public:
virtual void draw() = 0;
};
#endif
Run Code Online (Sandbox Code Playgroud)
实现的类:指令Memory.cpp
#include <Component.h>
#include <GL/gl.h>
using namespace std;
class InstructionMemory : public Component {
private:
float width = 145;
float height = 180;
public:
void Component::draw() {
glBegin(GL_QUADS);
glVertex2f(0, 0);
glVertex2f(0, height);
glVertex2f(width, height);
glVertex2f(width, 0);
glEnd();
}
};
Run Code Online (Sandbox Code Playgroud)
现在,我收到一个错误:"无法在'InstructionMemory'中定义成员函数'Component :: draw'."
正如您所看到的,我正在尝试创建一个OpenGL项目,其中每个组件都可以绘制自己.
编辑:我想如果我包含抽象类,任何实现它的类都可以.我得到的是''InstructionMemory'未在此范围内声明." 我需要制作一个InstructionMemory.h吗?这是我的完整代码:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <iostream>
#include <Math.h>
#include <my_headers/Component.h>
using namespace std;
const int WIDTH …
Run Code Online (Sandbox Code Playgroud)