PSP 编程导学(二)

PSP 编程导学(译)(一) 第一课建立开发环境如何获取toolchain和PSPSDK并通过CYGWIN在windows计算机上运行。完全新手指南.这是本系列导学的第一部分,它将引导一个程序员新手走上开发自己的Sony Playstation Portable (PSP)自制程序之路。如果你正在阅读,祝贺你,你已经越过了一个程序员的最大障碍。一般来说,编程的最难之处就是开始。好了,通过阅读这篇导学,你已经上路了。创建 阅读详情

第二课
创建你的第一个程序
一篇在Sony PSP上安装,创建并执行简单的"Hello World"应用程序的攻略


读完第一课之后,你已经拥有一个可工作的开发环境,并可以在其中创建你的应用程序了。现在该做什么呢?好,下面就是你期待已久的部分了——你的第一个PSP程序。这篇导学将介绍C语言的基本知识和你将要构造的程序的基础。

我们先要创建一个目录结构来组织我们的工程。打开一个CYGWIN bash shell,输入"mkdir projects"并回车。这个"mkdir"命令代表"make directory"(创建目录),它将在你当前的操作路径下创建一个目录或文件夹。那么现在我们为所有的工程建立了一个新文件夹,进入这个文件夹,通过"cd projects"命令。现在我们为这个具体的工程建立另一个目录。输入"mkdir helloworld"并回车。现在通过"cd helloworld"切换到新目录中。

下一步是打开一个文本编辑器。你使用什么并不真正重要,可以是记事本、写字板,无论什么都行。我喜欢用一个专门来编辑C/C++源代码的编辑器,因为它们有语法高亮显示的功能(我用Dev-C++),但是说实话,用什么都无关紧要,只要你知道如何去使用它。

现在,在"helloworld"路经下创建一个叫"main.c"的文件。这将包括我们程序的源代码。对那些不知道什么是源代码的人(我知道会有一些的)我要解释一下,源代码是我们创建程序时所写的东西。它是以一种人们能够理解的方式写成的。在大多数语言中,源代码需要被转换成计算机(我们这里是PSP)能够理解的格式。这叫做编译语言,C和C++都属于这类语言(这个转换过程可以通过我们在第一课中建立的编译器来进行)。还有一些其它的编程语言,他们利用一种叫做解释器的东西来解释源代码,并同时发送出机器代码。这叫做脚本语言(比如PHP就是一种脚本语言)。

好,那么我们已经有了一个新文件来放置我们的源代码。现在我们该开始写了。程序第一部分应该包含一些注释,来说明程序的目的、创建时间、作者。注释是一些不被编译进二进制文件的代码行(或被脚本语言的解释器忽略的代码行)。注释是代码的重要部分,因为一段时间后当你或者其他人回来修改你的代码的时候,你可能不记得这些错综复杂的程序到底干了些什么。所以,你可以以注释的形式给自己留下一些提示。注释是通过"//"和"/*"表明的。当你看到"//"的时候,他表示该行剩下的部分是注释。"/*"表示编译器(或解释器)开始忽略代码直到遇到一个"*/"操作符。通过"/*"操作符标明的注释可以跨越多行,但是用"//"标明的注释只能注释掉那行余下的部分。

所以,在开始写我们的程序的时候,我们在最上边写下如下注释,包括它做了些什么,何时创建,还有是谁写的。
// Hello World - My First App for the PSP

/*
          This program was created by (Your Name Here) on (Date Here)
          It is a simple "Hello World" Application.
*/
在程序的下一部分,我们告诉编译器我们将在程序中用到那些头文件和包含文件。从本质上来说"#include"指令所做的就是把你传给它的文件中的代码复制到你的程序中。这使你的程序保持简单,同时还能利用那些已经为你写好了的高级代码。include指令即可以包含编译器自带的头文件(或者你添加到编译器的),又可以包括特定项目的特定头文件。分辨include的是上述的哪一种文件的方法是看后面的文件是放在"<>"之中还是放在引号之中的。用小于号大于号include的文件是编译器包含("include")的路径中的文件,用引号include的文件是与当前文件相同路径下的文件。我们要在我们的程序中包含两个文件。第一个是"pspkernel.h"。这是一个你写所有PSP简单程序都应该include的文件。它包含了所有专门用于你的PSP的代码。如果你没有include这个文件,你的程序将不能够在PSP上运行。第二个文件我们要 include的是"pspdebug.h"。这个文件包含了一些对调试程序很有用的函数,明确地说它包括了我们用来向屏幕显示文本信息的函数。所以,添加如下代码到你的程序中:
#include <pspkernel.h>
#include <pspdebug.h>
下一步我们告诉PSP一点关于程序的东西。这其实不那么重要,没有它你的程序也可以通过编译,但是保留它常常会是个好主意(如果仅仅为了向前兼容)。第一个属性是程序的名字,但是它绝不是程序将显示的名字(我们将在以后改变程序显示的名字)。其他的值是其他的属性(留着不用管),主版本号、副版本号。除了名字我们让所有这些都保留默认的就行了。所以,添加如下这行代码到你的程序中:
PSP_MODULE_INFO("Hello World", 0, 1, 1);
现在我们写一个用来向屏幕写信息的函数。这步是可选的,但是它使编写基于文本的程序轻松了很多。这行代码本质上是把PSP内建的函数"pspDebugScreenPrintf"改变成更容易输入的(名字比较短的)函数。这个函数被用来向屏幕写信息(不久我们就会看到)。其实我们要做的就是把"pspDebugScreenPrintf"重命名为"printf"。所以,从现在开始每次我们用到"printf"时,编译器都将认为我们输入的是"pspDebugScreenPrintf"。这就是我们要做的;我们把"printf"定义成"pspDebugScreenPrintf",像这样:
#define printf pspDebugScreenPrintf
Ok,我现在有一个坏消息和一个好消息。坏消息是,下一块代码相当复杂。好消息是,你不需要理解它。这里只对它所做的事进行一下简单的解释(我们以后会一行一行地进行语法解释)。本质上说,这块代码所包括的是我们程序将要调用的函数。这些函数将使你的程序运行在PSP上并使你不用担心PSP会死机或意外退出游戏。将这段代码放入你的程序中:
/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
          sceKernelExitGame();
          return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
          int cbid;

          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);

          sceKernelSleepThreadCB();

          return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
          int thid = 0;

          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }

          return thid;
}
下一步,我们将定义"main"函数。每个C和C++程序都需要一个main函数。这是代码执行的开始位置。C(和一些C++)按顺序的形式运行的。这意味着代码走的是直线路径。比如如果你有如下的代码:
//不要把这些加到你的程序中
//它是一个例子

int myFunction() {
          //Print Out 'A'
          return 0;
}
int main() {
          //Print Out 'B'
          myFunction();
          //Print Out 'C'
          return 0;
}
注释(如果你忘了说明是注释,请看上文)的地方做它所描述的事情。程序将输出‘B'再输出’A'再输出‘C',因为编译器从main函数中开始。它先输出’B'然后它看到了对"myFunction"的调用(在上面定义的一个函数),走到那里,发现需要输出‘A'并且返回它(在main中)离开的地方,然后输出’C'。你的所有程序(除非你使用高级的C++编程)都会遵循这个线形的结构。所以,"main"函数对你的程序来说是至关重要的。要定义一个函数,你要使用如下的结构:"[return type] [function name]() {"。返回类型是指函数返回给程序的是什么。对"main"来说,返回类型总是"int"(代表整型)。函数名是指你函数的名字,"main"函数的名字很显然就是"main"。所以,把下边一行添加到你的代码中,来定义你的函数:
int main() {
现在我们需要添加两行代码来创建屏幕,并且使我们在之前定义的一些函数能够被使用(你不需要知道这两行代码是如何工作的)。甚至你不需要知道那些函数是如何工作的,重要的是掌握如何调用函数的概念。它实际上非常简单。你只需要写出函数名并在后面加上括号(如果有参数的话,将参数放在括号中,我们以后要讲到)。每行程序要以分号结尾。这是因为编译器看不到任何空白。两行代码之间,你可以空100行,编译器并不关心。这是有用的,因为这允许你按照自己想要的、能够理解的格式来写代码。你可以通过空白将一些代码放在一起,或者其它你任何想做的。但是话又说回来,要结束一行代码,你需要一个分号。所以添加下面这两行到你的程序中:
pspDebugScreenInit();
SetupCallbacks();
现在该是写一些我们能够看到实际结果的代码的时候了。还记得我们把"pspDebugScreenPrintf"定义成"printf"吗?好,用它的时候到了。我们通过调用带有一个参数的"printf"函数来向屏幕打印文本信息。参数是你传给一个函数供其使用的一个变量。这些在你以后编写自己的function的时候迟早会有用的。所以,为了使"printf"向屏幕输出,我们需要传给它一个字符串。我们将"Hello World"字符串传给函数就可以将它输出。"Printf"是一个很强大的函数,因为你可以使用它往屏幕上输出其它变量。我们可以把它们作为其它的参数来传递,但是先在还不是要讲这些的时候。就现在来说,我们只是输出"Hello World"到屏幕上,像这样:
printf("Hello World");
到这里,你告诉了"printf"函数向屏幕输出文本。现在我只需要再完成一些东西,我们的源代码就准备好构建了。我们需要暂停程序以便能够看到输出结果。否则,它就会根本没有反应,或者直接返回PSP菜单。你可能永远看不到你那美丽的短语被输出到屏幕上,因为它被非常快地擦掉了。所以添加如下这行代码用来暂停程序,直到"Home"被按下,用户被返回到PSP操作系统。
sceKernelSleepThread();
现在我们需要给函数一个返回值,因为当我们定义它的时候("int main()"),我们告诉编译器它将返回一个整数。所以只要返回一个'0'(这是个零,不是一个大写的'o'),这样做:
return 0;
最后,用一个括号来结束函数:
}
程序这样就写好了!现在我们只要建立一个Makefile来告诉编译器我们想怎样编译这个工程。所以创建一个名叫"Makefile"的文件,主要没有扩展名(比如.txt)。完成之后,用你的文本编辑器打开它。

将以下内容写入Makefile:
TARGET = hello
OBJS = main.o

CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Hello World

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
你可以把这个Makefile用作你所有简单工程的基础部分。有时候你需要添加库文件或其他的到这个文件中,但是现在来说它相当简单。本质上,它只是告诉了编译器去找到"main.c"文件并用PSPSDK来把它构建成一个PSP可执行的.pbp文件。如果你把这个Makefile用于其它工程时,需要改的是"PSP_EBOOT_TITLE = Hello World"这里。你可以把"Hello World"换成你的程序的标题,当你在PSP游戏菜单上选中它的时候这个名字将被显示。

现在打开一个CYGWIN Bash Shell并且"cd"进入你的"projects/helloworld"目录。输入"make"后Shell会为你输出一些东西。它将告诉你你的源代码是否存在使它无法编译的错误(errors)。通常,如果它给你一些警告(warnings),没有什么大问题。错误是你应该注意的,警告只是可能导致bug的地方。注意:如果你的psp的Firmware是1.5版的,你可以通过输入"make kxploit"来代替"make"自动生成两个文件夹。

如果你没有任何错误,祝贺你!你已经成功的创建并编译了你的第一个PSP应用程序。我打赌你现在迫切地想试试它。所以把"C:/cygwin/home/yourUserName/projects/helloworld/EBOOT.PBP"放到你的PSP,就和安装其他自制程序一样,自己试试吧!

要学习更多的PSP编程知识,比如if/then语句,变量,循环,和按钮输入,请看第三课。

注:原文地址http://www.scriptscribbler.com/psp/tutorials/lesson02.htm

由于原文可能不定期更新,所以本译文不保证与原文保持同步

PSP 3000与PSP 2000的区别及其编程特点 在编程方面,PSP的开发环境主要使用C语言和PSP SDK,开发者可以利用丰富的功能和API创建各种游戏和应用程序。PSP系列中,PSP 3000和PSP 2000是两个受欢迎的版本。PSP 3000采用了改进的LCD屏幕技术,具有更高的对比度和更鲜艳的颜色表现,使图像更加清晰。通过编写类似的代码,开发者可以利用PSP的功能和API创建更复杂的游戏和应用程序。PSP的开发环境提供了丰富的文档和示例代码,以帮助开发者更好地利用设备的功能。在编程方面,PSP的开发环境主要使用C语言和PSP SDK。 阅读详情

相关推荐

PSP程序开发 pspdev

pspdev,有需要的下。 很好的一个psp编程工具 psp编程必备。

PSP开发--[C++]接收按键控制

padctrl.cpp Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include pspkernel.h>#include pspdebug.h> #include pspdisplay.h>#include pspctrl.h>#inc

gnimgnot 962

Simulink单相桥式有源逆变电路仿真:从器件选型到波形分析(MATLAB 2018a实战)

本文基于MATLAB 2018a的Simulink平台,详细演示了单相桥式有源逆变电路的完整仿真流程。从Simscape/Power Systems库的器件选型、参数配置,到触发脉冲设置与电路连接,逐步指导搭建仿真模型。通过调整触发角α,直观展示了电路从整流到有源逆变的工作状态切换,并深入分析了负载电压、电流波形,以及逆变颠覆现象的产生条件与特征。

cake8的博客 1160

psp开发------按键识别

1.创建testkey.c #include #include #include #include PSP_MODULE_INFO("Hello World", 0, 1, 1); #define printf pspDebugScreenPrintf /* Exit callback */ int exit_callback(int arg1, int arg2, void

奔跑的蜗牛 1754

EDA开源仿真工具verilator入门4:访问函数介绍

访问函数(Visitor Function)是verilator算法实现的主要工作方式之一,本节将介绍一下访问函数。

fangfanglovezhou的博客 1076

别再死记硬背参数了!用ADS手把手教你仿真一个4GHz镜像抑制混频器(附完整工程文件)

本文详细解析了4GHz镜像抑制混频器的ADS仿真全流程,从理论到实践,涵盖混频器设计基础、ADS工程搭建、二极管选型、非线性仿真及性能优化。通过实战案例,帮助工程师掌握关键参数平衡与调试技巧,提升射频电路设计效率。

weixin_42552716的博客 339

PSP游戏机开发指南:自制游戏代码解析

本文介绍了PSP游戏开发的基础流程,包含环境搭建、程序框架、图形渲染和音频处理等核心内容。通过代码示例展示了PSP系统初始化、控制器输入处理、2D图形渲染(包括三角形和矩形绘制)、简单音频播放等功能实现,并提供了一个完整的弹球游戏案例。文章还列出了必需的开发工具(PSPSDK、MinPSPW等)和基本编译命令,为开发者提供了PSP游戏开发的完整入门指南。

QWS382的博客 612

使用Dify打造视频生成工作流:从提示词到视频的完整指南

Dify作为开源LLM应用开发平台,通过可视化工作流编排实现从文本到视频的端到端生成,将创意周期从天级缩短至分钟级。核心流程包括提示词工程、视频API调用、存储分发和结果反馈。

牛奶夹心巧克力 3435

学习PSP软件自制编程入门教程

学习PSP软件自制编程入门教程   首先说下,PSP下的软件开发是见比较辛苦的事,需要对这个爱好的一种热情和对简单的软件编程思想和技能的掌握,希望大家在看完这贴后有所收获.     先来讲下目前对于PSP自制软件的开发的要求和环境的需求:   开发的要求  首先是对软件工程设计的一个大概的了解:   1> 系统分析和系统设计阶段: 主要是进行可行性分析和系统开发设计,这个阶段是最重要的,它把握

FF的专栏 1万+

Halcon实战:5分钟搞定灰度图转热力图(附完整代码)

本文提供了一份Halcon实战指南,详细讲解如何在5分钟内将灰度图转换为直观的热力图。通过核心代码演示了利用HSV颜色模型进行色彩映射的原理与步骤,包括图像归一化、通道构建与空间转换,并附赠了深度图可视化等进阶应用技巧,帮助工程师快速提升图像分析效果。

weixin_29240343的博客 283

【2025年华为秋招(AI)-11月19日-第一题(100分)- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要: 本文包含15道单选题和5道多选题,涵盖机器学习、深度学习、概率统计和数值计算等多个领域。单选题涉及Transformer的Softmax层作用、最小二乘法拟合、概率密度计算、注意力机制、反向传播问题、ROC曲线用途、截断误差来源等知识点。多选题考察大模型训练技术、BERT/GPT比较、强化学习对齐方法、CNN常见层以及PCA特性等内容。题目设计注重理论与实践结合,既包含数学推导,又关注前沿技术应用,全面检验读者对机器学习核心概念的理解能力。正确答案均附有详细解析,帮助理解相关技术原理。

m0_73659489的博客 147

psp编程指南2

  学习了第一课之后,你已经建立了编写psp程序的编译环境。也许你已经迫不及待开始你第一个psp程序。这个教程将为你提供一些c语言的基础知识,并为你的编程之路打下基础。  我们先建立目录来存放我们要编写的程序项目。打开CYGWIN bash shell,键入 "mkdir projects",回车。(mkdir,这个命令是用来建立文件夹或目录的,熟悉linux和unix的朋友一定不会陌生),现在,

lee576的专栏 3382

【永磁同步电机】simulink永磁同步电机PMSM矢量控制【含Matlab源码 7372期】

simulink永磁同步电机PMSM矢量控制 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1029

PSP 编程导学(三)

 第三课编程入门编写程序的技巧。PSP上的C语言基础速成教程。读过第一课和第二课后,你现在应该已经有了一个开发环境,并且已经编译了你的第一个基础的PSP应用程序。现在该是时候写点更大更好的东西了。一个"hello world"程序非常的好,通过学习它大大地丰富了我们的经验,但是它什么也没做。这篇导学就来讲一讲如何来做些东西。你需要知道的是这篇导学不意味着PSP编程的全部。与其说是“如何建立

简单小虫 3142

Xilinx FPGA平台GTX简易使用教程(五)GTX收发测试及示例工程介绍

GTX IP配置完了,你不得搞个回环测试一番?

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

psp编程入门二--转载

读完第一课之后,你已经拥有一个可工作的开发环境,并可以在其中创建你的应用程序了。现在该做什么呢?好,下面就是你期待已久的部分了——你的第一个PSP程序。这篇导学将介绍C语言的基本知识和你将要构造的程序的基础。我们先要创建一个目录结构来组织我们的工程。打开一个CYGWIN bash shell,输入"mkdir projects"并回车。这个"mkdir"命令代表"make directory"

hx_ls_8000的专栏 2521

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

psp编程入门三--转载

编写程序的技巧。PSP上的C语言基础速成教程。读过第一课和第二课后,你现在应该已经有了一个开发环境,并且已经编译了你的第一个基础的PSP应用程序。现在该是时候写点更大更好的东西了。一个"hello world"程序非常的好,通过学习它大大地丰富了我们的经验,但是它什么也没做。这篇导学就来讲一讲如何来做些东西。你需要知道的是这篇导学不意味着PSP编程的全部。与其说是“如何建立一个游戏”不如说

hx_ls_8000的专栏 1223

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

psp编程入门一--转载

 这是本系列导学的第一部分,它将引导一个程序员新手走上开发自己的Sony Playstation Portable (PSP)自制程序之路。如果你正在阅读,祝贺你,你已经越过了一个程序员的最大障碍。一般来说,编程的最难之处就是开始。好了,通过阅读这篇导学,你已经上路了。创建你自己的程序的第一步是建立你的开发环境。这个环境能够把你写的源代码转化成可以在PSP上运行的文件格式。我们将在你的系统上安

hx_ls_8000的专栏 1533

PSP程序开发第四课-----png格式图像处理

      通过GU函数在自己的程序中添加(png)图像,我想这应该是每个人想要的。下载本课Demo首先我假设你已经安装了cygwin(也可以不要),并且安装了DevkitPro,知道怎样生成eboot.pbp并且放入psp中运行,那就往下看。否则重新阅读前面的教程。也许你还要再修炼一下C或者C++。        在正式进行工作前,我们先要安装一些SVN的新库文件。也许你要问SVN是什么,它是一

iversonyang的专栏 2370

psp中java,PSP编程概述

元旦准备买NDS,顺带关注了下PSP,其实是想,或许买PSP也不错~PSP很像一个平台,提供了很多东西,譬如官方的PS模拟器~在上面编程也是个不错的想法。国外的一个网站提供了很多信息,PS2Dev Network (http://www.ps2dev.org),有教程http://ps2dev.org/psp/Tutorials,现在由于不久前的地震,基本无法登陆那个网站。更多的信息在http:/...

weixin_31621945的博客 544

软件工程作业二:个人编程项目PSP

如何对红楼梦进行章回分割,以及统计相关“字符“出现的次数。

weixin_65876848的博客 602

2023(春) 软工作业 2:个人编程项目PSP

不同于以往的代码练习,由于前期缺乏系统的规划,盲目搜索以及对python语言的不熟悉,花费大量时间对知识点进行收集,整理和学习。因此,在着手项目之前做好前的规划尤为重要,同时还需要对项目使用的代码熟练掌握。用"悲"、"哭"、"泣"等同义词表示悲。:阅读理解以下编程任务,并估计完成这些任务需要的时间,填表写PSP表中预估耗时(时间单位:分钟):按照PSP表格,分14个阶段完成以上编程任务,并填写PSP表的实际耗时一列(单位:分钟)。:写出这次实验与以往编程练习不同之处,感受(体会)、经验教训等。

qq_62340955的博客 303

我也玩PSP开发!(2)—— PSPSDK示例 源码分析

     放假啊,这叫玩啊,天天不务正业,还玩些可能和未来工作无关的技术!内心充满了罪恶感啊    写HelloWorld太无聊了,转了一圈PSPSDK发现有自带sample,方便快速上手的好东西,位置在开发包/psp/sdk/samples下面,其中包括声音,控制器,红外,usb,wifi,电源等等。还真不少,先挑简单的看看。恩~~我看controller挺简单!就看这个!    

Alex Xu's blog 9662

PSP编程环境&破解个人研究笔记——HelloWorld

此BLOG不写东西了,以后只转载自己BLOG的东西 传送门:http://joylocus.com/index.php/2010/12/psphack1/

一路走来,未留足迹 1058

PSP开发二 终于出现了Hello PSP!

      经过一早上的折腾,我的Hello PSP!终于出现了!       第一次在linux下写psp代码,昨天虽然编译得差不多了,但是要写还是有点无从下手的感觉。经过一晚的沉淀,今天早上开工写,当然首先还是去找下教程吧,功夫不负有心人,果然找到一篇很适合像我这样菜的人。 http://blog.csdn.net/lee576/article/details/2033754 上面这位大...

jike062的专栏 337
上一篇: 第一次辞职
下一篇: 薪水小悟
weizhee
博客等级 码龄22年 8粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值