- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为后代发布我的作品。在用 C++ 完成我的最后一个示例后意识到我实际上需要一直用 C 来完成它(太棒了,对吧?)。作为一名 Java 程序员,这两次迭代都花费了我相当多的精力,我认为那里的许多示例代码留下了太多的漏洞 - 尤其是当涉及到从命令行构建时要困难得多习惯于使用 Eclipse 来构建项目和处理依赖项的人。
如何使用 brew 安装 OSX 的依赖项:
brew 安装 flatcc
brew 安装 zeromq
您还需要安装所有标准构建器二进制文件。我使用 gcc 编译:
gcc publisher.c -o bin/zmq_pub -lzmq -lflatcc
gcc subscriber.c -o bin/zmq_sub -lzmq
这假设您已经安装了 zmq 和 flatcc 库,它们应该在 brew 安装完成后链接到您的/usr/local/include。像这样:
zmq_cpub $ls -la/usr/local/include
lrwxr-xr-x 1 用户组 37 Oct 18 18:43 flatcc -> ../Cellar/flatcc/0.3.4/include/flatcc
你会得到如下编译错误:体系结构 x86_64 的 undefined symbol :
如果您没有正确安装/链接库。编译器/链接器将重命名函数并在它们前面加上 _ 并可能使您感到困惑。就像 Undefined symbols for architecture x86_64 _flatcc_builder_init
尽管从来不应该有 _flatcc_builder_init
。
那是因为在 C/C++ 中链接库与在 Java 中有根本的不同。除了添加 JAR 的特定项目构建路径之外,还有外部 C/C++ 库可以安装到的已知位置。 /usr/local/include
、/usr/local/lib
、/usr/lib
和 /usr/include
.
在将 flatcc 二进制文件安装到您的路径后,不要忘记生成要在本地项目中使用的头文件:
flatcc -a Car.fbs
这应该是我在 C 车道上遇到的几乎所有障碍。希望它能帮助那里的人。
最佳答案
汽车.fbs
namespace Test;
table Car {
name: string;
model: string;
year: int;
}
root_type Car;
Subscriber.c(监听传入的结构)
// Hello World client
#include "flatbuffers/Car_builder.h" // Generated by `flatcc`.
#include "flatbuffers/flatbuffers_common_builder.h"
#include <zmq.h>
#undef ns
#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(Test, x) // Specified in the schema
struct Car {
char* name;
char* model;
int year;
};
int main (void)
{
printf ("Connecting to car world server...\n");
void *context = zmq_ctx_new ();
void *requester = zmq_socket (context, ZMQ_REQ);
zmq_connect (requester, "tcp://localhost:5555");
int request_nbr;
for (request_nbr = 0; request_nbr != 10; request_nbr++) {
char buffer [1024];
printf ("Sending ready signal %d...\n", request_nbr);
zmq_send (requester, "Hello", 5, 0);
zmq_recv (requester, buffer, 1024, 0);
printf ("Received car %d\n", request_nbr);
ns(Car_table_t) car = ns(Car_as_root(buffer));
int year = ns(Car_year(car));
flatbuffers_string_t model = ns(Car_model(car));
flatbuffers_string_t name = ns(Car_name(car));
struct Car nextCar;
// no need to double up on memory!!
// strcpy(nextCar.model, model);
// strcpy(nextCar.name, name);
nextCar.model = model;
nextCar.name = name;
nextCar.year = year;
printf("Year: %d\n", nextCar.year);
printf("Name: %s\n", nextCar.name);
printf("Model: %s\n", nextCar.model);
}
zmq_close (requester);
zmq_ctx_destroy (context);
return 0;
}
Publisher.c(通过 zmq 套接字发送结构):
// Hello World server
#include "flatbuffers/Car_builder.h" // Generated by `flatcc`.
#include "flatbuffers/flatbuffers_common_builder.h"
#include <zmq.h>
#include <unistd.h>
#include <time.h>
#undef ns
#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(Test, x) // specified in the schema
struct Car {
char name[10];
char model[10];
int year;
};
struct Car getRandomCar() {
struct Car randomCar;
int a = rand();
if ((a % 2) == 0) {
strcpy(randomCar.name, "Ford");
strcpy(randomCar.model, "Focus");
} else {
strcpy(randomCar.name, "Dodge");
strcpy(randomCar.model, "Charger");
}
randomCar.year = rand();
return randomCar;
}
int main (void)
{
srand(time(NULL));
// Socket to talk to clients
void *context = zmq_ctx_new ();
void *responder = zmq_socket (context, ZMQ_REP);
int rc = zmq_bind (responder, "tcp://*:5555");
assert (rc == 0);
int counter = 0;
while (1) {
struct Car c = getRandomCar();
flatcc_builder_t builder, *B;
B = &builder;
// Initialize the builder object.
flatcc_builder_init(B);
uint8_t *buf; // raw buffer used by flatbuffer
size_t size; // the size of the flatbuffer
// Convert the char arrays to strings
flatbuffers_string_ref_t name = flatbuffers_string_create_str(B, c.name);
flatbuffers_string_ref_t model = flatbuffers_string_create_str(B, c.model);
ns(Car_start_as_root(B));
ns(Car_name_add(B, name));
ns(Car_model_add(B, model));
ns(Car_year_add(B, c.year));
ns(Car_end_as_root(B));
buf = flatcc_builder_finalize_buffer(B, &size);
char receiveBuffer [10];
zmq_recv (responder, receiveBuffer, 10, 0);
printf ("Received ready signal. Sending car %d.\n", counter);
sleep (1); // Do some 'work'
zmq_send (responder, buf, size, 0);
counter++;
free(buf);
}
return 0;
}
关于c - ZeroMQ C 上的简单 Flatbuffers 示例 - 通过 zmq 将结构复制到 flatbuffer 并再次返回结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40141120/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!