我是 GPtrArray 的新手,遇到了一些问题。我写了如下代码。但是g_ptr_arrat_sort(a,compare_items); 不工作..我尝试通过gdb调试,发现我的程序出了问题..gdb说,(gdb) p *alpha $1 = {item = 6295648,name = 0x601080“o \ 024”,price = 6295712 ,值 = 3.1105108254111529e-317} (gdb) p *beta $3 = {项目 = 6295680,名称 = 0x6010a0“/\””,价格 = 6295744,值 = 0}
这不是我输入到 GPtrArray* a 中的内容!
我怎么解决这个问题 ??
我的代码:
1 #include <stdio.h>
2 #include <glib.h>
3
4 typedef struct _DATA {
5 int item;
6 char* name;
7 int price;
8 double value;
9 } DATA;
10
11 int compare_items (gpointer, gpointer);
12 void printAll (gpointer, gpointer);
13 …Run Code Online (Sandbox Code Playgroud) 问题
文档摘录:
Decreases the reference count on a GMainLoop object by one.
If the result is zero, free the loop and free all associated memory.
Run Code Online (Sandbox Code Playgroud)
我找不到有关此参考计数器的信息。它的初始设置是什么以及如何使用?
细节
特别是,我对这段示例代码(在 main 方法中)感到困惑(请注意 set_cancel 是一个静态方法:
void (*old_sigint_handler)(int);
old_sigint_handler = signal (SIGINT, set_cancel);
/* Create a new glib main loop */
data.main_loop = g_main_loop_new (NULL, FALSE);
old_sigint_handler = signal (SIGINT, set_cancel);
/* Run the main loop */
g_main_loop_run (data.main_loop);
signal (SIGINT, old_sigint_handler);
g_main_loop_unref (data.main_loop);
Run Code Online (Sandbox Code Playgroud)
如果 g_main_loop 阻塞,它如何停止?我也找不到有关此信号方法的信息。但这可能是图书馆本机的(虽然我不知道)。
注意:我将上面的代码简化为我认为最重要的部分。它来自 docs/reference/aravis/html/ArvCamera.html 下名为 aravis 的相机接口库
我目前有一个同步 UDP 应用程序接收消息。
代码 :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <glib.h>
#include <gio/gio.h>
int main(argc,argv)
int argc;
char ** argv;{
char buf[256], *ptr, sep[] = "| ";
GError * error = NULL;
GSocket * socket;
GSocketAddress *gsockAddr, *gfromAddr;
guint16 udp_port = 1500;
//Creates socket udp ipv4
socket = g_socket_new(G_SOCKET_FAMILY_IPV4,
G_SOCKET_TYPE_DATAGRAM,
G_SOCKET_PROTOCOL_UDP,
&error);
g_assert(error == NULL);
if (socket == NULL) {
g_print("ERROR");
exit(1);
}
//sockaddr struct like
gsockAddr = G_SOCKET_ADDRESS(g_inet_socket_address_new(g_inet_address_new_any(G_SOCKET_FAMILY_IPV4), udp_port));
if(gsockAddr == NULL){
g_error("Error socket\n");
exit(1);
}
// …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我将通过 dbus 收到一条消息,该消息必须使用 gvariant 函数进行解析。
格式字符串为 G_VARIANT_TYPE ("a(ysb((sss)(sss)))"
构造 gVariant 的示例代码如下
int ParseVariant (GVariant *值);
int main()
{
GVariantBuilder *builder;
GVariant *value;
builder = g_variant_builder_new (G_VARIANT_TYPE ("a(ysb((sss)(sss)))"));
g_variant_builder_add (builder, "(ysb((sss)(sss)))", 'J', "Test1", TRUE, "Hn", "di", "hedfs", "dd", "dr", "hdf");
g_variant_builder_add (builder, "(ysb((sss)(sss)))", 'J', "Test2", TRUE, "Hn", "di", "hedfs", "dd", "dr", "hdf");
//g_variant_builder_add (builder, "(ysb((sss)(sss)))", 'J', "Test3", TRUE, "Hn", "di", "hedfs", "dd", "dr", "hdf");
GVariant *result = g_variant_new ("((yu)ya(ysb((sss)(sss))))", 'R', 23, 'E', builder);
g_variant_builder_unref (builder);
ParseVariant (result);
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个解析器函数(ParseVariant(结果)),使用它我可以提取变体结果的每个元素。
对此的任何帮助都将受到高度赞赏。
提前致谢。
当用户在程序运行的 Posix / Linux shell 中按下Ctrl+时,该程序会收到 SIGINT 信号。C当运行基于 GApplication 的程序时,这意味着该程序会立即终止。
我怎样才能克服这个问题并让 GApplication 正常关闭?
我是一个油嘴滑舌的新手,我仍然在努力理解my_class_name_class_init()方法和方法之间的区别my_class_name_init()。
我知道后者有点相当于 C++ 构造函数,并且针对创建的对象的每个实例进行操作,但我不太明白这些my_class_name_class_init()方法的目的。通过阅读文档,我认为class_init()方法有点类似于对所有实例有效的静态构造函数,但我仍然不确定我是否正确。
方法的目的是什么class_init()?
我开始研究 Glib 信号。在我的场景中,我想将一个类的多个实例连接到一个信号,如果这些实例之一调用 g_signal_emit(...),则应该为该类的所有实例调用提供的回调函数。让我尝试用一个例子来解释这一点。
\n\n我尝试创建 A 类的两个实例(A0 和 A1)。\nA 类在其_class_init函数中注册了一个非常简单的信号。
\n\n file_signals[0] = g_signal_newv("a_signal",\n G_TYPE_FROM_CLASS(ACLASS),\n G_SIGNAL_ACTION,\n NULL /* closure */,\n NULL /* accumulator */,\n NULL /* accumulator data */,\n NULL /* C marshaller */,\n G_TYPE_NONE /* return_type */,\n 0 /* n_params */,\n NULL); /* argument types*/\nRun Code Online (Sandbox Code Playgroud)\n\n然后,我将实例 A0 和 A1 的简单回调函数 (cb_a) 连接到信号“a_signal”。(例如在_instance_init函数中)
\n\ng_signal_connect(A0, "a_signal", (GCallback)cb_a, NULL);\ng_signal_connect(A1, "a_signal", (GCallback)cb_a, NULL); ,\nRun Code Online (Sandbox Code Playgroud)\n\n其中 cb_a 是 Ac 中定义的函数:
\n\nstatic void cb_a(void)\n{\nprintf("cb_a called!\\");\n}\nRun Code Online (Sandbox Code Playgroud)\n\n … 我在 Debian 9 i386 机器上使用 gcc 编译包含 glib.h 的程序时遇到问题。gcc 告诉我我的 glib 版本不符合最小值。
GLIB_VERSION_MIN_REQUIRED must be >= GLIB_VERSION_2_26
Run Code Online (Sandbox Code Playgroud)
机器上的GLIBC版本是2.24
# ldd --version
ldd (Debian GLIBC 2.24-11+deb9u3) 2.24
Run Code Online (Sandbox Code Playgroud)
但我安装了 -dev 包,它说安装了 2.50.3-2
# apt install libglib2.0-dev
...
Get:1 http://ftp.us.debian.org/debian stretch/main i386 libglib2.0-dev i386 2.50.3-2 [3,091 kB]
...
Run Code Online (Sandbox Code Playgroud)
但是,错误仍然存在。我能够在 Debian 9 x86_64 机器上毫无问题地编译这个项目。还需要安装什么才能正常工作?
我正在阅读glib 的 CLI 选项解析器的文档,我对它们的选项标志之一感到非常困惑。
- G_OPTION_FLAG_REVERSE
- 对于此类选项
G_OPTION_ARG_NONE,此标志指示选项的含义相反。
这是什么意思?期权的“意义”是什么?
基本上,我有一个数据字节串,如:( \x00\x00\x00\x00 \x08\x00\x00\x00 \x05\x00\x00\x00空格仅用于可见性,实际字节串中没有空格字节).数据是小端的.
现在,我需要提取第二个4字节组(\x08\x00\x00\x00,即128),并将它们转换为无符号长整数.所以,uint32_t输入.
基本上,我正在做的是: moveBlock(&gdata->str[4], &second_group, 4);
moveBlock宏在哪里:#define moveBlock(src,dest,size) memmove(dest,src,size).我使用宏因为我个人更喜欢参数的顺序,如果有人在想.
gdata->str是指向gchar *(参考此处)的指针,gdata是GString *(参考此处).
second_group被定义为uint32_t.
所以,这有时会起作用,但并非总是如此.老实说,我不知道我做错了什么!
谢谢!
PS:代码有点冗长和奇怪,我不认为通过这一切都是相关的.除非有人要求,否则我不会不必要地混淆这个问题
glib ×10
c ×5
linux ×2
asyncsocket ×1
binary-data ×1
callback ×1
command-line ×1
dbus ×1
debian ×1
gcc ×1
gio ×1
gobject ×1
gtk ×1
sigint ×1
signals ×1