c语言中关于结构体 调用函数的问题 新手求教

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中关于结构体 调用函数的问题 新手求教相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<string.h>
struct acmrank

char name[50];
int num;
int time;
acm[205],t;
void ranksort(int a[],int n)

int i,j,k,t;
for(i=0; i<n-1; i++)

k=i;
for(j=i+1; j<n; j++)
if(a[j]<a[k])
k=j;
t=a[k];
a[k]=a[i];
a[i]=t;


int main()

int i=0,j;
while(scanf("%s",acm[i].name)&&strcmp(acm[i].name,"end")!=0)

scanf("%d %d",&acm[i].num,&acm[i].time);
i++;

ranksort( acm.num,i+1);//code blocks上这里这么提示我C:\Users\Mcfan\Desktop\vc\5.6.cpp|34|error: request for member 'time' in 'acm', which is of non-class type 'acmrank [205]'|,我该怎么改啊?
ranksort( acm.time,i+1);//
for(j=0;j<i;j++)
printf("%s %d %d\n",acm[j].name,acm[j].num,acm[j].time);
return 0;

参考技术A use acm[xx].num, 你应该传结构体指针进去 也就是void ranksort(int a[],int n)做void ranksort(struct acmrank *acm, int n )来更好一些 参考技术B typedef struct acmrank

char name[50];
int num;
int time;
t;
在main函数中定义
t acm[205];本回答被提问者采纳
参考技术C acm->num
acm->time

Delphi调用Dll返回结构体的问题?

C写的一个动态库,其中有些函数的返回值为结构体(非指针),然后在Delphi里调用,得到的返回结果是错误的。
例如,在C里面:
结构体:
typedef struct uv_buf_t
ULONG len;
char* base;
uv_buf_t;
导出的函数:
uv_buf_t uv_buf_init(char* base, unsigned int len)
uv_buf_t buf;
buf.base = base;
buf.len = len;
return buf;

在Delphi里:
对应C的结构体:
uv_buf_t = record
len: ULONG;
base: PAnsiChar;
end;
函数声明为:
uv_buf_init: function(base: PAnsiChar; len: Cardinal): uv_buf_t;
在Delphi中调用:
procedure test2;
var
buf: uv_buf_t;
s: PAnsiChar;
begin
s := 'abcde';
buf := uv_buf_init(@s, 5);
Writeln('buf的值:len=' + IntToStr(buf.len) + ' base=' + buf.base);
end;
最终的结果是错误的,而且会导致传到C中的参数的值也不对,如果把C库中函数的返回值和Delph声明函数的返回值都改为指针就一点问题都没有,但是我们是不能动C代码的,只能接收返回的结构体,不知哪位高手有解决办法或思路,在此先谢过了。
uv_buf_init: function(base: PAnsiChar; len: Cardinal): uv_buf_t; cdecl;
调用约定都试过了,还是不行。

那就看你的结构体和传参是否正确了,你光这样瞎说,没人看的出问题。起码关键代码和大致错误贴出来. 参考技术A uv_buf_init: function(base: PAnsiChar; len: Cardinal): uv_buf_t;stdcall;

追问

调用约定都试过了,还是不行。这个也试过了的,不行。

追答buf^ := uv_buf_init(@s, 5);  //试试

追问

这样也不行的。

追答//定义
uv_buf_t = record
    len: ULONG;
    base: PAnsiChar;
  end;
puv_buf_t= ^uv_buf_t;  

//函数
var ppi:puv_buf_t
begin
   ppi :=allocmem(sizeof(uv_buf_t));
   ....
   ....
   ....
end;

本回答被提问者和网友采纳

以上是关于c语言中关于结构体 调用函数的问题 新手求教的主要内容,如果未能解决你的问题,请参考以下文章

关于JAVA调用C的DLL库中的函数问题,传入一个含有指针的结构体指针

用 结构体地址 调用 结构体中元素 非常慢的问题,怎么解决?但就C语言,不说引用

关于C语言结构体指针做函数形参的问题

C语言问题:下面是结构体和一个子函数,单步执行到 fscanf 时,程序直接跳到了下一行,fscanf 不执行!求教

Delphi调用Dll返回结构体的问题?

Go语言中关于包内函数供外部调用的问题