关于C结构的一个问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C结构的一个问题相关的知识,希望对你有一定的参考价值。

题目:定义一个结构,用来保存学员的信息,包括:学号,姓名,C课程成绩,Java课程成绩。编写一个程序,用来接收五位学员的信息,计算每位学员的平均成绩并显示详细信息,计算平均成绩的功能通过函数实现。
以下是我的程序,有错误,请帮忙指点,谢谢!

#include<stdio.h>
#define N 5
void jisuan(int);
struct student

int num;
char name[20];
float scoreC;
float scoreJ;
;
void main()

int i;
int student[N];
printf("\n请输入5为学员的信息,即学号、姓名、C课程成绩、Java课程成绩: \n");
for(i=0;i<N;i++)

scanf("%d",&student[i]);

jisuan(student[i]);

void jisuan(int student[N]);

int i;
float ave,sum=0;
//int student[N];
sum=student[i].scoreC+student[i].scoreJ;
ave=sum/2;
printf("\n平均分为:%6.2f\n",ave);

参考技术A typedef struct
int num;
char name[20];
float scoreC;
float scoreJ;
student;

结构体最好这样定义:
typedef struct
int num;
char * name;
float scoreC;
float scoreJ;
student;

在实际操作里面再对char指针用malloc分配内存,因为这样子可以节省很多没有必要的内存开销。malloc里面的内存大小用strlen根据const字符串大小定义。
参考技术B main()
int i,j; char a[20]; float c[2];
struct student

long num;
char name[20];
float mark[2];
str[5];
for(i=0;i<5;i++)

scanf("%ld",str[i].num);
grts(a); /*shu ru xing ming*/
for(j=0;j<2;j++)
scanf("%f",str[i].c[j]); /*shu ru liang ke cheng ji*/




不知道这样可以不可以 我现在一下子想的不是太清楚,还望多多见晾
参考技术C struct student

int num;
char name[20];
float scoreC;
float scoreJ;
;
没有定义变量!!struct student 相当于 int,float等....

for(i=0;i<N;i++)

scanf("%d",&student[i]);

这个是对什么的输入呢???
建议回去看看结构体的操作吧!!
后面等改完再说吧,这个程序基本上要全动了!!
参考技术D 区分类型与变量

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

比如有个结构体:

typedef struct _SSM_EVENT



WORD wEventCode; //事件编码

int nReference; //参考值

PVOID pvBuffer; //事件信息缓冲指针

 DWORD dwParam; //输出参数

SSM_EVENT, *PSSM_EVENT;

PVOID是一个指向300空间的一个指针,可以理解为一个char[]数组,现在java需要调用c里dll库的一个函数,其中一个参数为该结构体指针*PSSM_EVENT,传入时有的参数含有值。1.那么我该如何传入这个带有值的参数。2.我该怎么获取这个结构体的值,尤其是指针的值。无论是使用jnative,jna,jin什么样的第三方jar包都可以。
结构体里面含有一个指针的属性,在JAVA分配创建一段内存,我通过第三方JAR包传递并返回这段内存,该JAR包提供的函数可以读取这段内存里面的值,但现在由于上述的结构,这段内存里面含有一个指针值,也就是说在返回的这段内存里面的值里,由一个指针地址值,但我需要的是这个指针指向的地址里面的数据,而不是这个指针地址值,我该怎么取呢?现在这个是最主要的问题了

参考技术A 在java里定义对应的,分配地址空间大小相同的结构体。
java应该也可以定义struct.
比如dword可以定义为long.
把c中的pvoid定义找出来,也定义一个struct.追问

定义结构体没有问题,现在关键是JAVA没有指针的概念,而dll库需要传递的是一个结构体指针,关键是指针,怎么传。现在这个问题已经解决了,还有另外一个问题,请看我的追加提问

追答

c还是可以重调java的,可以参考网上资料,指针地址什么的,可以传递。这个你自己考虑一下。

追问

那这样就更麻烦了,我可以在c++重新写个函数,调用DLL,返回需要的值。但是因为现在比较急,我没有时间研究那么多的,所以我想尽量只在JAVA做,现在就差这一步了。

追答

java的变量就是指针,定义java结构体后,一样可以取到相同的值。c是什么值,java就是什么值。

追问

c传回来是指针,是个地址值,java现在能获取到的是这个地址值,怎么通过这个地址值去获取内存的数据?

参考技术B 没做过这么复杂的。
但你想调用DLL,
应该是通过native生成的方法。你通过这个方法中的参数进行交互。
参考技术C 我觉得用java调用这个肯定是使用jni了。这个是无疑了,网上jni的api和教程挺多的。查查就知道了。然后说得到指针指向的值而不是地址,这步操作是c语言的语法问题,也就是说c的源码取值和取地址那里写对了就可以了。jni只是用来调用的。

以上是关于关于C结构的一个问题的主要内容,如果未能解决你的问题,请参考以下文章

关于C语言中函数修改结构体的值的问题

C语言关于结构体变量为动态数组赋值问题

关于C语言的问题,数据结构

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

关于c语言结构体变量成员引用的问题

关于c语言结构体变量成员引用的问题