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

C 将浮点指针设置为从头文件读取的字符数组,c,arrays,image,pointers,header,C,Arrays,Image,Pointers,Header,首先,很抱歉问了这么长的问题,但应该很容易理解。假设我使用一个结构图像,其中包含通道、高度、宽度编号,以及指向浮点值的实际图像数据c*h*wnumber的指针。我使用fwrite将图像结构数组和图像数据数组(每个图像的数据连接在一起)写入单独的文件,以便稍后将它们加载到另一个系统中。加载系统没有文件系统,因此我希望将文件作为头文件传递,并使用xxd-I bin_file将存储的二进制文件数据转换为头文件中的字符数组(如下所示)。在load程序中,图像数组和数据数组(为图像连接)只是#includ

首先,很抱歉问了这么长的问题,但应该很容易理解。假设我使用一个结构图像,其中包含通道、高度、宽度编号,以及指向浮点值的实际图像数据
c*h*w
number的指针。我使用fwrite将图像结构数组和图像数据数组(每个图像的数据连接在一起)写入单独的文件,以便稍后将它们加载到另一个系统中。加载系统没有文件系统,因此我希望将文件作为头文件传递,并使用
xxd-I bin_file
将存储的二进制文件数据转换为头文件中的字符数组(如下所示)。在load程序中,图像数组和数据数组(为图像连接)只是#include头文件中声明的静态字符数组。我复制图像结构并覆盖数据指针,以指向对应于每个图像的数据开始位置的数据元素。但是当我打印加载的数据时,只有第一个图像的一些起始数据是正确的,并且所有后续数据都是零。我不知道怎么了。谁能告诉我怎么了吗?
下面是我制作的测试代码。(对于通道=2,高度=3,宽度=4)

==image.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_data.bin
以使alpha_data_bin.h以十六进制显示

==alpha\u数据\u 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;
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;
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
};
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;
当用ieee754单精度浮点(小端)表示时,我检查生成的值是否正确。
转换的头文件如下所示。
==alpha\u图像\u 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;
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;
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
};
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;
无符号整数alpha_image_bin_len=48

==alpha\u数据\u 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;
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;
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
};
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;
下面是加载程序

==load.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");
}
}
正确的数据应如store.c所示

==预期的正确结果===

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 
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个字节填充)。

浮点数据1\u 0[24]=\
中,可以删除反斜杠。我不知道这是否会造成伤害,但这肯定不是必需的,因为C编译器是行独立的(它只是在下一行继续解析)

fwrite(&ab,sizeof(image),1,fpi)
中,您也在写入指向数据的指针。这是没有用的,因为你不能有意义地读回它。当然,您可以读回它,但必须忽略指针的任何值,并用指向实际数据的指针替换它

最后,您忘记关闭文件,因此添加两个对
fclose()
的调用



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

您描述的错误不在
load.c
中。它位于
store.c

    if (fwrite(ab.data, ab.h*ab.w*ab.c, 1, fpd) != 1) printf ("error! 5678 \n");
这只写入
ab.data
的第一个
24
字节,而不是写入所有
24*sizeof(float)
字节(假设
float
为4字节,则只写入每个图像的前6个float)

将其更改为:

    if (fwrite(ab.data, sizeof(float)*ab.h*ab.w*ab.c, 1, fpd) != 1) printf ("error! 5678 \n");

由于该错误,您从文件创建的
alpha_data_bin.h
中的字符数组太短。

ab
未初始化”是的:
ab=alpha_图像[i]谢谢,@SiggiSv;没有看到。加载系统没有malloc(没有操作系统,只有裸机)。@Paul Oglivie,实际上我本来想使用静态数组(图像和数据),而不复制结构数组。你能告诉我怎么做吗?
image*iptr=(image*)&alpha_image_bin[0]缺少允许编译此代码的代码。发布所需代码以允许编译。谢谢。这就是错误所在。实际上,我最初希望使用静态数组(图像数组和数据数组),而不复制结构数组。你能建议我怎么做吗?