标签: glib

g_ptr_array_sort 不工作

我是 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)

c linux glib

2
推荐指数
1
解决办法
506
查看次数

g_main_loop_unref(GMainLoop* 循环) 如何工作?

问题

文档摘录:

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 的相机接口库

glib

2
推荐指数
1
解决办法
2321
查看次数

Glib/Gio 异步或线程 UDP 服务器

我目前有一个同步 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)

c multithreading glib asyncsocket gio

2
推荐指数
1
解决办法
2679
查看次数

复杂格式的 gvariant 解析

在我的应用程序中,我将通过 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(结果)),使用它我可以提取变体结果的每个元素。

对此的任何帮助都将受到高度赞赏。

提前致谢。

linux gtk dbus glib

2
推荐指数
1
解决办法
3267
查看次数

GLib:在 Unix SIGINT 上优雅终止 GApplication

当用户在程序运行的 Posix / Linux shell 中按下Ctrl+时,该程序会收到 SIGINT 信号。C当运行基于 GApplication 的程序时,这意味着该程序会立即终止。

我怎样才能克服这个问题并让 GApplication 正常关闭?

command-line glib sigint

2
推荐指数
1
解决办法
680
查看次数

GLib - class_init 和 init 类方法之间的区别

我是一个油嘴滑舌的新手,我仍然在努力理解my_class_name_class_init()方法和方法之间的区别my_class_name_init()

我知道后者有点相当于 C++ 构造函数,并且针对创建的对象的每个实例进行操作,但我不太明白这些my_class_name_class_init()方法的目的。通过阅读文档,我认为class_init()方法有点类似于对所有实例有效的静态构造函数,但我仍然不确定我是否正确。

方法的目的是什么class_init()

c glib

2
推荐指数
1
解决办法
928
查看次数

GLib - 为类的所有实例调用回调

我开始研究 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*/\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,我将实例 A0 和 A1 的简单回调函数 (cb_a) 连接到信号“a_signal”。(例如在_instance_init函数中)

\n\n
g_signal_connect(A0, "a_signal", (GCallback)cb_a, NULL);\ng_signal_connect(A1, "a_signal", (GCallback)cb_a, NULL); ,\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中 cb_a 是 Ac 中定义的函数:

\n\n
static void cb_a(void)\n{\nprintf("cb_a called!\\");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n …

signals gobject callback glib

2
推荐指数
1
解决办法
644
查看次数

glib 版本不是所需的最低版本

我在 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 机器上毫无问题地编译这个项目。还需要安装什么才能正常工作?

debian gcc glib

2
推荐指数
1
解决办法
1314
查看次数

命令行选项的“意义”是什么?

我正在阅读glib 的 CLI 选项解析器的文档,我对它们的选项标志之一感到非常困惑。

G_OPTION_FLAG_REVERSE
对于此类选项G_OPTION_ARG_NONE,此标志指示选项的含义相反。

这是什么意思?期权的“意义”是什么?

c glib command-line-interface command-line-arguments

2
推荐指数
1
解决办法
79
查看次数

如何将4字节"字符串"转换为uint32_t?

基本上,我有一个数据字节串,如:( \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:代码有点冗长和奇怪,我不认为通过这一切都是相关的.除非有人要求,否则我不会不必要地混淆这个问题

c glib binary-data

1
推荐指数
1
解决办法
7571
查看次数