带有指向结构的指针和要显示的变量的函数(实际上类似于 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”运算符)的主要内容,如果未能解决你的问题,请参考以下文章

在带有指向堆栈变量的指针的函数调用之间使用传输值(按值?)

结构体指针与结构体变量用作函数参数时有啥区别,在用法上

替代非OOP编程中的多态?

混合 C/C++ 代码中的结构指针

Swig:将成员变量(指向值的指针)转换为 python 列表

使用变量与指向变量的指针作为函数的参数