gpt4 book ai didi

c - 如何在X11中存储事件产生的数据?

转载 作者:行者123 更新时间:2023-11-30 17:57:56 24 4
gpt4 key购买 nike

我正在开发一个事件驱动的项目,该项目在 x 窗口上绘制形状。每当我在屏幕上单击鼠标时,就会生成新的 x 和 y 值。我的问题是:假设每次单击鼠标时都会生成 x 和 y 的新值,如何在下面的代码中存储 x 和 y 的不同值。

int x, y;
x = report.xbutton.x;
y = report.xbutton.y;

if (report.xbutton.button == Button1) {
XFillArc(display_ptr, win, gc_red,
x - win_height/80, y - win_height/80,
win_height/60, win_height/60, 0, 360*64);
}

最佳答案

代码的一个版本可能是:

typedef struct Position
{
int x;
int y;
} Position;

typedef struct PosnList
{
size_t num_pts;
size_t max_pts;
Position *points;
} PosnList;

void add_point(int x, int y, PosnList *p)
{
if (p->num_pts >= p->max_pts)
{
size_t new_num = (p->max_pts + 2) * 2;
Position *new_pts = realloc(p->points, new_num * sizeof(Position));
if (new_pts == 0)
...handle out of memory error...
p->max_pts = new_num;
p->points = new_pts;
}
p->points[p->num_pts++] = (Position){ x, y };
}

void zap_posnlist(PosnList *p)
{
free(p->points);
p->num_pts = 0;
p->max_pts = 0;
p->points = 0;
}

那么你的代码就可以了:

int x, y;
x = report.xbutton.x;
y = report.xbutton.y;

if (report.xbutton.button == Button1) {
XFillArc(display_ptr, win, gc_red,
x - win_height/80, y - win_height/80,
win_height/60, win_height/60, 0, 360*64);
add_point(x, y, &positions);
}

在某个地方有一个变量:

PosnList positions = { 0, 0, 0 };

请注意,add_point() 函数使用 realloc() 来执行初始内存分配和增量内存分配。该代码使用 C99 复合文字将值 xy 分配给数组中的下一个 Position。如果您没有 C99,则需要完成两项单独的作业。

zap_posnlist()函数释放先前初始化的PosnList。您可能仍然需要正式的初始化函数 - 除非您乐意在任何地方使用 PosnList xxx = { 0, 0, 0 }; 表示法。

该代码现已被 GCC 清理;原始版本不是,并且其中存在错误 - 这些错误会生成编译器错误。

<小时/>

经过测试的代码 - 请注意,“stderr.h”不是标准 header ,而是我习惯使用的错误报告代码。它提供了 err_error()err_setarg0() 函数。

#include <stdlib.h>
#include "stderr.h"

typedef struct Position
{
int x;
int y;
} Position;

typedef struct PosnList
{
size_t num_pts;
size_t max_pts;
Position *points;
} PosnList;

extern void add_point(int x, int y, PosnList *p);
extern void zap_posnlist(PosnList *p);

void add_point(int x, int y, PosnList *p)
{
if (p->num_pts >= p->max_pts)
{
size_t new_num = (p->max_pts + 2) * 2;
Position *new_pts = realloc(p->points, new_num * sizeof(Position));
if (new_pts == 0)
err_error("Out of memory (%s:%d - %zu bytes)\n",
__FILE__, __LINE__, new_num * sizeof(Position));
p->max_pts = new_num;
p->points = new_pts;
}
p->points[p->num_pts++] = (Position){ x, y };
}

void zap_posnlist(PosnList *p)
{
free(p->points);
p->num_pts = 0;
p->max_pts = 0;
p->points = 0;
}

#include <stdio.h>

int main(int argc, char **argv)
{
PosnList positions = { 0, 0, 0 };

err_setarg0(argv[0]);

if (argc > 1)
srand(atoi(argv[1]));

for (size_t i = 0; i < 37; i++)
add_point(rand(), rand(), &positions);

for (size_t i = 0; i < positions.num_pts; i++)
printf("%2zu: (%5d, %5d)\n", i, positions.points[i].x, positions.points[i].y);

zap_posnlist(&positions);
return(0);
}
<小时/>

如果您需要 stderr.hstderr.c 的源代码,请联系我(请参阅我的个人资料)。

关于c - 如何在X11中存储事件产生的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12594282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com