gpt4 book ai didi

c - 将浮点指针设置为从头文件读取的字符数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:34 25 4
gpt4 key购买 nike

首先,很抱歉这个问题很长,但应该很容易理解。假设我使用一个结构图像,其中包含 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() 的两次调用。


在 load.c 中,我没有看到您打开任何文件,那么您希望如何加载任何文件???啊...你把它保存为.bin 然后把它包含在一个.h 中。听起来有点愚蠢:每次更改都必须重新编译。如果我是老师,那么您的设置就失败了。只需使用 malloc 分配内存,然后将二进制数据读入其中即可。

关于c - 将浮点指针设置为从头文件读取的字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44462447/

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