给自己的软件添加参数配置文件*.ini

  ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值。

这里的配置文件叫automoto.ini

1.函数说明

从自己的配置文件automoto.ini中读取字符串,需要调用GetPrivateProfileString()函数,在Unicode模式下该函数定义如下:

GetPrivateProfileStringW(
    __in_opt LPCWSTR lpAppName,
    __in_opt LPCWSTR lpKeyName,
    __in_opt LPCWSTR lpDefault,
    __out_ecount_part_opt(nSize, return + 1) LPWSTR lpReturnedString,
    __in     DWORD nSize,
    __in_opt LPCWSTR lpFileName
    );
lpAppName: section(节)的名字,是一个以0结束的字符串
lpKeyName:key键的名字,是一个以0结束的字符串
lpDefault:若指定的键不存在,该值作为读取的默认值
lpReturnedString:一个指向缓冲区的指针,接收读取的字符串
nSize:指定lpReturnedString指向的缓冲区的大小
lpFileName:读取信息的文件名。若该ini文件与程序在同一个目录下,也可使用相对路径,否则需要给出绝度路径

从自己的配置文件automoto.ini读取整数,调用GetPrivateProfileInt()函数,Unicode模式下该函数定义为:

GetPrivateProfileIntW(
    __in     LPCWSTR lpAppName,
    __in     LPCWSTR lpKeyName,
    __in     INT nDefault,
    __in_opt LPCWSTR lpFileName
    );

参数含义同上一个函数一样。

2.定义宏,减少代码工作量

// int参数声明
#define IntParamDeclare(name) \
private:\
	int m_i##name;\
public:\
	int Get##name() const;\
	void Set##name(int value);\

// int参数实现
#define IntParamImplement(classname, name) \
int classname##::Get##name() const \
{\
	return m_i##name;\
}\
void classname##::Set##name(int value)\
{\
	m_i##name = value;\
}

// int参数读取
#define LoadIntParam(group, name, v) \
	m_i##name = GetPrivateProfileInt(_T(#group), _T(#name), (v), szParamPath)


// double参数声明
#define DoubleParamDeclare(name) \
private:\
	double m_db##name;\
public:\
	double Get##name() const;\
	void Set##name(double value);\

// Double参数实现
#define DoubleParamImplement(classname, name) \
double classname##::Get##name() const \
{\
	return m_db##name;\
}\
void classname##::Set##name(double value)\
{\
	m_db##name = value;\
}

// Double参数读取
#define LoadDoubleParam(group, name, v, buf, len) \
	GetPrivateProfileString(_T(#group), _T(#name), _T(#v), buf, (len), szParamPath);\
	m_db##name = _tstof(buf)

// string参数声明
#define StringParamDeclare(name) \
private:\
	std::wstring m_str##name;\
public:\
	std::wstring Get##name() const;\
	void Set##name(std::wstring value);\

// string参数实现
#define StringParamImplement(classname, name) \
std::wstring classname##::Get##name() const \
{\
	return m_str##name;\
}\
void classname##::Set##name(std::wstring value)\
{\
	m_str##name = value;\
}

有了宏之后,添加配置变了就会变得很简单

int型变量:

//头文件中
IntParamDeclare(AnteriorOP)
//加载参数时调用
LoadIntParam(Param, AnteriorOP, 200);
//实现变量获取和设置
IntParamImplement(CAutoMotoParam, AnteriorOP)

double型变量:

//头文件中
DoubleParamDeclare(RefractionThreshold)
//加载参数时调用
LoadDoubleParam(Param, RefractionThreshold, 7.0, sz, len);
//实现变量获取和设置
DoubleParamImplement(CAutoMotoParam, RefractionThreshold)

3.无法读取automoto.ini文件中值解决

如果automoto.ini文件保存不是ANSI编码,就不能读取文件中的值,每次只能获取到加载时的默认值。

即使automoto.ini文件中变量的值已经改变,依旧也是默认值。

ANSI编码可以用,但最好使用unicode编码,因为中文很容易导致错误。

4.automoto实现案例

automoto.ini文件:

[param]
;电机初始速度
initialZSpeed = 99
;Z电机复位的位置pos
RESET_Z = 100000
;OP电机复位的位置pos
RESET_OP = 52530
;X电机复位到左眼
RESET_X_LEFT = 1256
;X电机复位到右眼
RESET_X_RIGHT = 47000
;Y电机复位到默认位置
RESET_Y = 32600

读取auto.ini文件

*.h

#pragma once
class CAutoMotoParam
{
public:
	CAutoMotoParam(void);
	~CAutoMotoParam(void);

private:		
	static CAutoMotoParam *Instance;
	//Z电机初始速度,默认值99
	int m_initialZSpeed;
	//Z电机复位的位置pos
	int m_reset_z;
	//Y电机复位到默认位置
	int m_reset_y;
	//X电机复位到左眼
	int m_reset_xleft;
	//光程电机复位的位置pos
	int m_reset_op;
	//X电机复位到右眼
	int m_reset_xright;

private:
	void LoadAutoMotoParam();
public:	
	static CAutoMotoParam * GetInstance();
	
	int GetInitialZSpeed();
	void SetInitialZSpeed(int zspeed);
	int GetResetZ();
	void SetResetZ(int zpos);
    int GetResetY();
    void SetResetY(int ypos);
 
    IntParamDeclare(STOP_BIGDUIJIAO)
};

*.cpp

#include "StdAfx.h"
#include "AutoMotoParam.h"
#include "../../UtilityObject.h"


CAutoMotoParam * CAutoMotoParam::Instance = NULL;

CAutoMotoParam::CAutoMotoParam(void)
{
	LoadAutoMotoParam();
}


CAutoMotoParam::~CAutoMotoParam(void)
{
	if(Instance != NULL)
	{
		delete Instance;
		Instance = NULL;
	}
}

CAutoMotoParam * CAutoMotoParam::GetInstance()
{
	if (Instance == NULL)
	{
		Instance = new CAutoMotoParam();
	}
	return Instance;
}

void CAutoMotoParam::LoadAutoMotoParam()
{
	CString szParamPath;
	szParamPath = CUtilityObject::GetInstance()->Directory.GetCurrentPath();
	szParamPath += _T("automoto.ini");

	TCHAR sz[512] = { 0 };
	int len = 512;
	
	//Z电机初始速度
	m_initialZSpeed = GetPrivateProfileInt(_T("Param"), _T("initialZSpeed"), 99, szParamPath);
	//Z电机复位的位置pos
	m_reset_z = GetPrivateProfileInt(_T("Param"), _T("RESET_Z"), 100000, szParamPath);
	//Y电机复位到默认位置
	m_reset_y= GetPrivateProfileInt(_T("Param"), _T("RESET_Y"), 32600, szParamPath);
	
   
   LoadIntParam(Param, STOP_BIGDUIJIAO, 50000);

}

int CAutoMotoParam::GetInitialZSpeed()
{
	return m_initialZSpeed;
}

void CAutoMotoParam::SetInitialZSpeed(int zspeed)
{
	m_initialZSpeed=zspeed;
}

int CAutoMotoParam::GetResetZ()
{
	return m_reset_z;
}

void CAutoMotoParam::SetResetZ(int zpos)
{
	m_reset_z=zpos;
}

int CAutoMotoParam::GetResetY()
{
    return m_reset_y;
}

void CAutoMotoParam::SetResetY(int ypos)
{
	m_reset_y=ypos;
}

IntParamImplement(CAutoMotoParam, STOP_BIGDUIJIAO)

 

对于 Veins 中的信道选择算法,你需要在 omnetpp.ini 文件中手动添加相应的配置参数来设置。具体来说,你需要添加以下参数: ``` *.**.nic.phy80211p.radioMedium.defaultChannelNumber = 178 *.**.nic.phy80211p.radioMedium.numChannels = 3 *.**.nic.phy80211p.radioMedium.channelWidth = 10MHz *.**.nic.phy80211p.radioMedium.transmitterPower = 20mW *.**.nic.phy80211p.radioMedium.carrierFrequency = 5.890e+9Hz *.**.nic.phy80211p.radioMedium.alpha = 2.0 *.**.nic.phy80211p.radioMedium.carrierFrequency2 = 5.895e+9Hz *.**.nic.phy80211p.radioMedium.alpha2 = 2.0 *.**.nic.phy80211p.radioMedium.thresholddBm = -82 *.**.nic.phy80211p.radioMedium.pathLossMap = xmldoc("pathloss.xml") *.**.nic.phy80211p.radioMedium.shadowingMap = xmldoc("shadowing.xml") *.**.nic.phy80211p.radioMedium.obstacleLossMap = xmldoc("obstacleLoss.xml") *.**.nic.mac1609_4.useServiceChannel = true *.**.mac1609_4.serviceChannel = 172 *.**.mac1609_4.useBeaconFrequency = true *.**.mac1609_4.beaconFrequency = 10 ``` 其中,`*.**.nic.phy80211p.radioMedium.defaultChannelNumber` 设置默认的信道号,`*.**.nic.phy80211p.radioMedium.numChannels` 设置信道总数, `*.**.nic.phy80211p.radioMedium.channelWidth` 设置信道带宽, `*.**.nic.mac1609_4.useServiceChannel` 和 `*.**.mac1609_4.serviceChannel` 用于设置使用的服务信道和频率, `*.**.mac1609_4.useBeaconFrequency` 和 `*.**.mac1609_4.beaconFrequency` 用于设置使用的信标频率。 除此之外,你还可以在 omnetpp.ini 文件添加其他的配置参数来设置不同的信道选择算法,如自适应功率控制(APC)和自适应调制和编码(AMC)等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haimianjie2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值