我使用main
中的七个参数调用了一个函数find_sync(es_data + (loop_count * size) + chunk_bytes_counter,
size - chunk_bytes_counter, &sync_index, &flag,
&sync_length, &chunk_bytes_counter, &total_bytes_counter);
在function.c中:
void find_sync(char data[], size_t size, unsigned int *sync_index, int *flag, unsigned int *sync_length, unsigned int *chunk_bytes_counter, unsigned int *total_bytes_counter)
头文件中的原型:
extern void find_sync(char data[], size_t size, unsigned int *sync_index, int *flag, unsigned int *sync_length, unsigned int *bytes_counter, unsigned int *total_bytes_counter);
现在,我的问题是,如何在结构中声明所有这7个参数,以便我只能传递一个结构变量。
答案 0 :(得分:4)
首先声明结构:
struct find_sync_parameters {
char* data;
size_t size;
unsigned int *sync_index;
int *flag;
unsigned int *sync_length;
unsigned int *bytes_counter;
unsigned int *total_bytes_counter;
}
然后将您的功能签名更改为:
void find_sync(struct find_sync_parameters param)
或
void find_sync(struct find_sync_parameters *param)
在第一种情况下,在将控制转移到find_sync
之前,整个结构将被压入堆栈。在第二种情况下,只会推送一个指向结构的指针(存储在别处)。
每一个都有优点和缺点。传递指针时注意函数可以更改内容(这可以是正数:直接在结构内返回值;也可以是负数:调用者无法确定其数据是否已更改)。如果结构太大(不是你的情况),那么将所有内容推入堆栈可能会花费大量时间并成为性能损失。
在函数内部,您可以使用'。' (点,第一种情况)或' - >' (箭头,第二种情况)操作员。
要打电话:
struct find_sync_parameters p = { ... };
find_sync(p); // first case
find_sync(&p); // second case
如果您发现每次使用struct find_sync_parameters
定义新类型时输入typedef
都很烦人:
typedef struct find_sync_parameters find_sync_parameters;
或者在一行(struct和typedef定义)中:
typedef struct find_sync_parameters {
...
} find_sync_parameters;
甚至没有结构名称(匿名结构)
typedef struct {
...
} find_sync_parameters;
在最后一种情况下,你不能在struct中引用struct本身(例如,使用链表节点)。
答案 1 :(得分:0)
您可以创建一个结构(并同时对其进行类型设置,以使其可用,而不必每次都说" struct"),如下所示:
typedef struct _find_sync_str{
char* data;
size_t size;
unsigned int *sync_index;
int *flag;
unsigned int *sync_length;
unsigned int *bytes_counter;
unsigned int *total_bytes_counter;
} find_sync_str
然后您可以将该功能列为:
void find_sync(find_sync_str f);
答案 2 :(得分:0)
刚刚进入结构。
struct pars_t
{
char data[];
size_t size; unsigned int *sync_index;
int *flag; unsigned int *sync_length;
unsigned int *bytes_counter;
unsigned int *total_bytes_counter;
} pars;
然后拨打foo (pars_t par)
答案 3 :(得分:0)
我建议:
struct find_sync_struct {
char* data;
size_t size;
unsigned int sync_index;
int flag;
unsigned int sync_length;
unsigned int bytes_counter;
unsigned int total_bytes_counter;
};
将find_sync
的输入参数更改为:
void find_sync(struct find_sync_struct* strPtr);
使用以下方法调用该函数:
struct find_sync_struct str;
// Set str.data to something suitable.
// ....
find_sync(&str);
答案 4 :(得分:0)
这是一个演示如何将结构传递给函数的简单示例:
#include<stdio.h>
#include<conio.h>
//-------------------------------------
struct Example
{
int num1;
int num2;
}s[3];
//-------------------------------------
void accept(struct Example *sptr)
{
printf("\nEnter num1 : ");
scanf("%d",&sptr->num1);
printf("\nEnter num2 : ");
scanf("%d",&sptr->num2);
}
//-------------------------------------
void print(struct Example *sptr)
{
printf("\nNum1 : %d",sptr->num1);
printf("\nNum2 : %d",sptr->num2);
}
//-------------------------------------
void main()
{
int i;
clrscr();
for(i=0;i<3;i++)
accept(&s[i]);
for(i=0;i<3;i++)
print(&s[i]);
getch();
}