我知道libs喜欢<map>,<vector>并且<algorithm>即使它们不存在于标准库中也可以由用户实现.
但是C++ 11 STL中的某些类或函数只是"编译器 - 魔法",无法手动实现吗?
编辑 由STL,我的意思是标准模板库,不需要额外的链接.
以下代码
#include <iostream>
#include <future>
#include <thread>
#include <mutex>
std::mutex m;
struct Foo {
Foo() {
std::unique_lock<std::mutex> lock{m};
std::cout <<"Foo Created in thread " <<std::this_thread::get_id() <<"\n";
}
~Foo() {
std::unique_lock<std::mutex> lock{m};
std::cout <<"Foo Deleted in thread " <<std::this_thread::get_id() <<"\n";
}
void proveMyExistance() {
std::unique_lock<std::mutex> lock{m};
std::cout <<"Foo this = " << this <<"\n";
}
};
int threadFunc() {
static thread_local Foo some_thread_var;
// Prove the variable initialized
some_thread_var.proveMyExistance();
// The thread runs for some time
std::this_thread::sleep_for(std::chrono::milliseconds{100});
return 1;
}
int …Run Code Online (Sandbox Code Playgroud) 在一个简单的hello-world OpenGL程序中,它简单地在窗口上绘制一个静态三角形,当我将三角形的3个顶点设置为红色,绿色和蓝色时,三角形用渐变填充.
但是当我使用这样的着色器时:
顶点着色器:
attribute vec4 aVertex;
attribute vec4 aColor;
varying vec4 vColor;
void main(void) {
gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
vColor = aColor;
}
Run Code Online (Sandbox Code Playgroud)
其中的属性aVertex和aColor来自一个顶点缓冲,通过调用传递glVertexAttribPointer.
片段着色器:
varying vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
Run Code Online (Sandbox Code Playgroud)
三角形仍然充满了渐变,这里有一个问题:
如果每个顶点计算顶点着色器,vColor则应为每个实例分配顶点的颜色.并且顶点颜色应该是红色,绿色或蓝色,如顶点缓冲区中设置的那样.
那么渐变来自哪里?
或者,换句话说,什么时候发生在碎片着色器中,vColor结果是插值颜色而不是顶点?
我在Mac OS X 10.8上使用GLFW 3.0,显卡是Intel HD Graphics 5000
我的OpenGL API版本是2.1,获得者
glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR);
glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR);
Run Code Online (Sandbox Code Playgroud)
编译选项:
g++ ... -framework OpenGL -framework Cocoa -framework IOKit ...
Run Code Online (Sandbox Code Playgroud)
头:
#include <GLFW/glfw3.h>
#include <GL/glu.h>
Run Code Online (Sandbox Code Playgroud)
版本总是2.1,与报告的3.2不同.
https://developer.apple.com/graphicsimaging/opengl/capabilities/GLInfo_1085_Core.html
...
现在我的操作系统已经升级到10.9,OpenGL版本仍然是2.1.
它仍然无法编译GLSL 3.3,而Apple表示它支持4.1.
https://developer.apple.com/graphicsimaging/opengl/capabilities/index.html
我怎样才能使它工作?
很多文章都给出了这样的例子:
template<typename T>
concept Equal = requires(T a, T b) {
{ a == b } -> std::same_as<bool>;
};
Run Code Online (Sandbox Code Playgroud)
如果我写:
template<typename T>
concept Equal = requires(T a) {
{ a == a } -> std::same_as<bool>;
};
Run Code Online (Sandbox Code Playgroud)
如果不是,为什么语法是这样设计的?为什么他们要我声明这些变量,如a或b?
为什么我需要多个相同类型的变量?为什么我什至需要变量?
template<typename T>
concept Equal = requires {
{ declval<const T&>() == declval<const T&>() }
-> std::same_as<bool>;
};
Run Code Online (Sandbox Code Playgroud) 我有这样的代码,效果很好:
#include <algorithm>
#include <iostream>
char x[11]= "ABCDEFGHIJ";
char y[11];
struct F {
char operator () (char c) const
{ return c+1; }
};
int main()
{
std::transform(x, x+10, y, F());
y[10] = 0; std::cout <<y <<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其更改为此样式:
#include <algorithm>
#include <iostream>
char x[11]= "ABCDEFGHIJ";
char y[11];
int main()
{
struct F {
char operator () (char c) const
{ return c+1; }
};
std::transform(x, x+10, y, F());
y[10] = 0; std::cout <<y <<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它不会编译,说:
错误:没有匹配函数来调用'transform(char [11],char*,char [11],main():: …
我正在学习Haskell,并尝试编写一些事件驱动的程序.
以下代码来自教程:http://www.haskell.org/haskellwiki/OpenGLTutorial2
main = do
(progname,_) <- getArgsAndInitialize
initialDisplayMode $= [DoubleBuffered]
createWindow "Hello World"
reshapeCallback $= Just reshape
angle <- newIORef (0.0::GLfloat) -- 1
delta <- newIORef (0.1::GLfloat) -- 2
position <- newIORef (0.0::GLfloat, 0.0) -- 3
keyboardMouseCallback $= Just (keyboardMouse delta position)
idleCallback $= Just (idle angle delta)
displayCallback $= (display angle position)
mainLoop
Run Code Online (Sandbox Code Playgroud)
状态存储在IORefs中,这使得它看起来就像命令式语言.
我听说除了这个之外还有其他API Graphics.UI.GLUT,(例如Reactive),但它看起来非常复杂.
我的方法是lib提供一个函数runEventHandler,用户编写一个handler接受Events 列表并将其转换为IO ().
handler :: [Event] …Run Code Online (Sandbox Code Playgroud) 当我们写作时require('some/directory')。
它将查找some/directory/index.js是否some/directory是一个目录。
但是如果我想使用另一个文件名,例如 ,该怎么办_index.js?(因此它可以在目录树中的同级文件之前排序。)
通过使用以下选项进行编译,
emcc -s WASM=1 main.cpp -o index.js
emscripten 生成一个index.wasm, 和一个 js 包装器index.js。js 包装器在浏览器中运行时加载.wasm位于同一目录中的文件。XMLHttpRequest
那么如果我需要手动加载文件该怎么办呢.wasm?加载部分似乎是硬编码在包装器中的。
以下是我需要这样做的一些情况:
.wasm从另一个 url(例如从 CDN)提供该文件。.wasm是动态生成的。XMLHttpRequest不允许的沙箱中运行,只有像getMyData('some_file')..wasm我知道我只能通过以下方式生成文件
emcc -s WASM=1 main.cpp -o index.wasm
但随后我丢失了包装器,这在使用 SDL 和 GLES 等 emscripten API 时并非易事。
我有一个插座sock:
int sock = socket(...);
connect(sock, ...);
// or sock = accept(sock_listen, 0, 0);
Run Code Online (Sandbox Code Playgroud)
并且我用 fdopen 打开了两次,这样我就可以使用缓冲的读取器和写入器stdio,例如fwrite、fread、fgets和fprintf。
FILE *f_recv = fdopen(sock, "wb");
FILE *f_send = fdopen(sock, "rb");
// some IO here.
close(sock);
fclose(f_recv);
fclose(f_send);
Run Code Online (Sandbox Code Playgroud)
但是我们知道,如果我fclose是一个文件,aclose将随后被调用,并且fclose会失败。
如果我只使用close, struct 的内存FILE就会泄漏。
我该如何正确关闭它?
更新:
使用fdopen一次"r+"使读写共享同一个锁,但我除了发送和接收单独工作。
c++ ×5
c++11 ×2
opengl ×2
architecture ×1
c ×1
c++-concepts ×1
c++20 ×1
emscripten ×1
frp ×1
g++ ×1
glfw ×1
glibc ×1
glsl ×1
haskell ×1
javascript ×1
macos ×1
memory-leaks ×1
node.js ×1
posix ×1
shader ×1
sockets ×1
stl ×1
templates ×1
webassembly ×1