Redian新闻
>
size不固定的struct怎么定义呀?
avatar
size不固定的struct怎么定义呀?# Programming - 葵花宝典
b*n
1
Ansi C in Unix
我现在有一个struct要存储一些数字
但是有多少个数字是不确定的
需要程序的运行结果来确定
我要把这些数字save到一个file里面
然后另一个程序去open这个file
但是我不知道在存储那个struct的时候
怎么解决未知数目的问题
大家提点建议吧
avatar
g*g
2
use a pointer void*, and malloc at runtime.

【在 b*********n 的大作中提到】
: Ansi C in Unix
: 我现在有一个struct要存储一些数字
: 但是有多少个数字是不确定的
: 需要程序的运行结果来确定
: 我要把这些数字save到一个file里面
: 然后另一个程序去open这个file
: 但是我不知道在存储那个struct的时候
: 怎么解决未知数目的问题
: 大家提点建议吧

avatar
b*n
3
那第二个文件去打开这个文件的时候
怎么知道里面有多少个数字呢?

【在 g*****g 的大作中提到】
: use a pointer void*, and malloc at runtime.
avatar
g*g
4
If you are going to write out and read in again, it's even simpler.
Just write the number of numbers or sizeof(struct) into the file first.

【在 b*********n 的大作中提到】
: 那第二个文件去打开这个文件的时候
: 怎么知道里面有多少个数字呢?

avatar
b*n
5
如果我把sizeof(struct)先写进去的话
reader program 怎么知道里面有多少个数字?
还是需要write out 那个occurrence number.
有什么方法可以避免那个occurrence number吗?

【在 g*****g 的大作中提到】
: If you are going to write out and read in again, it's even simpler.
: Just write the number of numbers or sizeof(struct) into the file first.

avatar
c*e
6
我今天和乐点酒,头脑不是很清楚,凑合看吧。
struct Array
{
unsigned long length_;
int * data_
explicit Array ( const int num) : length_ (num)
{ data = static_castmalloc (sizeof(int)*length);}
~Array (void) {delete data_;}
void init (...) {//initialize ur arrary of int}
int operator [] (int i) { //check boundary maybe; return data[i]; }
private: //or protected
const A& operator=(const A&);
A(const &);
};
或者用vector得乐。要不自己写个templated struct. 还可以用new 来代替malloc.
或者overlaod operator new,或者用allocat

【在 b*********n 的大作中提到】
: 如果我把sizeof(struct)先写进去的话
: reader program 怎么知道里面有多少个数字?
: 还是需要write out 那个occurrence number.
: 有什么方法可以避免那个occurrence number吗?

avatar
g*g
7
You drink too much, you can't do this in C.

【在 c********e 的大作中提到】
: 我今天和乐点酒,头脑不是很清楚,凑合看吧。
: struct Array
: {
: unsigned long length_;
: int * data_
: explicit Array ( const int num) : length_ (num)
: { data = static_castmalloc (sizeof(int)*length);}
: ~Array (void) {delete data_;}
: void init (...) {//initialize ur arrary of int}
: int operator [] (int i) { //check boundary maybe; return data[i]; }

avatar
c*e
8
由没说非得用c
哈哈,walking in the cloud ah , 酒就是好,一醉万事休

first.

【在 g*****g 的大作中提到】
: You drink too much, you can't do this in C.
avatar
l*o
9
楼主一上来就说ANSI C

【在 c********e 的大作中提到】
: 由没说非得用c
: 哈哈,walking in the cloud ah , 酒就是好,一醉万事休
:
: first.

avatar
n*n
11
又是女生来问作业?

【在 b*********n 的大作中提到】
: Ansi C in Unix
: 我现在有一个struct要存储一些数字
: 但是有多少个数字是不确定的
: 需要程序的运行结果来确定
: 我要把这些数字save到一个file里面
: 然后另一个程序去open这个file
: 但是我不知道在存储那个struct的时候
: 怎么解决未知数目的问题
: 大家提点建议吧

avatar
w*g
12
struct Numbers {
size_t N;
float data[1]; /* 有的编译器要求数组长度至少为1 */
};
写的时候先把N写进去,然后fwrite(xx.data, sizeof(float), xx.N, file);
读的时候先把N读出来,然后
xx = (struct Numbers *)malloc(sizeof(struct Numbers) + (N-1) * sizeof(float)
);
然后xx里的data就可以当N个元素的素组用了。

【在 b*********n 的大作中提到】
: Ansi C in Unix
: 我现在有一个struct要存储一些数字
: 但是有多少个数字是不确定的
: 需要程序的运行结果来确定
: 我要把这些数字save到一个file里面
: 然后另一个程序去open这个file
: 但是我不知道在存储那个struct的时候
: 怎么解决未知数目的问题
: 大家提点建议吧

avatar
n*n
13
直接float*不就完了?

float)

【在 w***g 的大作中提到】
: struct Numbers {
: size_t N;
: float data[1]; /* 有的编译器要求数组长度至少为1 */
: };
: 写的时候先把N写进去,然后fwrite(xx.data, sizeof(float), xx.N, file);
: 读的时候先把N读出来,然后
: xx = (struct Numbers *)malloc(sizeof(struct Numbers) + (N-1) * sizeof(float)
: );
: 然后xx里的data就可以当N个元素的素组用了。

avatar
k*5
14
2 step:
1. Saving as structure {int count; float []} to file
2. When read, you know the size of file, simply read the whole file to
buffer, the first 4 bytes is the count, then covert the rest of buffer to
knowing size array.
avatar
d*i
15
这个应该是用指针来定义动态数组吧,如下
struct Numbers {
size_t N;
float *data;
};
struct Numbers numbers;
//read N in
scanf("%d", &numbers.N);
//create the new data array based on N
number.data = malloc(sizeof(float)*N);
//read data in
for(int i=0; ifscanf(pFile, "%f", &number.data[i]);
}

float)

【在 w***g 的大作中提到】
: struct Numbers {
: size_t N;
: float data[1]; /* 有的编译器要求数组长度至少为1 */
: };
: 写的时候先把N写进去,然后fwrite(xx.data, sizeof(float), xx.N, file);
: 读的时候先把N读出来,然后
: xx = (struct Numbers *)malloc(sizeof(struct Numbers) + (N-1) * sizeof(float)
: );
: 然后xx里的data就可以当N个元素的素组用了。

avatar
n*3
16
。恨就不用啦,
Linux 里 这种trick很多

【在 d****i 的大作中提到】
: 这个应该是用指针来定义动态数组吧,如下
: struct Numbers {
: size_t N;
: float *data;
: };
: struct Numbers numbers;
: //read N in
: scanf("%d", &numbers.N);
: //create the new data array based on N
: number.data = malloc(sizeof(float)*N);

avatar
x*u
17
十年的老坑啊
avatar
n*n
18
日。谁挖出来的

【在 x****u 的大作中提到】
: 十年的老坑啊
avatar
g*g
19
不知道,看似我十年前C还是很好的,现在完全不会了。

【在 n******n 的大作中提到】
: 日。谁挖出来的
avatar
x*o
20
Zero length array?
avatar
z*r
21
我是这么用的(verified on Ubuntu):
typedef struct
{
// fixed length data
int len;
// any varying length data should be put below
// note, you must be used data[] instead of *data
// because data[] does't take extra space; *data takes four bytes for the
pointer
char data[];
}Array;
// for allocate
int len=10;
Array *x=(Array *)malloc(len*sizeof(char)+sizeof(Array));
x->len=10;
// access the varying length part
x->data[0]='c';
// for deallocate
free(x);
avatar
A*e
22
这么用错的厉害。你只能把Array放在堆里。我想声明一个Array类型的局部变量怎么办
?而且可读性很差。
验证一个例子能说明什么问题?楼上用指针才是正解。

【在 z**********r 的大作中提到】
: 我是这么用的(verified on Ubuntu):
: typedef struct
: {
: // fixed length data
: int len;
: // any varying length data should be put below
: // note, you must be used data[] instead of *data
: // because data[] does't take extra space; *data takes four bytes for the
: pointer
: char data[];

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。