我正在使用GLib的双链表结构,GList.我想知道是否有任何标准的宏来迭代GList.我在GLib文档中找不到任何这样的东西.结果我制作了自己的宏,但如果它存在,我宁愿使用标准的东西.
说明问题:通常我写了很多代码如下:
GList *list, *elem;
MyType *item;
for(elem = list; elem; elem = elem->next) {
item = elem->data;
/* do something with item */
}
Run Code Online (Sandbox Code Playgroud)
使用宏可以减少到
GList *list;
MyType *item;
GFOREACH(item, list) {
/* do something with item */
}
Run Code Online (Sandbox Code Playgroud)
哪个不那么吵.
注意:我意识到GLib提供了一个foreach函数,用于迭代列表并为每个元素调用回调,但是回调的间接使得代码更难以读取,特别是如果回调仅使用一次.
更新:看到没有标准宏,我正在使用我在这里使用的宏,以防它对别人有用.欢迎更正/改进.
#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
Run Code Online (Sandbox Code Playgroud) 我想使用Vala破解现有的基于GLib的C项目.
基本上我正在做的是,在我的构建过程开始时,使用valac从我的.vala文件生成.c和.h文件,然后按照我任何.c或.h文件的方式编译生成的文件.
这可能不是最好的方式,但似乎在大多数情况下工作正常.
我的问题是我很难从Vala代码访问现有的C代码.是否有捷径可寻?
我已经尝试编写自己的.vapi文件(我对vala附带的工具没有任何好运),但我找不到任何关于如何编写这些文件的体面文档.
有没有?我是否需要其中一个文件来调用现有的C代码?
我知道这个问题可能听起来很奇怪,因为GLib是一个可移植性库,但它有多便携?举一个例子:GLib(包括GObject)是在微控制器上运行还是依赖于某种操作系统?
我可以在哪里使用GLib有限制,还是可以在任何可以运行C代码的地方运行?
Glib :: RefPtr允许通过' ->'但不通过' *' 解除引用.为什么是这样?
我当然可以这样做:
class Foo {};
Glib::RefPtr<Foo> fooPtr;
fooPtr.operator->();
Run Code Online (Sandbox Code Playgroud)
文档特别提到他们离开了operator*().但他们没有提供任何指导原因.
为清晰起见,编写了示例:
我已经看到它认为" 你永远不需要取消引用 "一个RefPtr,但IMO似乎是虚假的,因为任何想要与动态和堆栈分配的对象一起使用的函数都需要最低的公分母接口,即pass-by -参考.
举个例子,例如:
struct Foo
{
void print() { printf( "Success" ); }
};
void myFunc( const Foo & foo ) { foo.print(); }
int main()
{
Foo foo0;
Glib::RefPtr<Foo> foo1Ptr( new Foo );
myFunc( foo0 );
myFunc( *foo1Ptr ); // error, no operator*()
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么这个位置是由Glib团队采取的?
我喜欢在我的C应用程序中使用GLib,它使用CMake作为构建系统.
现在,我在某种程度上混淆了如何在我的CMakeLists.txt中启用GLib.基本上,你使用find_package命令在cmake中添加库,所以我尝试了,根据这个 bug报告
find_package(GLib2)
Run Code Online (Sandbox Code Playgroud)
但没有找到任何东西.pkg-config另一方面,建议在GLib文档中使用.
在基于cmake的项目中启用glib的推荐方法是什么?
我有多个线程在GHashTable中添加,修改和查找数据.它是线程安全的,还是我需要自己实现线程安全?
我已经设法安装了meld 3.14.2和所有依赖包,通过从源代码编译每个包,并且所有包安装在NFS共享上,--prefix=<base>/meld用于meld工具&& --prefix=<base>/meld/deps用于依赖项.
最后,我调用了该工具,我可以看到GUI.但是,当我尝试进行一些功能测试时,它会引发我的错误.我从未使用过该工具.所以,我不知道它应该如何正常工作.但是用户已经指出了以下错误,我猜也可能存在许多其他错误.但以下是其中之一.
$meld
GLib-GIO-Message: Using the 'memory' GSettings backend. Your settings will not be saved or shared with other applications.
II 1
Traceback (most recent call last):
File "/applics/platform/meld/meld-3.14.2/lib/python2.7/site-packages/meld/newdifftab.py", line 117, in on_button_compare_clicked
tab = self.diff_methods[self.diff_type](compare_paths)
File "/applics/platform/meld/meld-3.14.2/lib/python2.7/site-packages/meld/meldwindow.py", line 647, in append_filediff
doc = filediff.FileDiff(len(files))
File "/applics/platform/meld/meld-3.14.2/lib/python2.7/site-packages/meld/filediff.py", line 281, in __init__
from meld.gutterrendererchunk import GutterRendererChunkAction
File "/applics/platform/meld/meld-3.14.2/lib/python2.7/site-packages/meld/gutterrendererchunk.py", line 33, in <module>
class GutterRendererChunkAction(GtkSource.GutterRendererPixbuf):
File "/applics/platform/meld/meld-3.14.2/lib/python2.7/site-packages/meld/gutterrendererchunk.py", line 38, in GutterRendererChunkAction
MODE_REPLACE: load("meld-change-apply-right"),
File "/applics/platform/meld/meld-3.14.2/lib/python2.7/site-packages/meld/gutterrendererchunk.py", line 30, …Run Code Online (Sandbox Code Playgroud) 几年来我一直在使用gtk.gdk.PixbufLoader.
今天,我尝试从新的Android设备加载jpg文件并获得此异常:
Traceback (most recent call last):
File "myscript.py", line 118, in next
loader.write(buf)
glib.GError: Error interpreting JPEG image file (Unsupported marker type 0x05)
Run Code Online (Sandbox Code Playgroud)
可以在eog(gnome之眼)中加载相同的文件,我可以使用convert(来自image-magick)而不出错.
它适用于所有文件,而不仅仅是一个,这使我得出结论文件没有被破坏.
可能有什么不对?
这是其中一个文件:http://thomas-guettler.de/20160627_163057-0.jpg
这是一个重现异常的片段:
from gtk.gdk import PixbufLoader
pixbufloader=PixbufLoader()
chunksize=130000
fd=open('20160627_163057-0.jpg', 'rb')
while True:
bytes=fd.read(chunksize)
if not bytes:
break
print pixbufloader.write(bytes)
pixbufloader.close()
Run Code Online (Sandbox Code Playgroud)
如果你设置chunksize为1,那么它的工作原理.
如果我使用130000chunksize,那么第一次调用write()失败.
我使用DBus与logind进行通信以获取有关活动会话的信息等.我已经使用了创建代码gdbus-codegen.我可以使用call和get方法获取信息,但我没有收到通知(我有一个g_main_loop正在运行!).
我像这样创建会话对象:
GError *error;
session_ = ::login1_session_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
"org.freedesktop.login1",
object_path,
NULL,
&error);
Run Code Online (Sandbox Code Playgroud)
使用object_path上述路径并使用调试器进行验证.
我不知道这是否与未收到通知的问题有关.
我注册了这样的回调:
::g_signal_connect_data(proxy, "notify::active", G_CALLBACK(&cb_thunk), this, 0, (GConnectFlags)0);
Run Code Online (Sandbox Code Playgroud)
(我g_signal_connect_data用来设置userdata我当前的类,因为我用C++编写并使用回调thunks).
回调函数具有以下签名:
static void cb_thunk(proxy_t *proxy, first_data_t param1, second_data_t param2, gpointer userdata);
Run Code Online (Sandbox Code Playgroud)
与proxy_tbeeing定义为Login1Session(由...生成gdbus-codegen).
我在这里弄错了吗?我不明白为什么我没有得到任何关于此的通知.
通过DBus进行回调是有效的,但不是属性,只有dbus中的实际回调函数.