gpt4 book ai didi

c - 函数的参数是指向声明为 const 的参数的指针,如何处理?

转载 作者:行者123 更新时间:2023-11-30 14:37:36 25 4
gpt4 key购买 nike

我使用 MikroC 作为 PIC,我不知道编译器的名称。我用的是PIC18F4550。我需要在 16x4 LCD 上打印菜单项列表。我在这里放置了一段代码,因为代码太大,无法放在这里,所以,我尝试在这里编写一个最小的可重现示例。

代码的工作原理如下:我有一个堆栈来存储菜单,菜单结构具有标题和项目数等字段。

在文件main.c

#include "menu.h"

int main(){
unsigned char error;
error = 0;
Tstack stackMenus;

error = menu_push(&stackMenus, &mainMenu);

}

================================================== =========

在文件menu.c

#include "menu.h"

const Tmenu mainMenu = {
4,
"Main Menu"
};

unsigned char menu_push( Tstack *s, PTmenu item ){
unsigned char error = 0;

if(s->topo == 9){
return 1;
}
s->pilha[++s->topo] = item;
return error;
}

================================================== =======

在文件menu.h

struct Smenu {
unsigned char numberOfItens;
char *Title;
};
typedef struct Smenu Tmenu;
typedef Tmenu *PTmenu;

struct Sstack {
PTmenu stack[10];
signed char top;
};
typedef struct Sstack Tstack;

extern Tmenu mainMenu;

Terro menu_push(Tstack *s, PTmenu item);

我将 mainMenu 声明为 const,并将其作为参数传递给 menu_stack。然而,编译器提示说这是“非法指针转换”。我尝试做

unsigned char menu_push( Tstack *s, Tmenu * const item ){ ...}

unsigned char menu_push( Tstack *s, const Tmenu * item ){ ...} 

但是出现了同样的消息,“非法指针转换”。

我该如何处理?我需要将 mainMenu 声明为 const,因为还有其他菜单,而且我使用的是 RAM 内存大小有限的微 Controller 。

最佳答案

此代码在相当严格的编译选项下可以干净地编译。将您的母语代码转换为翻译后的英语框架需要进行大量琐碎的更改。但是,我已经消除了 PTmenu作为一种类型(如评论中所暗示的) - Is it a good idea to typedef pointers? 的答案一般是“否”。

menu.h

typedef unsigned char Terro;

struct Smenu
{
unsigned char numberOfItens;
char *Title;
};
typedef struct Smenu Tmenu;

struct Sstack
{
const Tmenu *stack[10];
signed char top;
};
typedef struct Sstack Tstack;

extern const Tmenu mainMenu;

Terro menu_push(Tstack *s, const Tmenu *item);

main.c

#include "menu.h"
#include <stdio.h>

int main(void)
{
unsigned char error;
Tstack stackMenus = { { 0 }, 0 };

error = menu_push(&stackMenus, &mainMenu);
printf("Error = %d\n", error);
}

menu.c

#include "menu.h"

const Tmenu mainMenu =
{
4,
"Main Menu"
};

unsigned char menu_push(Tstack *s, const Tmenu *item)
{
unsigned char error = 0;

if (s->top == 9)
{
return 1;
}
s->stack[++s->top] = item;
return error;
}

在运行 macOS 10.14.6 Mojave 的 MacBook Pro 上使用 GCC 9.1.0 测试编译(到目标文件):

$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -c menu47.c
$

代码仍然存在问题 - if (s->top == 9) 行是恶魔般的。
它应该更像 if (s->top < 10)除了10应该是标识 stack 大小的名称数组位于 Tstack — 我可能会在 enum { STACK_SIZE = 10 }; 上使用变体然后在数组维度和测试中使用它。这个名字有点太通用了——它很容易与其他堆栈大小发生冲突。但这取决于您的用例,并且让我们走得更远。 menu.h 中应该有 header 防护装置文件( #ifndef MENU_H_INCLUDED/#define MENU_H_INCLUDED/…标题内容…/#endif )。结构元素的大写是随意的。变量errormain()可能应该是 Terro 类型。 menu.c中函数的返回类型应与 menu.h 中的声明匹配— 应该是Terro也。等等

关于c - 函数的参数是指向声明为 const 的参数的指针,如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57205756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com