- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先,很抱歉这个问题很长,但应该很容易理解。假设我使用一个结构图像,其中包含 channel 、高度、宽度数字和指向 c*h*w
浮点值数量的实际图像数据的指针。我使用 fwrite 将图像结构数组和图像数据数组(每个图像的数据连接)写入单独的文件,以便稍后将它们加载到另一个系统中。加载系统没有文件系统,所以我想将文件作为头文件传递,我使用 xxd -i bin_file
将存储的二进制文件数据转换为头文件中的字符数组(如下所示)文件。在加载程序中,图像数组和数据数组(为图像连接)只是在#include 头文件中声明的静态字符数组。我复制图像结构并覆盖数据指针以指向与每个图像的数据起始位置对应的数据元素。但是当我打印加载的数据时,只有第一张图像的一些起始数据是正确的,而所有后续数据都是零。我不知道出了什么问题。谁能告诉我怎么了?
下面显示了我制作的测试代码。 ( channel = 2,高度 = 3,宽度 = 4)。
=== 图片.h ===
typedef struct {
int c;
int h;
int w;
float *data;
} image;
=== store.c ===
#include <stdio.h>
#include "image.h"
float data1_0[24] = \
{0.840188,0.394383,0.783099,0.798440,0.911647,0.197551,0.335223,0.768230,0.277775,0.553970,0.477397,0.628871,0.364784,0.513401,0.952230,0.916195,0.635712,0.717297,0.141603,0.606969,0.016301,0.242887,0.137232,0.804177};
float data1_1[24] = \
{0.156679,0.400944,0.129790,0.108809,0.998925,0.218257,0.512932,0.839112,0.612640,0.296032,0.637552,0.524287,0.493583,0.972775,0.292517,0.771358,0.526745,0.769914,0.400229,0.891529,0.283315,0.352458,0.807725,0.919026};
image alpha_images[2];
main()
{
int i;
image ab;
alpha_images[0].c = 2;
alpha_images[0].h = 3;
alpha_images[0].w = 4;
alpha_images[0].data = data1_0;
alpha_images[1].c = 2;
alpha_images[1].h = 3;
alpha_images[1].w = 4;
alpha_images[1].data = data1_1;
FILE *fpi = fopen("alpha_image.bin","wb");
FILE *fpd = fopen("alpha_data.bin","wb");
for(i=0;i<2;i++){
ab = alpha_images[i];
if (fwrite(&ab, sizeof(image), 1, fpi) != 1) printf ("error! 1234 \n");
if (fwrite(ab.data, ab.h*ab.w*ab.c, 1, fpd) != 1) printf ("error! 5678 \n");
}
printf("size of image = %d\n", sizeof(image));
}
我执行 xxd -i alpha_image.bin
使 alpha_image_bin.h 以十六进制显示如下所示。
=== alpha_image_bin.h ===
unsigned char alpha_image_bin[] = {
0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x0b, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00
};
unsigned int alpha_image_bin_len = 48;
.和 xxd -i alpha_data.bin
使 alpha_data_bin.h 以十六进制显示如下所示。
=== alpha_data_bin.h ===
nsigned char alpha_data_bin[] = {
0x90, 0x16, 0x57, 0x3f, 0x92, 0xec, 0xc9, 0x3e, 0x2d, 0x79, 0x48, 0x3f,
0x90, 0x66, 0x4c, 0x3f, 0xb3, 0x61, 0x69, 0x3f, 0xcf, 0x4a, 0x4a, 0x3e,
0x76, 0x70, 0x20, 0x3e, 0x88, 0x48, 0xcd, 0x3e, 0xab, 0xe7, 0x04, 0x3e,
0x41, 0xd7, 0xde, 0x3d, 0x8c, 0xb9, 0x7f, 0x3f, 0xc3, 0x7e, 0x5f, 0x3e
};
unsigned int alpha_data_bin_len = 48;
当以 ieee754 单精度 float (小端)表示时,我检查了生成的值是否正确。
转换后的头文件如下。
=== alpha_image_bin.h ===
unsigned char alpha_image_bin[] = {
0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xa0, 0x0a, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00
};
无符号整数 alpha_image_bin_len = 48;
=== alpha_data_bin.h ===
unsigned char alpha_data_bin[] = {
0x90, 0x16, 0x57, 0x3f, 0x92, 0xec, 0xc9, 0x3e, 0x2d, 0x79, 0x48, 0x3f,
0x90, 0x66, 0x4c, 0x3f, 0xb3, 0x61, 0x69, 0x3f, 0xcf, 0x4a, 0x4a, 0x3e,
0x76, 0x70, 0x20, 0x3e, 0x88, 0x48, 0xcd, 0x3e, 0xab, 0xe7, 0x04, 0x3e,
0x41, 0xd7, 0xde, 0x3d, 0x8c, 0xb9, 0x7f, 0x3f, 0xc3, 0x7e, 0x5f, 0x3e
};
unsigned int alpha_data_bin_len = 48;
下面是加载程序。
=== 加载.c ===
#include <stdio.h>
#include <string.h>
#include "image.h"
#include "alpha_image_bin.h"
#include "alpha_data_bin.h"
image alpha_image[2];
main()
{
int i, j;
image *iptr = (image *)&alpha_image_bin[0];
int dptr = 0;
for(i = 0; i < 2; i++){
alpha_image[i] = *iptr; // copy c,h,w
alpha_image[i].data = (float *)&alpha_data_bin[dptr]; // overwrite data pointer
iptr++; dptr+= 2*3*4*sizeof(float);
}
// check loading
for(i = 0; i < 2; i++){
printf("c = %d, h = %d, w = %d\n", alpha_image[i].c, alpha_image[i].h, alpha_image[i].w);
for(j=0; j<2*3*4; j++) {
printf("%f ", alpha_image[i].data[j]);
}
printf("\n");
}
}
当我运行加载时,它给了我这个结果
===加载结果===
c = 2, h = 3, w = 4
0.840188 0.394383 0.783099 0.798440 0.911647 0.197551 0.156679 0.400944 0.129790 0.108809 0.998925 0.218257 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
c = 2, h = 3, w = 4
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
正确的数据应该如store.c所示。
=== 预期的正确结果 ===
float data1_0[24] = \
{0.840188,0.394383,0.783099,0.798440,0.911647,0.197551,0.335223,0.768230,0.277775,0.553970,0.477397,0.628871,0.364784,0.513401,0.952230,0.916195,0.635712,0.717297,0.141603,0.606969,0.016301,0.242887,0.137232,0.804177};
float data1_1[24] = \
{0.156679,0.400944,0.129790,0.108809,0.998925,0.218257,0.512932,0.839112,0.612640,0.296032,0.637552,0.524287,0.493583,0.972775,0.292517,0.771358,0.526745,0.769914,0.400229,0.891529,0.283315,0.352458,0.807725,0.919026};
load.c 代码有什么问题? (注意 sizeof(image) 是 24,因为在数据指针之前有 4 个字节填充)。
最佳答案
在 float data1_0[24] =\
中,您可以删除反斜杠。我不知道它是否有害,但它肯定没有必要,因为 C 编译器是行无关的(它只是在下一行继续解析)。
在 fwrite(&ab, sizeof(image), 1, fpi)
中,您还写入了指向数据的指针。那是无用的,因为您无法有意义地回读它。当然,您可以读回它,但您必须忽略指针的任何值并将其替换为指向实际数据的指针。
最后,您忘记关闭文件,因此添加对 fclose()
的两次调用。
关于c - 将浮点指针设置为从头文件读取的字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44462447/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!