欢迎光临威信融信网络有限公司司官网!
全国咨询热线:13191274642
当前位置: 首页 > 新闻动态

C++开发电话簿程序步骤详解

时间:2025-11-28 17:42:07

C++开发电话簿程序步骤详解
MODIFY_ADD: 向属性添加新值。
36 查看详情 用户输入 12。
本文将介绍如何利用 `ArrayObject` 和循环结构,更简洁、高效地实现根据请求参数添加用户角色,从而提高代码的可读性和可维护性。
这意味着修改其中一个元素,会影响到所有引用该对象的元素。
二叉搜索树(Binary Search Tree, BST)是一种重要的数据结构,它满足:对于任意节点,其左子树所有节点值小于该节点值,右子树所有节点值大于该节点值。
从 Go 1.5 开始,GOMAXPROCS 的默认值已更改为可用 CPU 核心数。
这可以使代码更简洁、更易于阅读和维护。
在开发Go语言相关的工具,如代码编辑器或IDE时,自动补全功能至关重要。
例如,提供一个获取用户信息的路由: /api/user/123 → 返回 { "name": "张三", "email": "zhang@example.com" } 前端通过fetch或Ajax调用该接口,拿到数据后用DOM操作填充表单字段,实现更灵活的自动填充。
它适用于所有支持迭代器的标准容器,如 vector、list、deque、array 等。
3. 实现细节与示例代码 下面是采用“锁定OS线程与主线程任务队列”模式的Go语言程序结构示例:package main import ( "fmt" "runtime" "time" "unsafe" "github.com/0xe2-0x9a-0x9b/Go-SDL/sdl" gl "github.com/chsc/gogl/gl33" "math" ) // DEG_TO_RAD 用于将角度转换为弧度 const DEG_TO_RAD = math.Pi / 180 // GoMatrix 和 GlMatrix 用于矩阵操作 type GoMatrix [16]float64 type GlMatrix [16]gl.Float // 统计帧数 var good_frames, bad_frames, sdl_events int // init 函数在包初始化时执行,用于将主Goroutine锁定到OS主线程 func init() { runtime.LockOSThread() } // mainfunc 是一个通道,用于在主OS线程上排队执行函数 var mainfunc = make(chan func()) // Main 函数是主OS线程的事件循环,它会一直运行,直到mainfunc通道关闭 func Main() { for f := range mainfunc { // 注意这里是 f := range mainfunc f() } } // do 是一个辅助函数,用于将一个函数提交到主OS线程队列并等待其完成 func do(f func()) { done := make(chan bool, 1) // 使用带缓冲的通道,避免死锁 mainfunc <- func() { f() done <- true // 执行完毕后发送信号 } <-done // 等待函数在主线程执行完毕 } // main 是程序的入口点 func main() { go Everything() // 启动应用程序的逻辑在一个新的Goroutine中 Main() // 主Goroutine进入主线程循环,处理所有排队的任务 } // Everything 包含应用程序的所有核心逻辑,它在单独的Goroutine中运行 func Everything() { defer close(mainfunc) // 当Everything Goroutine退出时,关闭mainfunc通道,从而停止Main循环 // 所有的SDL和OpenGL初始化操作都必须通过do函数在主线程中执行 do(func() { if status := sdl.Init(sdl.INIT_VIDEO); status != 0 { panic("Could not initialize SDL: " + sdl.GetError()) } sdl.GL_SetAttribute(sdl.GL_DOUBLEBUFFER, 1) const FLAGS = sdl.OPENGL if screen := sdl.SetVideoMode(640, 480, 32, FLAGS); screen == nil { panic("Could not open SDL window: " + sdl.GetError()) } if err := gl.Init(); err != nil { panic(err) } gl.Viewport(0, 0, 640, 480) gl.ClearColor(.5, .5, .5, 1) // 编译和链接着色器 vertex_code := gl.GLString(` #version 330 core in vec3 vpos; uniform mat4 MVP; void main() { gl_Position = MVP * vec4(vpos, 1); } `) fragment_code := gl.GLString(` #version 330 core void main(){ gl_FragColor = vec4(1,0,0,1); } `) vs := gl.CreateShader(gl.VERTEX_SHADER) fs := gl.CreateShader(gl.FRAGMENT_SHADER) gl.ShaderSource(vs, 1, &vertex_code, nil) gl.ShaderSource(fs, 1, &fragment_code, nil) gl.CompileShader(vs) gl.CompileShader(fs) prog := gl.CreateProgram() gl.AttachShader(prog, vs) gl.AttachShader(prog, fs) gl.LinkProgram(prog) var link_status gl.Int gl.GetProgramiv(prog, gl.LINK_STATUS, &link_status) if link_status == gl.FALSE { var info_log_length gl.Int gl.GetProgramiv(prog, gl.INFO_LOG_LENGTH, &info_log_length) if info_log_length == 0 { panic("Program linking failed but OpenGL has no log about it.") } else { info_log_gl := gl.GLStringAlloc(gl.Sizei(info_log_length)) defer gl.GLStringFree(info_log_gl) gl.GetProgramInfoLog(prog, gl.Sizei(info_log_length), nil, info_log_gl) info_log := gl.GoString(info_log_gl) panic(info_log) } } gl.UseProgram(prog) attrib_vpos := gl.Uint(gl.GetAttribLocation(prog, gl.GLString("vpos"))) // 创建三角形数据 positions := [...]gl.Float{-.5, -.5, 0, .5, -.5, 0, 0, .5, 0} var vao gl.Uint gl.GenVertexArrays(1, &vao) gl.BindVertexArray(vao) var vbo gl.Uint gl.GenBuffers(1, &vbo) gl.BindBuffer(gl.ARRAY_BUFFER, vbo) gl.BufferData(gl.ARRAY_BUFFER, gl.Sizeiptr(unsafe.Sizeof(positions)), gl.Pointer(&positions[0]), gl.STATIC_DRAW) gl.EnableVertexAttribArray(attrib_vpos) gl.VertexAttribPointer(attrib_vpos, 3, gl.FLOAT, gl.FALSE, 0, gl.Pointer(nil)) // 将prog作为参数传递给Loop函数 Loop(prog) }) // SDL退出也需要在主线程中执行 do(func() { sdl.Quit() }) fmt.Println("Good frames", good_frames) fmt.Println("Bad frames ", bad_frames) fmt.Println("SDL events ", sdl_events) } // Loop 函数现在在Everything Goroutine中运行,但其内部的OpenGL/SDL调用必须通过do函数 func Loop(program gl.Uint) { start_time := time.Now() ticker := time.NewTicker(100 * time.Millisecond) defer ticker.Stop() running := true for running { select { case tick_time := <-ticker.C: // 渲染操作通过do函数提交到主线程 do(func() { OnTick(start_time, tick_time, program) }) case event := <-sdl.Events: // SDL事件处理也通过do函数提交到主线程 var shouldContinue bool do(func() { shouldContinue = OnSdlEvent(event) }) running = shouldContinue } } } func OnSdlEvent(event interface{}) bool { sdl_events++ switch event.(type) { case sdl.QuitEvent: return false // Stop the main loop. } return true // Do not stop the main loop. } func OnTick(start_time, tick_time time.Time, program gl.Uint) { duration := tick_time.Sub(start_time).Seconds() speed := 10. angle := math.Mod(duration*speed, 360) gom := RotZ(angle) MVP := ToGlMatrix(gom) // 所有OpenGL调用都在do函数内部执行,确保在主线程 matrix_loc := gl.GetUniformLocation(program, gl.GLString("MVP")) dummy_matrix_loc := gl.GetUniformLocation(program, gl.GLString("dummy")) if gl.GetError() != gl.NO_ERROR { fmt.Println("Error get location") } if dummy_matrix_loc == -1 { good_frames++ } else { bad_frames++ } gl.UniformMatrix4fv(matrix_loc, 16, gl.TRUE, &MVP[0]) if gl.GetError() != gl.NO_ERROR { fmt.Println("Error send matrix") } gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) if gl.GetError() != gl.NO_ERROR { fmt.Println("Error clearing") } gl.DrawArrays(gl.TRIANGLES, 0, 3) if gl.GetError() != gl.NO_ERROR { fmt.Println("Error drawing") } gl.Finish() sdl.GL_SwapBuffers() } func RotZ(angle float64) GoMatrix { var gom GoMatrix a := angle * DEG_TO_RAD c := math.Cos(a) s := math.Sin(a) gom[0] = c gom[1] = s gom[4] = -s gom[5] = c gom[10] = 1 gom[15] = 1 return gom } func ToGlMatrix(gom GoMatrix) GlMatrix { var glm GlMatrix glm[0] = gl.Float(gom[0]) glm[1] = gl.Float(gom[1]) glm[2] = gl.Float(gom[2]) glm[3] = gl.Float(gom[3]) glm[4] = gl.Float(gom[4]) glm[5] = gl.Float(gom[5]) glm[6] = gl.Float(gom[6]) glm[7] = gl.Float(gom[7]) glm[8] = gl.Float(gom[8]) glm[9] = gl.Float(gom[9]) glm[10] = gl.Float(gom[10]) glm[11] = gl.Float(gom[11]) glm[12] = gl.Float(gom[12]) glm[13] = gl.Float(gom[13]) glm[14] = gl.Float(gom[14]) glm[15] = gl.Float(gom[15]) return glm }4. 注意事项与最佳实践 runtime.LockOSThread()的使用时机:它应该在程序启动时尽早调用,通常在init()函数中,以确保主Goroutine从一开始就绑定到主OS线程。
通过将字符串从其当前编码(如果已知)或简单地尝试将其转换为UTF-8,我们可以有效地“清洗”字符串。
通过自定义 WP_Query 查询,您可以轻松地在父页面中展示与其相关的子文章列表,并提供子文章的标题和链接。
需在类内声明、类外初始化变量;方法不访问非静态成员,可直接通过类名调用。
通常适用于: - 函数体较小(如只有一两行代码) - 被频繁调用的函数 - 对性能要求较高的场景 inline函数的作用与优势 主要目的就是,尤其是在频繁调用的小函数中效果明显: 立即学习“C++免费学习笔记(深入)”; 减少函数调用开销:省去参数压栈、控制转移、返回值传递等步骤 有助于编译器进行更深层次的优化,比如常量传播、死代码消除 相比宏函数更安全:具有类型检查、作用域控制,避免副作用 例如,对比宏定义: 即构数智人 即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。
如果$wheres为空(即用户未输入任何搜索条件),则查询所有记录。
std::shared_ptr:共享所有权,引用计数为零时释放。
可以使用mb_convert_encoding函数进行编码转换。
服务器在处理请求时会比对这两个值,只有匹配才允许继续执行。
由于这些环境封装了安装和管理流程,直接升级Nginx需谨慎操作,避免影响网站运行。

本文链接:http://www.theyalibrarian.com/924328_64881b.html