有关结构体内初始化使用 .xxx的情况

silverviolet 8天前 8

        下面是一段关于嵌入式 lcd控制的小段代码,使用环境为visual studio 2019。
struct lcd_controller s3c2440_lcd_controller =
{     .init    = s3c2440_lcd_controller_init,
      .enalbe  = s3c2440_lcd_controller_enalbe,
      .disable = s3c2440_lcd_controller_disable,};
提问如下        函数体内  .init是函数指针吧,右边的s3c2440_lcd_controller_init是函数的话,函数名相当于地址赋值给左边没错,但是这种初始化在我的visual studio里面很奇怪的发生问题,截图如下,
我不知道应输入表达式算啥错误,之前看了网上大部分的有关结构体先定义后初始化都是类似 struct A.xxx={ xxx=aaa,yyy=bbb}这类,也有看到

  • #include "fun_in_struct.h"

  • int main(int argc, char **argv) {

  • //定义结构体指针或者结构体变量,分别用->和.进行内部元素的使用

  • data_store_object *obj;

  • char   *word;

  • /*方法一:直接定义结构体指针然后用->对结构体变量和函数进行初始化

  • word = "nihao";

  • obj  = calloc(1,sizeof(data_store_object));

  • obj->word  = word;

  • obj->count = 24;

  • obj->word_print  = WordPrint;

  • obj->count_print = CountPrint;

  •   obj->word_print(obj->word);

  • printf("%d\n",obj->count_print(obj->count));

  • return 0;

  • */

  • /*方法二:直接定义结构体变量然后直接进行初始化,用    变量 = xxx;进行赋值

  • data_store_object obj = {

  • .word  = "nihao",

  • .count = 12,

  • .word_print  = WordPrint,

  • .count_print = CountPrint

  • };
  • 我现在很疑惑,.word也是指针啊,如果按照我的输入,为什么会出错呢?

  • 主要是结构体内成员初始化用 .xxx= yyy就会发生错误,如果用struct a.b={ccc,ddd}这样的就没问题,应该怎样修改才对?作为一个新手真的相当困惑。

最新回复 (15)
  • 饮水机 7天前
    引用 2
    我测了下,C没问题,可以用,C++不行。你看下源代码,大概率是C写的。C++和C是两种语言,很多地方不一样,不要当一种用。而且C++有严格的类型匹配。这肯定是错的
  • 楼主 silverviolet 6天前
    引用 3
    EnterpriseSolu 发表于 2021-1-13 07:47
    需要找一本教科书,按照书中所说的IDE(C++编译器)来编译,不同的编译器,对C++的语法实现有一点不同,Bor ...

         嗯,需要教科书配合实例,刚刚有盆友提了3个需要更改的地方,但是 我不懂 第3条 ;下面是提到的地方:
    1. int *hey改为void (*hey)(void);  age同理2.主函数中的gaga后面加一个逗号3.调用方法:(*fish.hey)();   age同理#include<iostream>
    using namespace std;
    void shy(void)
    {
            cout << "start" << endl;
    }void gaga(void)
    {
            cout << "game over" << endl;
    }
    struct blue {
            void(* hey)(void);
            void(*age)(void);
    };int main()
    {
            blue fish = { .hey = shy,
                                      .age = gaga
            };
            return 0;
    }
    第3条如何更改呢??  
  • 饮水机 8天前
    引用 4
    方法2的这种赋值方式没见过,也没见别人用过。你确定有方法2这种赋值方式吗?
  • 楼主 silverviolet 7天前
    引用 5
    饮水机 发表于 2021-1-11 22:17
    方法2的这种赋值方式没见过,也没见别人用过。你确定有方法2这种赋值方式吗?

         方法2是有的,我就是从 韦东山的嵌入式视频s3c2440中有关lcd驱动里看到,然后翻看了他的文档,发现这种初始化方法后看不明白然后百度了下其中某个 CSDN https://blog.csdn.net/perfectionman/article/details/53373664 ,最大的问题是按照这种方式照葫芦画瓢显示E0029错误。
  • EnterpriseSolu 7天前
    引用 6
    .号没有这种用法
    object x=new X();
    x.SomeMethod();  点号的一种用法
    或是x->SomeMethod();  初始化,点号不能这样用,这是语法规则,没有道理可讲,熟练就习惯了
    data_store_object obj = {.word  = "nihao",
  • 禁闭岛 7天前
    引用 7
    把你的.cpp文件名后缀改为.c试试
  • 鲸鱼jerry 7天前
    引用 8
    类型不匹配吗?int* 和void*
  • xy20200214 7天前
    引用 9
    gnu c,你使用gcc编译试试
  • 楼主 silverviolet 7天前
    引用 10
    EnterpriseSolu 发表于 2021-1-12 08:20
    .号没有这种用法
    object x=new X();
    x.SomeMethod();  点号的一种用法

            书上好像只有结构体成员初始化的时候可以用. 不过那种初始化的. 是struct a.结构体内成员={,,},您说的.号么有这种用法但是下面
    初始化,点号不能这样用,这是语法规则,没有道理可讲,熟练就习惯了
    data_store_object obj = {.word  = "nihao",这又是什么情况呢?我实属门外汉请点拨
  • 楼主 silverviolet 7天前
    引用 11
    禁闭岛 发表于 2021-1-12 09:04
    把你的.cpp文件名后缀改为.c试试

    改了,貌似还是不行,您按我这样输入的能通过吗??
  • 楼主 silverviolet 7天前
    引用 12
    鲸鱼jerry 发表于 2021-1-12 09:18
    类型不匹配吗?int* 和void*

    不是的,输入上去显示依旧E0029 应输入表达式 这个错误
  • 楼主 silverviolet 7天前
    引用 13
    xy20200214 发表于 2021-1-12 09:30
    gnu c,你使用gcc编译试试

    没试过这个软件,您能帮我运行下看看能成功吗???
  • EnterpriseSolu 6天前
    引用 14
    需要找一本教科书,按照书中所说的IDE(C++编译器)来编译,不同的编译器,对C++的语法实现有一点不同,Borland C++ ,Visual C++, QT C++ 等
    脱离具体编译器来说语法,有点看不见摸不到,也不容易有深刻理解
  • 楼主 silverviolet 6天前
    引用 15
    EnterpriseSolu 发表于 2021-1-13 07:47
    需要找一本教科书,按照书中所说的IDE(C++编译器)来编译,不同的编译器,对C++的语法实现有一点不同,Bor ...

         嗯,需要教科书配合实例,刚刚有盆友提了3个需要更改的地方,但是 我不懂 第3条 ;下面是提到的地方:
    1. int *hey改为void (*hey)(void);  age同理2.主函数中的gaga后面加一个逗号3.调用方法:(*fish.hey)();   age同理#include<iostream>
    using namespace std;
    void shy(void)
    {
            cout << "start" << endl;
    }void gaga(void)
    {
            cout << "game over" << endl;
    }
    struct blue {
            void(* hey)(void);
            void(*age)(void);
    };int main()
    {
            blue fish = { .hey = shy,
                                      .age = gaga
            };
            return 0;
    }
    第3条如何更改呢??  
  • 古月不傲 5天前
    引用 16
    silverviolet 发表于 2021-1-13 21:03
    嗯,需要教科书配合实例,刚刚有盆友提了3个需要更改的地方,但是 我不懂 第3条 ;下面是提到的地方 ...


    g++编译没问题,可以正常输出
    VC似乎不行,以前见过这种写法,当时试过
  • 游客
    17
返回