C++初始编程及相关的问题总结

这篇文章是根据之前完成的“数字信号处理器”这门课的作业

运行环境及建工程步骤

  • 创建工程项目:

    Visual Studio(VS)后,点击菜单栏第一个键,文件 -> 新建-> 项目-> 设置项目名称以及存储位置-> 选择Win32控制台应用程序-> 勾选“为解决方案创建目录”-> 下一步-> 下一步-> 勾选“空项目”-> 完成

  • 更新VS2010,或者卸载VS2012安装2010后,建立Win32 Console Project/MFC项目时会出现”LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”的错误。
    解决方案:

    (1):将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单”改为“”。若还不能解决问题进入第二步。

    (2):查看计算机是否为64bit操作系统,如是,继续如下操作。
    查找是否有两个cvtres.exe。
    C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
    右键属性详细信息, 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。
    治本的办法是第二步,删除旧版本的cvtres.exe后,就不需要每次都设置配置了。

  • #include<***.h>#include"***.h"的区别

    • #include<***.h>,用于系统头文件,直接从编译器自带的函数库中寻找文件。在#include指令里,系统头文件的文件名要放在尖括号里给出,这是告诉编译器:应该到“标准的”地点寻找这个文件:#include <stdio.h>
    • #include"***.h",用于自定义头文件,是先从自定义的文件中找,如果找不到在从函数库中寻找文件。

      头文件是一些以.h作为扩展名的标准文本文件。一般情况下,都应该把自定义的头文件和其余的程序文件放在同一个子目录里,或者在主程序目录下专门创建一个子文件夹来集中存放它们。参考:C++中“头文件”的定义和使用

  • 自定义头文件

    1
    2
    3
    4
    \#ifndef CIRCLE_H
    \#define CIRCLE_H
    //你的代码写在这里
    \#endif

    CIRCLE_H这个名字实际上是无所谓的,命名为什么都行,只要符合规范都行。原则上来说,建议把它写成这种形式,因为比较容易和头文件的名字对应。

    源文件(.cpp):主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。工程中只能有一个main()函数,是应用程序的入口

    虽说头文件可以用来保存任意代码片段,但典型的做法是只用它们来保存函数声明、用户自定义类型数据(结构和类)、模板和全局性的常量。

    如果你有一个程序需要多次调用一个或一组函数,或是你有一个或一组函数需要在多个程序里调用,就应该把它们的声明拿出来放到一个头文件里。

    头文件应该只包含最必要的代码,比如只声明一个类或只包含一组彼此相关的函数。把接口(函数的原型)和实现(函数体的定义)分开是对代码进行模块化的基本原则之一。

C++编程中遇到的一些问题

  • menset():char型初始化函数

    • 所在头文件<string.h><memory.h>,有人通过测试,发现使用memset似乎不需要使用额外的头文件。。
    • 函数原型:void *memset(void *s , int ch , size_t n )
    • 函数解释:将s中的前n个字节用ch替换并且返回s。
    • 函数作用:在一段内存块中填充某一个给定的值,常用于较大的对结构体和数组的清零操作。

      参考:C++中memset函数的用法一般用于清零。

  • 在<float.h>中定义了浮点类型的范围:

    1
    2
    #define DBL_MAX 1.7976931348623158e+308 /* max value */
    #define DBL_MIN 2.2250738585072014e-308 /* min positive value */
  • 给C++的一维数组赋初值,只有在定义的时候可以整体初始化,
    错误的赋值方法:

    1
    2
    3
    int *temp = new int[2];
    temp[0] = arr1[0];
    temp[1] = arr1[2];

    应该为:

    1
    2
    3
    int temp[2];
    temp[0] = arr1[0];
    temp[1] = arr1[2];

对于new创建的数组,之间使用创建时的大小。new数组只能用无参的构造函数或者所有参数都有默认值的构造函数。

  • 函数调用的三种参数传递方式

    • (1)传值调用:实参被拷贝了一份,然后在函数体内使用,函数体内修改参数变量时修改的只是实参的一份拷贝,而实参本身没有改变,所以如果想要在调用的函数中修改实参的值,使用值传递不能达到其目的,这时只能使用引用或者指针传递。

    • (2)传址调用(即是传指针):传递的是一个地址值,如果改变被调函数中的指针地址,它将应用不到主调函数的相关变量。指针可以改变其指向的对象(指针变量中的值可以改)。

    • (3)传引用:任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量,引用对象不能修改。。

      • C++中引用传递与指针传递的区别
      • C语言中memset函数详解
  • 指针的使用:如果使用下面的方法对一个数组做初始化,double** q = Pxy;,此处直接使用Pxy构建一个二维数组,但是在此之后的语句,对数组q操作,Pxy的值也会相应地改变。

  • 计算静态数组的长度函数

    1
    2
    3
    4
    5
    6
    7
    8
    template<typename T>
    int count(T& x)
    {
    int s1 = sizeof(x);
    int s2 = sizeof(x[0]);
    int result = s1 / s2;
    return result;
    }

对于动态数组,上面的函数不能得到二维数组的长度,sizeof(动态数组)结果是单个元素的大小,相当远sizeof(x[0])

  • 随机数的产生
    (1) c语言中rand()函数的用法笔记:http://blog.csdn.net/chikey/article/details/66970397
    (2)C++中rand()函数的用法,可根据这个来产生随机数

    (3)示例,使用下面的语句,产生的是一个0-1的随机数,且精度为1/32767,rand() / (double)RAND_MAX;

  • C++动态内存分配:

    delete[] mi;// 由于mi是静态存储分配,不需要手动释放内存,如果加这两句可能会陷入程序不运行的状态。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 使用new构建并初始化二维数组
    float** create_array(int row, int col){
    float** p = new float*[row];
    for (int i = 0; i < row; ++i) {
    p[i] = new float[col];
    for (int j = 0; j < col; ++j) {
    p[i][j] = 0;
    }
    }
    return p;
    }
    // 初始化二维数组
    template<typename T>
    void init_array(T&& arr, int row, int col){
    for (int i = 0; i < row; ++i) {
    for (int j = 0; j < col; ++j) {
    arr[i][j] = 0;
    }
    }
    }

参考:(1)C++ 动态内存分配(6种情况,好几个例子)(2)C++ 内存分配秘籍—new,malloc,GlobalAlloc详解(分析详细易懂)

  • 调试
    (1)数据类型与输入或输出的类型不匹配
    fscanf_s(fp, "%lf,", &temp); //此处temp定义的是float类型,但是输入确实double型
    报错如下:
    Run-Time Check Failure #2 - Stack around the variable 'temp' was corrupted.

  • 将变量加入到字符数组中:

    1
    sprintf_s(t, "result/FJ_%d_%d_%d_%d.txt", FEATURE_NUM, FEATURE_SUB_NUM,1,5);
  • 输入字符串,转化为数组,并统计字符个数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include<iostream>
    #include<string>
    using namespace std;
    int main() {
    // 输入数据
    string s1;
    char temp;
    while((temp=cin.get())!='\n') {
    s1 +=temp;
    }
    const int LEN =s1.length();
    char* s = new char[LEN];//根据输入字符串的长度,创建字符数组
    for(int i = 0;i<LEN;i++){ //将字符串保存到字符数组中
    s[i]=s1[i];
    }
    cout<<LEN<<endl;
    return 0;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程管理(重点)

进程管理&#xff08;重点&#xff09;

X86 CMOS

1、cmos简介。 cmos是主板上一块可读写的RAM芯片。用途&#xff1a;主要用来保存当前系统的硬件配置和操作人员对某些参数的设定。cmos芯片是由一块纽扣电池供电。因此在关机状态内部信息也不会丢失。 2、cmos所在的端口。 cmos芯片是挂在cpu的io空间上的.(x86体系是独立编址…

服务(service)管理

服务&#xff08;service&#xff09;管理 按q退出

SCSI、FC、iSCSI三大协议概述

一、SCSI SCSI是小型计算机系统接口&#xff08;Small Computer System Interface&#xff09;的简称&#xff0c;于1979首次提出&#xff0c;是为小型机研制的一种接口技术&#xff0c;现在已完全普及到了小型机&#xff0c;高低端服务器以及普通PC上。 SCSI可以划分为SCSI-…

空间谱专题11:子阵平滑与秩亏缺

作者&#xff1a;桂。 时间&#xff1a;2017-09-29 21:20:18 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7612984.html 前言 主要分析在解相干算法中&#xff0c;子阵平滑的有效性。 一、前向平滑 以均匀线阵&#xff08;ULA&#xff09;为例&#xff0c;第l个接收…

空间谱专题12:二维测向的基本方法

作者&#xff1a;桂。 时间&#xff1a;2017-10-01 16:50:08 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7617442.html 前言 圆阵、面阵、L阵、十字阵、V形阵&#xff0c;都是直接地二维求解&#xff0c;复杂度较高&#xff0c;这里梳理复杂度较低的求解算法。 一…

使用有限状态机(FSM)解释shell 命令

一、有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型&#xff0c;在计算机领域有着广泛的应用。FSM一个常见的应用就是用来负责Parser复杂的数据结构&#xff0c;比如解释URI协议&#x…

从今天起,逃离迷茫与枯燥,做一个与快乐常伴的人

-0-又是一个下雨天&#xff0c;郑州连着下了一个星期的雨了。国庆长假&#xff0c;街道上褪去了往日的繁华&#xff0c;空荡荡的&#xff0c;连几家最爱吃的商铺也关门回家团圆了。今天中秋节&#xff0c;你在哪里&#xff1f;又在做着什么呢&#xff1f;-1-一个人猫在家里&…

搭建JAVAEE环境

搭建JAVAEE环境 ./表示在当前目录下查找文件所以需要配置环境变量 在Linux下下载 或者在window下传输

小数延迟滤波器

作者&#xff1a;桂。 时间&#xff1a;2017-10-10 22:38:46 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7648274.html 前言 阵列信号处理中&#xff0c;经常用到小数延迟&#xff08;fractional delay&#xff0c;FD&#xff09;的思路&#xff0c;例如Beamformi…

387. First Unique Character in a String QuestionEditorial Solution

Given a string, find the first non-repeating character in it and return it’s index. If it doesn’t exist, return -1. Examples: s “leetcode” return 0. s “loveleetcode”, return 2. Note: You may assume the string contain only lowercase letters. …

AD提高动态的方法(附SNR计算)

作者&#xff1a;桂。 时间&#xff1a;2017-10-10 23:36:40 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7648475.html 前言 主要分析AD的基本特性&#xff0c;以及动态的计算方法。并总结量化位数确定的前提下&#xff0c;提高信号精度的一般性方法。 未完待续..…

空间谱专题13:联合解算DOA(ML/AP)

其中作者&#xff1a;桂。 时间&#xff1a;2017-10-16 07:51:40 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7675380.html 前言 主要记录二维测向中&#xff0c;分别利用两个一维阵联合解算的思路。 一、AP算法思想 信号模型&#xff1a; 对应相关矩阵 假设噪声为…

现代C++函数式编程

链接 http://geek.csdn.net/news/detail/96636 概述 函数式编程是一种编程范式&#xff0c;它有下面的一些特征&#xff1a; 函数是一等公民&#xff0c;可以像数据一样传来传去。 高阶函数 递归 pipeline 惰性求值 柯里化 偏应用函数 C98/03中的函数对象&#xff0c…

机器学习之正则化

根据上一篇博客《统计学习概论》可以知道&#xff0c;正则化的作用是选择经验风险和模型复杂度同时较小的模型。下面从过拟合的角度来理解正则化。 #过拟合问题 例子说明&#xff0c;线性回归问题&#xff08;房价&#xff09; 分析&#xff1a; 1&#xff09;左边第一幅图&am…

python开发平台Ubuntu

python开发平台Ubuntu APT软件管理和远程登录

a.out、coff、elf三种文件格式

转自&#xff1a;http://blog.chinaunix.net/uid-11469366-id-1747286.html 补充&#xff1a;a.out早期并不是elf格式的&#xff0c;而是unix下另一种可执行格式&#xff0c;新的a.out是 本文讨论了 UNIX/LINUX 平台下三种主要的可执行文件格式&#xff1a;a.out&#xff08;…

投影矩阵

作者&#xff1a;桂。 时间&#xff1a;2017-10-19 06:02:00 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7690292.html 前言 最近在交替投影算法中&#xff0c;用到投影矩阵&#xff0c;简单记录。 一、投影矩阵定义 此处以列满秩为例&#xff0c;行满秩可依次类推…

不同维度极值点查找

作者&#xff1a;桂。 时间&#xff1a;2017-10-19 17:00:12 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7693557.html 前言 主要梳理不同维度信号极值点的查找思路。 一、思想 思想都是一个&#xff0c;通过极值点的定义&#xff1a;数值高于相邻的点&#xff0c…