我有一个双向消息通道的实现,为了减少开销,我实现了几个循环的消息缓冲区.要从一端写入另一端,将指向消息的指针添加到一个循环缓冲区,并调整其读取和写入索引.要向另一个方向写入,请对其他缓冲区执行相同操作,依此类推.代码小而简单,它避免了使用管道或fifo的开销,尽管可能在某些方面可能是更好的解决方案.
我通过简单地检查是否存在等待读取的消息以及如果没有对在将消息添加到相关阵列时发出信号的条件变量进行定时等待来实现对此的轮询.
现在我有一个应用程序需要在套接字上(或多或少)同时在消息通道上等待.我现在希望我使用了fifo或pipe,但由于代码更改的开销(长篇故事),重写它以使用fifo或pipe是不可行的.
有没有办法获得与条件变量关联的文件描述符?如果是这样,一次对两个文件描述符实现轮询更容易,一个用于条件变量,一个用于套接字.
出于好奇,并使这个问题对于具有类似问题的其他人更有用,是否可以获得与信号量相关联的文件描述符,以便您可以同时轮询信号量和常规文件描述符?
我知道这是一个老栗子,但我想在我的代码中静态分配一个小的2D数组.我知道这样做的方法是:
static int A[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
Run Code Online (Sandbox Code Playgroud)
那没关系,我可以访问它的所有成员.但是我有几个问题将它传递给函数,例如:
void print_matrix(int **a, int r, int c)
{
int x, y;
for(x = 0; x < r; x++)
{
printf("Row %02d = %#x = ", x, a[x]);
for(y = 0; y < c; y++)
{
printf("%s%d", (0 == y) ? "" : ", ", a[x][y]);
}
printf("\n");
}
}
Run Code Online (Sandbox Code Playgroud)
首先我不能简单地传递A给函数,我需要将其转换为(int**).既然char *是同义词char [],我对此感到有些惊讶.其次,它崩溃,当我在调试器中检查时,在子函数内,a[0]报告为 …
请不要批评解决方案.这不是我的设计,是的,它很糟糕.
在运行Linux并使用C的计算机上,我们需要验证与进程建立的TCP连接是否来自同一台计算机.通过IP地址执行此操作是有问题的,因为操作系统生成两个IP地址,并且该进程只知道一个.无论如何,通过IP地址验证有点差.
我们希望通过将"远程"MAC地址与本地MAC地址进行比较来进行验证.我们已经获得了本地MAC地址.我需要知道的是如何获得"远程"MAC地址.它是在形成连接时发送的数据包中(以及随后的所有连接).我们如何将其拖出以太网层?
在有人再说一遍之前,我知道如果它不在同一个子网/局域网上,你就无法获得远程主机的MAC地址.没关系.据推测,我们会得到像00:00:00:00:00:00这样的东西,因为这与本地MAC地址不同,它会有所不同 - 正是我们想要的.
-
那么,总而言之,我们有一个TCP连接套接字fd,我们收到了一个数据包,那么我们如何找到远程主机的MAC地址,即数据包头部的MAC地址?
我有一些像这样的python代码:
try:
bob = bob_module.Bob('alpha')
except Exception as e:
print 'Alpha mode failed for bob: ' + str(e) + ').'
try:
if bob:
bob.add('Beta')
else:
bob = bob_module.Bob('Beta')
except Exception as e:
print 'Beta mode failed for bob: ' + str(e) + ').'
Run Code Online (Sandbox Code Playgroud)
当此代码运行Alpha模式失败时,出于可理解的原因(与alpha服务器的交互失败).然而beta模式失败的原因是"名称'bob'未定义".
当然如果bob没有定义name 然后if bob等于false,我们将进入else子句并运行Bob构造函数将结果赋给变量bob?
我现在无法对此进行调试,因为导致Alpha模式失败的错误是暂时的,现在已经消失了,但我想了解这有两个原因:智力好奇,以及在alpha模式再次失败的情况下使我的代码健壮.
我刚刚开始学习C编程,所以我并没有真正处于高级水平.忍受我!
我有这段代码,我想我很容易理解我要做的事情.但是我得到一个错误,说没有if之前调用最后一个else.
我怀疑问题是if和else之间的if-else语句.你们怎么解决它?
int talet;
scanf("%d", &talet);
int i = 1;
while (i <= 99) {
int a; {
if (i % talet == 0 || talet == (i / 10) % 10 || talet == i % 10) {
if (talet % 10 == 0)
printf("\n");
else
continue;
}
printf("burr ");
else
printf("%d ", i);
}
i = i + 1;
}
Run Code Online (Sandbox Code Playgroud) 我一直在使用 www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/ 上的指南来学习 OpenGL。本指南说...
glm::quat q;
...创建恒等四元数(无旋转)。
实验表明 q = [0, 0, 0, 0]。使用它作为根骨骼的父方向会导致任何骨骼都不会旋转。他们失去了所有轮换。
导游说...
四元数是一组 4 个数字,[xyzw],它以下列方式表示旋转:
// RotationAngle 以弧度为单位
x = RotationAxis.x * sin(RotationAngle / 2)
y = RotationAxis.y * sin(RotationAngle / 2)
z = RotationAxis.z * sin(RotationAngle / 2)
w = cos(旋转角度/2)
... 和 ...
[0 0 0 1] (w=1) 表示angle = 2*acos(1) = 0,所以这是一个单位四元数,根本不旋转。
我一直在试验一个骨架系统,其中每个骨骼都继承其父母的方向,然后在其上应用自己的旋转。
如果我使用“身份”四元数作为根骨骼的“父”方向,则根本不会旋转任何骨骼。如果我使用“单位”轮换,一切都很好。
当我将骨骼的初始方向设置为“身份”或“单位”四元数时,它会按照我的意愿显示。但是,当我将用户输入的欧拉角转换为方向时,我会旋转 180 度。我所做的转换是:
glm::vec3 eulers(glm::radians(pose.lng_rotate),
glm::radians(pose.lat_rotate),
glm::radians(pose.att_rotate));
pose.orientation = glm::quat(eulers);
Run Code Online (Sandbox Code Playgroud)
注意:我在这里使用“lng”、“lat”和“att”旋转,因为当骨骼继承父旋转时,“x”轴可能不再是“x”轴。
我注意到的最后一件奇怪的事情是我使用glm::mat4_cast了每种类型的四元数,然后乘以一个 identity glm::vec4。“身份”四元数不旋转向量,但“单位”四元数导致向量反转(乘以 -1)向量的 x 和 …
我正在使用 Qt5。
我有一个非常简单的对话框类,它继承自 QDialog。
我有一个使用这个对话框的类,还有一个 QFileDialog:
NameDlg m_name_dlg;
QFileDialog m_file_dlg;
Run Code Online (Sandbox Code Playgroud)
这个类还有一些插槽来处理对话框关闭:
private slots:
void on_dlgName_accepted();
void on_FileDlgClosed(int result);
Run Code Online (Sandbox Code Playgroud)
在构造函数中,我做了一些连接:
QObject::connect(&m_file_dlg, SIGNAL(finished(int)),
this, SLOT(on_FileDlgClosed(int)));
QObject::connect(&m_name_dlg, SIGNAL(accepted()),
this, SLOT(on_dlgName_accepted()));
Run Code Online (Sandbox Code Playgroud)
第一次调用 connect 没问题,但第二次调用会生成输出:
QMetaObject::connectSlotsByName: No matching signal for on_dlgName_accepted()
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当名称对话框被接受时,我的插槽被正确调用!
QDialog 的文档(和头文件)说:
Signals
void accepted()
Run Code Online (Sandbox Code Playgroud)
所以这不是参数不匹配。
正如我上面所说,信号被正确调用,所以我的代码一切正常,我真的很想理解为什么我会收到这个警告(作为教育练习)并摆脱它(为了安心)。
我不能发布完整的代码,但我相信应该有足够的人来理解这个问题。
我尝试过的事情:
改用finished()。
投射&m_name_dialog到QDialog *.
将信号更改为QDialog::accepted()。
提前致谢。
这是一个思想家,任何能够回答它的人都值得大家认可!这实际上是我要求更好理解的几个相关问题.
STM32 ARM Cortex平台的驱动程序包含以下代码:
static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
Run Code Online (Sandbox Code Playgroud)
__I 定义为:
#ifdef __cplusplus
#define __I volatile /*!< defines 'read only' permissions */
#else
#define __I volatile const /*!< defines 'read only' permissions */
#endif
Run Code Online (Sandbox Code Playgroud)
我的程序是一个用GCC交叉编译器编译的C程序.因此数组声明是有效的:
static volatile const uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
Run Code Online (Sandbox Code Playgroud)
问题1:
鉴于这是一个常数数组,为什么要在volatile这里使用关键字?
我的理解是volatile关键字意味着数组的内容可以改变,但 …
假设我有:
class A {
public:
operator ==(int int_val) { return (m_int_val == int_val); }
private:
int m_int_val;
};
Run Code Online (Sandbox Code Playgroud)
然后,我可以这样做:
bool my_func(const A &a) { return (a == 42); }
Run Code Online (Sandbox Code Playgroud)
甚至:
bool my_func(const A *a) { return ((*a) == 42); }
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。但是假设我有:
std::list<A *> a_list;
Run Code Online (Sandbox Code Playgroud)
我想做类似的事情:
auto it = std::find(a_list.begin(), a_list.end(), 42);
Run Code Online (Sandbox Code Playgroud)
然后,编译器会抱怨,因为您无法将指向A的指针与整数进行比较。
我的问题不是如何解决这个问题std::find_if(只是为了抢占大家)。我的问题是,我可以为指向A的指针定义一个等价运算符,以便上述std::find操作有效吗?如果可以,如何操作?
我在寻求更好地理解C ++时问。
c ×6
c++ ×2
3d ×1
if-statement ×1
linux ×1
mac-address ×1
python ×1
qt ×1
qt-signals ×1
qt5 ×1
rotation ×1
sockets ×1
unix ×1
volatile ×1