如何将结构传递给函数

时间:2014-07-08 04:50:43

标签: c structure user-defined-functions

我使用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个参数,以便我只能传递一个结构变量。

5 个答案:

答案 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();
}