我想使用Vala破解现有的基于GLib的C项目.
基本上我正在做的是,在我的构建过程开始时,使用valac从我的.vala文件生成.c和.h文件,然后按照我任何.c或.h文件的方式编译生成的文件.
这可能不是最好的方式,但似乎在大多数情况下工作正常.
我的问题是我很难从Vala代码访问现有的C代码.是否有捷径可寻?
我已经尝试编写自己的.vapi文件(我对vala附带的工具没有任何好运),但我找不到任何关于如何编写这些文件的体面文档.
有没有?我是否需要其中一个文件来调用现有的C代码?
我有以下两个用于发送和接收数据包的功能.
void send(std::string protocol)
{
char *request=new char[protocol.size()+1];
request[protocol.size()] = 0;
memcpy(request,protocol.c_str(),protocol.size());
request_length = std::strlen(request);
boost::asio::write(s, boost::asio::buffer(request, request_length));
}
void receive()
{
char reply[max_length];
size_t reply_length = boost::asio::read(s, boost::asio::buffer(reply, request_length));
std::cout << "Reply is: ";
std::cout.write(reply, reply_length);
std::cout << "\n";
}
Run Code Online (Sandbox Code Playgroud)
问题与此部分有关,boost::asio::buffer(reply, request_length)其中请求长度是在发送数据包时最初设置的字符串的长度.如何在不知情的情况下检查缓冲区的大小request_length?另一个问题是如何防止缓冲区溢出?
看看下面的OpenGL函数:
void glTexImage2D(GLenum target,
GLint level,
GLint internalFormat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid * data);
Run Code Online (Sandbox Code Playgroud)
我知道参数格式和类型描述了图像数据的格式和类型,但是我不了解参数internalFormat.我应该如何在我的应用程序中设置它的值?
例如,我创建一个这样的纹理:
glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE8,size,size,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,buffer);
Run Code Online (Sandbox Code Playgroud)
当我在我的GLSL着色器中使用它的纹理时,我得到的值似乎在[0,1] .WHy之间?它不应该在[0,255]之间吗?
我的着色器代码的一部分是:
vec = EntryPoint + delta_dir * texture(noiseTex,EntryPoint.xy * 32).x;
Run Code Online (Sandbox Code Playgroud)
我的C++代码的一部分:
for (int i = 0;i < temp;++i)
{
buffer[i] = 255.0 * rand() / (float)RAND_MAX;
}
glGenTextures(1,&noiseTex);
glActiveTexture(GL_TEXTURE0 + activeTexUnit);
glBindTexture(GL_TEXTURE_2D,noiseTex);
glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE8,size,size,
0,GL_LUMINANCE,GL_UNSIGNED_BYTE,buffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Run Code Online (Sandbox Code Playgroud)