带有指向结构的指针和要显示的变量的函数(实际上类似于 python 中的“in”运算符)
Posted
技术标签:
【中文标题】带有指向结构的指针和要显示的变量的函数(实际上类似于 python 中的“in”运算符)【英文标题】:Function which takes pointer to structure and which variable to display(actually something like 'in' operator in python) 【发布时间】:2017-03-13 14:53:29 【问题描述】:对不起,我不懂c
我想写一个函数,它接受指向结构的指针和作为参数显示的成员...
我的目标是类似于 python 的“in”运算符......就像我将传递要在结构数组上搜索的键和值并相应地返回它
好吧,我尝试了一些工作,这就是我的意思... 它通过寻址来工作..这很好还是有风险,因为我们直接使用内存,也许更容易做到这一点?
#include <stdio.h>
#include <stdbool.h>
typedef struct Re
int x,y;
char a;
Re;
void initRe(Re *r,int a,int b, char x)
r->x = a;
r->y = b;
r->a = x;
void showRe(Re *r,int a,int b, char x)
printf("%d %d %c \n",(*r).x,(*r).y,(*r).a);
bool compareAforEqualityChar(void *a,void *b)
//printf("%c %c \n",*(char*)a,*(char*)b);
if(*(char*)a==*(char*)b)return true;
return false;
bool compareAforEqualityInt(void *a,void *b)
//printf("%d %d \n",*(int*)a,*(int*)b);
if(*(int*)a==*(int*)b)return true;
return false;
int searchAddressed(void * start , int elesize ,void *x , bool compare(void *, void *))
char *ptr =(char *)start; //Use char since one byte
int i;
for (i=0; i<10;i++)
if (compare((ptr+i*elesize),x)) //call compare function
printf("%d",i); // index where match is found
int main(void)
Re r[10];
int x=0;
int y=0;
char a ='A';
for(int i=0;i<10;i++)
initRe(&r[i],x,y,a); //Initialise Struct with some values
x++;
y++;
a++;
for(int i=0;i<10;i++)
showRe(&r[i],x,y,a); // Show All values
int elesize = sizeof(r[0]);
int z = 'C';
searchAddressed(&r[0].a,elesize,&z,compareAforEqualityChar);
//searchaddressed(struct member pointer, struct size, pointer of variable to check, pointer function to chechkwith)
【问题讨论】:
您的结构定义不是有效的 C 结构定义。另一方面,它是一个有效的 C++ 结构定义。如果您使用 C++ 编程,您可以使用模板和指向成员的指针来完成。 不可能,也不需要。 r.x 有什么问题?如果你想动态访问不同的变量(同样在这里,我很难相信你需要这个),那么你可以阅读 hash_map 并实现它或使用an existing implementation。 显示会员还是退回会员??? 哦,你的“编辑”版本是一个完全不同的问题 - 你为什么不删除原来的并制作一个新的?仍然有可能,因为我们都回答了(无用)只要你最初的问题,并且 - 在我的拙见中 - 没有人会浪费他或她的时间来尝试回答你的“编辑”一个(然后可能会再次“编辑”)。 哦,对不起,我对此很陌生..所以不能准确地说出来..感谢所有花时间的人...我会编辑原始部分... 【参考方案1】:您要实现的目标在 C 中并不容易实现。函数必须具有特定声明的返回类型;你不能有一个有时返回 int,有时返回 char 的函数。
您可能会使用union
作为返回类型。或者返回一个指向值的无类型指针 (void *
) 并将其转换为适当的类型。在任何一种情况下,调用函数的代码都需要在编写结构成员的一些知识的情况下编写,我认为这首先削弱了这样做的任何意义。
至于函数体本身,您基本上需要使用case
语句或一系列级联的if
语句并对每个可能的选项进行硬编码。同样,不清楚您这样做会获得什么。
【讨论】:
我的目标是类似于 python 的 'in' 运算符......就像我将传递要在结构数组上搜索的键和值并相应地返回它【参考方案2】:不,首先,您不能在定义期间为结构成员赋值,因为要为成员赋值,需要具有该类型的实例(变量)。它不能是结构定义本身中的变量(成员)。
您已经创建了一个structure Re
类型的变量Re
,现在您必须使用成员访问运算符.
访问该结构的每个单独成员,并根据需要分配值。
也就是说,
您不能传递变量 names 并期望对其进行一些操作。为此选择不同的方法。 对于托管环境,对于标准编译,int main()
至少应该是 int main(void)
。
【讨论】:
【参考方案3】:使用枚举可视化结构。现在你要做的就是:
#include <stdio.h>
typedef enum
x,
y,
a
ReEnum;
typedef struct Re
int x;
int y;
char a;
Re;
int func(Re *r, ReEnum en)
switch(en)
case x:
printf("x == %d\n", r->x);
break;
case y:
printf("y == %d\n", r->y);
break;
case a:
printf("c == %c\n", r->a);
break;
default:
return -1;
return 0;
int main(void)
Re r;
r.x = 5;
r.y = 10;
r.a = 'A';
func(&r,x);// should return int 5;
func(&r,y); //should return int 10
func(&r,a);// should return char 'A'
return 0;
【讨论】:
【参考方案4】:不!使用您的方法无法实现此功能。
在 main
中您可能认为的结构成员(如 x
)将被函数视为另一个变量。
另外,同一个函数不能在 C 中返回多种类型的数据。
您可能想看看 C 中的联合。它们会更适合该场景。
简介:
联合几乎类似于结构,但在联合中,一次可能只有一个成员处于活动状态(或具有分配的值)。它们被用作returntype(according to variable)
部分的替代品。
另外,尝试自己阅读一些 C 的基础知识(结构、函数等)。你可以自己回答你的问题!
【讨论】:
实现 OP 请求的内容可能没有充分的理由,但绝对不是“不可能”。可以简单地传递一个附加变量(enum
最合适),指示要打印的成员。
我的目标是类似于 python 的 'in' 运算符......就像我将传递要在结构数组上搜索的键和值并相应地返回它
@NewToandroid:C 中没有内置确切的功能(关联数组)。但是,您可以使用哈希表/映射的良好实现。【参考方案5】:
使用宏代替常规函数
#define func(stru, el) ((stru)->el)
或 - 给出相同的结果
#define func(stru, el) ((*stru).el)
【讨论】:
真的非常感谢...这正是我想要的...以上是关于带有指向结构的指针和要显示的变量的函数(实际上类似于 python 中的“in”运算符)的主要内容,如果未能解决你的问题,请参考以下文章