我正在阅读并尝试在Linux上使用C代码运行程序的不同可能性.我的用例涵盖了所有可能的场景,从简单的运行和忘记过程,阅读或写入过程,到阅读和写入过程.
对于前三个,popen()非常容易使用并且运行良好.据我所知,它使用的一些版本fork()和exec()内部,然后调用一个shell实际运行命令.
对于第三种情况,popen()不是一种选择,因为它是单向的.可用选项包括:
fork()和exec(),再加上pipe()和dup2()输入/输出posix_spawn(),根据需要在内部使用上述内容我注意到的是,这些可以达到相同的效果popen(),但我们可以完全避免调用其他内容sh.这听起来很可取,因为它似乎不那么复杂.
但是,我注意到,即使我在Internet 上posix_spawn()找到的示例也会调用shell,因此看起来必须有一个好处.如果它是关于解析命令行参数,wordexp()似乎做同样好的工作.
是什么 背后的原因 调用shell来运行所需进程而不是直接运行它的好处?
编辑:我意识到我的问题措辞没有准确地反映我的实际兴趣 - 我对通过而不是(历史)原因的好处更加好奇,尽管两者显然是相关的,所以两种变化的答案都是一样的相关.sh
我想知道对于必须具有相对较大范围/长寿命的对象,对象初始化和存储的最佳方法是什么.假设我们有一个GameEngine类需要初始化并保持Window对渲染的引用.整个程序的生命周期都需要引用,窗口至少需要知道它的尺寸.
在Java中,我会这样做:
// Declaration:
Window window;
// Initialization:
window = new Window(width, height);
Run Code Online (Sandbox Code Playgroud)
我理解在C++中,第一个已经调用了Window类的默认构造函数,因此是声明和初始化.window = Window(width, height);因此,有一个将分配,扔掉已经存在的对象.
我能找到的第一个解决方案是使用指针:
// GameEngine.hpp
class GameEngine {
Window *window;
};
// Somewhere in GameEngine.cpp:
window = new Window(width, height);
Run Code Online (Sandbox Code Playgroud)
但话说回来,我经常读到一个人应该尽可能地支持普通对象而不是指针,事实上,我立刻陷入了一堆乱七八糟的指针,所以我正在寻找另一种方式.
另一种解决方案似乎是设计你的对象以获得没有参数的构造函数,并在以后设置对象:
// GameEngine.hpp
class GameEngine {
Window window;
};
// Somewhere in GameEngine.cpp
window.setWidth(width);
window.setHeight(height);
Run Code Online (Sandbox Code Playgroud)
这有效,但有一个严重的缺点:对象(至少在这种情况下)可能处于不一致状态,因为试图在没有设置宽度/高度的情况下显示窗口会导致错误或崩溃.它确实适用于某些对象,但对大多数情况它没有.
避免这种情况的一种方法是使用默认值.例如,Window类的构造函数可能如下所示:
Window::Window(int width = 800, int height = 600) {} …Run Code Online (Sandbox Code Playgroud) 我想在DIV中旋转一个文本元素,然而,在文本旋转后,我的div会像空的一样折叠.是否有一个CSS技巧让我的DIV仍然围绕着我的内在元素?
这是我的代码的样子:
li {
border: 1px solid black;
list-style-type: none;
}
p {
display: inline-block;
transform-origin: right bottom;
transform: rotate(270deg);
}Run Code Online (Sandbox Code Playgroud)
<li>
<div>
<p>Some Text</p>
</div>
</li>
<li>
<div>
<p>Some Text</p>
</div>
</li>Run Code Online (Sandbox Code Playgroud)
使用setvbuf(),我们可以将流的缓冲区类型更改FILE*为以下之一:
_IONBF(无缓冲)_IOLBF(行缓冲)_IOFBF(完全缓冲)例如,为了设置stderr为行缓冲,我们可以执行以下操作:
setvbuf(stderr, NULL, _IOLBF, 0);
Run Code Online (Sandbox Code Playgroud)
还有一种方法可以找出给定输出流的当前缓冲区类型(使用文件描述符或 FILE 指针)?
我正在浏览一些现有的(和工作的)代码,并遇到了这样的一行:
if (someObject.getStatus() == SomeEnum.VALUE1.VALUE2) { ... }
Run Code Online (Sandbox Code Playgroud)
SomeEnum是一个简单的枚举,看起来像这样:
public enum SomeEnum {
VALUE1,
VALUE2,
VALUE3,
...
}
private SomeEnum() {}
Run Code Online (Sandbox Code Playgroud)
现在,上面的比较做了什么?更确切地说,那里的两个枚举值的组合是什么?因为我认为这是完全错误的,所以我很惊讶没有看到任何警告或错误.但是,它编译并运行得很好.有人可以告诉我这会做什么吗?
我见过这样的代码:
char str[1024] = {0, };
Run Code Online (Sandbox Code Playgroud)
并怀疑它类似于这样做:
char str[1024];
str[0] = '\0';
Run Code Online (Sandbox Code Playgroud)
但我在上面找不到任何东西,所以我不确定。
这是什么(称为),它有什么作用?
免责声明:我知道之前可能有人问过并回答过这个问题,但搜索{0, }非常困难。如果你能指出重复,我很乐意删除这个问题。
我想在运行时修改 JSON 模型的展开(UV 坐标),以便在几何体表面移动纹理。我faceVertexUvs在Geometry 类文档中找到了。它包含一个数组,这是正确的。该数组包含很多元素,我假设它们是每个顶点的 UV 坐标。示例代码:
var uvs = mesh.geometry.faceVertexUvs[0];
console.log(uvs.length);
Run Code Online (Sandbox Code Playgroud)
给我4232作为输出。到目前为止,一切都很好。现在我想更改u和v值,但数组的 4000 多个元素都是字符串("1"到"4234")。我只找到了一些示例,展示了如何从头开始创建展开,在这种情况下,人们将 Vector2 数据推送到faceVertexUvs. 那么为什么我在那里看不到 Vector2 数据呢?
我目前正在查看现有代码.编写现有公式的方法有很多种.我偶然发现了几十个代码实例Math.pow(10.0D, 3.0D),Math.pow(300.0D, 2.0D)也有类似的东西1.5D * 1000.0D.
现在,在我继续前进,用他们各自的结果替换所有这些(1000d,90000d,1500d对于上面的例子),我想弄清楚是否有什么好的理由来继续使用原始符号?
我想到的唯一一件事就是保持代码与建模公式的相似性.还有其他原因我看不到吗?
我有3072个类型的值std::int16_t(16位整数),它对应于a GLshort.我想把它们发送到我的GLSL着色器.我读了Buffer Textures并试图实现这种方法.但是,一旦到达着色器,数据似乎不再完好无损.我还不确定,但看起来这些价值都是0最大值的.我究竟做错了什么?
我的初始化代码看起来像这样(禁止一些不相关的东西):
// 1: Get the data - array of GLshort:
GLshort tboData[3072];
for (size_t i = 0; i < 3072; ++i)
{
// cdb.getSprite() returns std::int16_t
tboData[i] = (GLshort) cbd.getSprite(i);
}
// 2: Make sure the Shader Program is being used:
sp->use(); // sp is a wrapper class for GL Shader Programs
// 3: Generate the GL_TEXTURE_BUFFER, bind it and send the data:
GLuint tbo;
glGenBuffers(1, &tbo);
glBindBuffer(GL_TEXTURE_BUFFER, tbo);
glBufferData(GL_TEXTURE_BUFFER, …Run Code Online (Sandbox Code Playgroud)