我有这个结构,全局定义(声明)
struct Town
{
char *TownName;
char **GiftList;
int *GiftCount;
int GiftTypes;
};
int main()
{
struct Town TownList[100],AuxiliaryStructure;
}
这是我的排序功能,我使用TownList [i] .GiftList [j],TownList [i] .TownName等。我的问题是如何将这些作为参数发送给函数。非正式的,什么在这些括号之间写下:排序(此处)
void Sort()
{
int i,j,k;
char* AuxiliaryString;
int Auxiliary;
for(i=0;i<TownCount-1;i++)
{
for(j=i+1;j<TownCount;j++)
{
if(strcmp(TownList[i].TownName,TownList[j].TownName)>0)
{
AuxiliaryStructure=TownList[i];
TownList[i]=TownList[j];
TownList[j]=AuxiliaryStructure;
}
}
}
for(i=0;i<TownCount;i++)
{
for(j=1;j<TownList[i].GiftTypes-1;j++)
{
for(k=j+1;k<TownList[i].GiftTypes;k++)
{
if(TownList[i].GiftCount[j]<TownList[i].GiftCount[k])
{
Auxiliary=TownList[i].GiftCount[j];
TownList[i].GiftCount[j]=TownList[i].GiftCount[k];
TownList[i].GiftCount[k]=Auxiliary;
AuxiliaryString=TownList[i].GiftList[j];
TownList[i].GiftList[j]=TownList[i].GiftList[k];
TownList[i].GiftList[k]=AuxiliaryString;
}
}
}
for(j=1;j<TownList[i].GiftTypes-1;j++)
{
for(k=1;k<TownList[i].GiftTypes;k++)
{
if(TownList[i].GiftCount[j]==TownList[i].GiftCount[k])
{
if(strcmp(TownList[i].GiftList[j],TownList[i].GiftList[k])<0)
{
AuxiliaryString=TownList[i].GiftList[j];
TownList[i].GiftList[j]=TownList[i].GiftList[k];
TownList[i].GiftList[k]=AuxiliaryString;
}
}
}
}
}
}
答案 0 :(得分:1)
要将任何数组传递给函数,您只需将指针传递给第一个元素加上数组长度:
struct mystruct {
char* something;
/* ... */
}
struct mystruct myarray[100];
void do_something(struct mystruct* array, int length)
{
int i;
for (i=0; i<length; ++i)
{
array[i].something = ...
}
}
int main(void)
{
do_something(myarray, 100);
return 0;
}
答案 1 :(得分:0)
根据您所写的内容,您将在调用者中引用它并传递结果。例如:
void sort(char* str){
...
}
int main(){
for(int i=0; i<100; ++i){
sort(array[i].something);
}
}
或者,您可能希望传递完整数组并在另一个函数中处理它,如下所示:
void sort(struct mystruct * array){
...
}
int main(){
for(int i=0; i<100; ++i){
sort(array);
}
}
另一方面,如果您想要通过某些内容对结构的外部数组进行排序,那么您必须按上述方式传递数组并实现自己的排序,或者使用排序函数它接受一个函数指针,以便您可以编写比较器。后者在标准C库中可用,可以使用类似的东西。
#include <stdlib.h>
int compare_mystruct_by_something(const void *a, const void *b){
return strcmp(((struct mystruct*)a)->something, ((struct mystruct *)b)->something);
}
int main(){
qsort(array, 100, sizeof(struct mystruct), compare_mystruct_by_something);
}