我正在学习大学的一些学分编码,我正在学习并决定尝试用C ++中的结构来制作一些东西,试图更好地理解它们。
我正在尝试使用一些函数来处理结构,但它们只有在我写入和声明参数之前才有效,但在课堂上我们被告知它不应该是必要的。我的代码如下。
struct employee{
int ID;
char name;
double salary;
};
struct empresa{
char name;
struct employee employee[];
};
void iterate_trough_employees(struct empresa &empresa, int number_employees){
for ( int i = 0; i < number_employees; i++){
empresa.employee[i].ID = i+1;
printf("\n\n EL ID del empleado es:\t %d \n",empresa.employee[i].ID);
empresa.employee[i].salary = rand() % 50;
printf("El salario del empleado es: %.1lf \n", empresa.employee[i].salary);
}
}
void sort_this(struct empresa &empresa, int number_employees){
int list_of_ID[number_employees];
list_of_ID[0]= empresa.employee[4].ID;
printf("\n%d", empresa.employee[4].ID);
printf("\n%d", list_of_ID[0]);
printf("\n%.0lf\n", empresa.employee[6].salary);
}
int main(){
struct empresa empresa;
int empleados = 10;
int orden_salarios[10];
iterate_trough_employees(empresa, empleados);
printf("%d", empresa.employee[6].ID);
sort_this(empresa, empleados);
return 0;
}
我最感兴趣的是sort_this
函数,它只在我写K时在屏幕上显示正确的值(函数中的代码与标题无关,因为我一直试图找出错误使得函数更容易)。
对于那些要求的人,我们已经被教导使用一些C ++元素(例如C ++或cin / cout中的引用传递)在C中编码以使其更容易,因此在您看来,代码不是C也不是C ++。我正在学习大学的一些学分编码,我正在学习并决定尝试用C ++中的结构来制作一些东西,试图更好地理解它们。
我正在尝试使用一些函数来处理结构,但它们只有在我写入和声明参数之前才有效,但在课堂上我们被告知它不应该是必要的。我的代码如下。
struct employee{
int ID;
char name;
double salary;
};
struct empresa{
char name;
struct employee employee[];
};
void iterate_trough_employees(struct empresa &empresa, int number_employees){
for ( int i = 0; i < number_employees; i++){
empresa.employee[i].ID = i+1;
printf("\n\n EL ID del empleado es:\t %d \n",empresa.employee[i].ID);
empresa.employee[i].salary = rand() % 50;
printf("El salario del empleado es: %.1lf \n", empresa.employee[i].salary);
}
}
void sort_this(struct empresa &empresa, int number_employees){
int list_of_ID[number_employees];
list_of_ID[0]= empresa.employee[4].ID;
printf("\n%d", empresa.employee[4].ID);
printf("\n%d", list_of_ID[0]);
printf("\n%.0lf\n", empresa.employee[6].salary);
}
int main(){
struct empresa empresa;
int empleados = 10;
int orden_salarios[10];
iterate_trough_employees(empresa, empleados);
printf("%d", empresa.employee[6].ID);
sort_this(empresa, empleados);
return 0;
}
我最感兴趣的是sort_this
函数,它只在我写K时在屏幕上显示正确的值(函数中的代码与标题无关,因为我一直试图找出错误使得函数更容易)。
对于那些要求的人,我们已经被教导使用一些C ++元素(例如C ++或cin / cout中的引用传递)在C中编码以使其更容易,因此在您看来,代码不是C也不是C ++。
当您使用void foo(struct bar x)
声明一个函数并使用foo(y)
调用它时,编译器会复制y
并将该副本分配给x
。然后更改函数内的副本x
对原始y
没有影响。
当您使用void foo(struct bar *x)
声明一个函数并使用foo(&y)
调用它时,编译器将获取y
的地址并将该值赋给x
。然后x
是地址的副本,但你在函数内使用*x
或x->member
,这些引用地址处的对象。由于地址指向原始对象y
,更改*x
和x->member
会更改原始对象y
。
当你使用void foo(struct bar &x)
声明一个函数并用foo(y)
调用它时,编译器会获取y
的地址并将其传递给函数。编译函数时,编译器知道x
应该是一个引用,而不是指向原始对象的指针或副本。因此,无论在函数中使用x
,编译器都会使用传递的地址来引用原始对象。因此,函数中对x
的更改是对原始对象的更改。在编写x.member = something;
的地方,编译器使用为x
传递的地址来更改原始对象member
中y
的值。此功能仅适用于C ++;它不在C.
第一个叫做pass by value。
第三个被称为传递参考。
第二个相当于通过引用传递,除了它是手动而不是自动;你明确传递一个指针,必须手动写出*x
或x->member
而不是x
或x.member
。
关于struct empresa empresa;
的main
的说明。你的struct empresa
用struct employee employee[];
定义。这是一个灵活的数组成员,以这种方式定义该类型的对象不会为该数组的元素分配任何存储。使用它的正确方法是为基础结构(sizeof(struct empresa)
)分配存储以及任意数量的元素(+ empleados * sizeof(struct employee)
)。为此,您必须使用malloc
或相关功能。
灵活的数组成员是一些C ++实现支持的扩展。它们不是语言的标准部分。