CUDA By Example chapter 08 程序报错:未定义标识符 PFNGLBINDBUFFERARBPROC和GET_PROC_ADDRESS

这篇博客主要介绍了在使用OpenGL编程时遇到的两个常见错误:未定义的PFNGLBINDBUFFERARBPROC和GET_PROC_ADDRESS。解决方法包括引入glew.h库,确保其在代码顶部,并正确引用gl_helper.h头文件,其中GET_PROC_ADDRESS是通过wglGetProcAddress宏定义的。这些步骤对于正确链接和初始化OpenGL函数至关重要。

1、未定义标识符:PFNGLBINDBUFFERARBPROC。

        解决办法一:#include "gl/glew.h",且其声明的位置尽量放在代码最顶端,否则编译报错。

glew.h放置在VS安装目录新建的gl文件夹下。

        解决办法二:#include "../common/GL/glext.h"

2、未定义标识符:GET_PROC_ADDRESS。

        原因:在书本上提供的gl_helper.h的头文件中,进行了相关宏定义:

        #define GET_PROC_ADDRESS( str )  wglGetProcAddress( str )

        解决办法:添加gl_helper.h头文件或者用wglGetProcAddress替换掉GET_PROC_ADDRESS。

`error A39: REGISTER OPERAND EXPECTED` 误通常表示汇编器期望一个寄存器操作数,但提供的不是寄存器。这种误一般出现在指令要求操作数为寄存器,而实际使用了立即数、地址或其他非寄存器类型的操作数的情况。 由于没有给出具体出的代码部分,下面基于之前提供的代码进行假设性的修改说明。假设在原代码中某个地方出现了类似 `MOV R0, #R1` 这样的误(这里 `#R1` 不是一个合法的立即数,因为 `R1` 是寄存器,不应该用 `#` 修饰),以下是修改后的代码示例: ```asm ORG 0000H LJMP START ORG 0030H START: MOV 40H, #0 ; 初始化 (40H) 的值为 0 MAIN_LOOP: MOV A, 40H CJNE A, #8, CHECK_VALID ; 检查 (40H) 是否超过 7 MOV 40H, #0 ; 如果超过 7,重新将 (40H) 置为 0 SJMP MAIN_LOOP CHECK_VALID: MOV DPTR, #JUMP_TABLE RL A ; 乘以 2,因为每个跳转地址占 2 个字节 JMP @A+DPTR P0: INC R0 SJMP NEXT_PROC P1: INC R1 SJMP NEXT_PROC P2: INC R2 SJMP NEXT_PROC P3: INC R3 SJMP NEXT_PROC P4: INC R4 SJMP NEXT_PROC P5: INC R5 SJMP NEXT_PROC P6: INC R6 SJMP NEXT_PROC P7: INC R7 NEXT_PROC: INC 40H SJMP MAIN_LOOP JUMP_TABLE: LJMP P0 LJMP P1 LJMP P2 LJMP P3 LJMP P4 LJMP P5 LJMP P6 LJMP P7 END ``` ### 解决该误的通用方法 1. **检查指令操作数**:仔细查看报行的指令,确认指令要求的操作数类型是寄存器。例如,`INC` 指令要求操作数为寄存器,不能是立即数或地址。 2. **确认操作数合法性**:确保使用的操作数是合法的寄存器,如 `R0 - R7`、`A`、`DPTR` 等。避免使用定义的符号或误的立即数格式。 3. **修正代码**:根据指令要求,将非寄存器操作数替换为合法的寄存器操作数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值