莫名奇妙的“读取位置 0xccccccd4 时发生访问冲突”求大神指教

hujilin1229 2013-06-12 07:02:29
在网上下了一个开源库,结合了opencv,自己单步调试,已经知道了问题的所在代码行,可是实在无解,求大神帮助,现将问题描述如下:
	const string frontalface="D:\\study\\opencv\\data\\lbpcascades\\lbpcascade_frontalface.xml";
const string profileface="D:\\study\\opencv\\data\\haarcascades\\haarcascade_profileface.xml";
const string lefteye="D:\\study\\opencv\\data\\haarcascades\\haarcascade_mcs_lefteye.xml";
const string righteye="D:\\study\\opencv\\data\\haarcascades\\haarcascade_mcs_righteye.xml";
const string nose="D:\\study\\opencv\\data\\haarcascades\\haarcascade_mcs_nose.xml";
const string mouth="D:\\study\\opencv\\data\\haarcascades\\haarcascade_mcs_mouth.xml";
cv::CascadeClassifier facedetect;
facedetect.load(frontalface);

fd.SetConfiguration(frontalface, profileface,lefteye,righteye,nose,mouth,VO_AdditiveStrongerClassifier::BOOSTING,CFaceDetectionAlgs::FRONTAL );

其中SetConfiguration已经做成了lib文件,单步调试之后进入源码:
void CFaceDetectionAlgs::SetConfiguration(  const string& strfrontalface, 
const string& strprofileface,
const string& strlefteye,
const string& strrighteye,
const string& strnose,
const string& strmouth,
unsigned int mtd,
unsigned int facetype)
{
switch(this->m_iDetectionMethod)
{
case VO_AdditiveStrongerClassifier::BOOSTING:
default:
{
if(strfrontalface!="")
{
//this->m_sFile2BLoadFrontalFace = strfrontalface;
this->m_cascadeClassifierFrontalFace.load( strfrontalface);
}
}
}

主要进入上面if语句中的load函数,这个是opencv的CascadeClassifier,即导入xml文件,可是在调试程序的时候就是断了。
在这个load之前,注释了的那句:
                //this->m_sFile2BLoadFrontalFace  = strfrontalface;

是我注释掉了,要不然程序在这句断了,出现的错误提示是rep movsd;N - move all of our dwords
这句就更加不能理解了,不就是简单的赋值吗?怎么还会出现这种错误呢?
自己实在搞不定了,还请求版上的各位大神帮忙,谢谢!
...全文
299 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2013-06-13
  • 打赏
  • 举报
回复
引用 6 楼 hujilin1229 的回复:
为了能更好的描述问题,决定将这个代码全部贴出来,各位大神看看! 这个类的头文件为:
#ifndef __VO_FACEDETECTIONALGS_H__
#define __VO_FACEDETECTIONALGS_H__

#include <string>
#include "opencv2/opencv.hpp"
#include "VO_CVCommon.h"
#include "VO_FaceCompPos.h"
#include "VO_DetectionAlgs.h"

using namespace std;
using namespace cv;


/** 
* @author  JIA Pei
* @brief   Face detection algorithms.
*/
class CFaceDetectionAlgs : public CDetectionAlgs
{
private:
    /** Original detected face rectangle */
    vector<Rect>        m_vDetectedFaceRects;

    /** Detected face type:
        0 - no face detected; 1 - frontal; 2 - left; 3 - right */
    unsigned int        m_iFaceType;

    /** Whether .... is detected */
    bool                m_bFaceDetected;
    bool                m_bLeftEyeDetected;
    bool                m_bRightEyeDetected;
    bool                m_bNoseDetected;
    bool                m_bMouthDetected;

    /** Possible windows for further face parts detection */
    Rect                m_CVLeftEyePossibleWindow;
    Rect                m_CVRightEyePossibleWindow;
    Rect                m_CVNosePossibleWindow;
    Rect                m_CVMouthPossibleWindow;
    Rect                m_CVNoseCentralArea;

    /** Detected windows for respective face parts */
     // haven't translated back to the whole image yet
    VO_FaceCompPos      m_VOFaceComponents0;
    VO_FaceCompPos      m_VOFaceComponents;
    Rect                m_CVDetectedFaceWindow2SM;
    Mat                 m_CVDetectedFaceImagePatch2SM;

    /** Detected Key Points */
    Point2f             m_CVDetectedCenterOfGravity;
    Point2f             m_CVDetectedLeftEyeLeftCorner;
    Point2f             m_CVDetectedLeftEyeRightCorner;
    Point2f             m_CVDetectedLeftEyeCenter;
    Point2f             m_CVDetectedRightEyeLeftCorner;
    Point2f             m_CVDetectedRightEyeRightCorner;
    Point2f             m_CVDetectedRightEyeCenter;
    Point2f             m_CVDetectedNoseTip;
    Point2f             m_CVDetectedNostrilLeft;
    Point2f             m_CVDetectedNostrilRight;
    Point2f             m_CVDetectedNoseCenter;
    Point2f             m_CVDetectedMouthLeftCorner;
    Point2f             m_CVDetectedMouthRightCorner;
    Point2f             m_CVDetectedMouthCenter;

    string              m_sFile2BLoadFrontalFace;
    string              m_sFile2BLoadProfileFace;
    string              m_sFile2BLoadLeftEye;
    string              m_sFile2BLoadRightEye;
    string              m_sFile2BLoadNose;
    string              m_sFile2BLoadMouth;
    string              m_sFile2BLoadMouthBeard;

    CascadeClassifier   m_cascadeClassifierFrontalFace;
    CascadeClassifier   m_cascadeClassifierProfileFace;
    CascadeClassifier   m_cascadeClassifierEyes;
    CascadeClassifier   m_cascadeClassifierLeftEye;
    CascadeClassifier   m_cascadeClassifierRightEye;
    CascadeClassifier   m_cascadeClassifierNose;
    CascadeClassifier   m_cascadeClassifierMouth;
    CascadeClassifier   m_cascadeClassifierMouthBeard;
	CascadeClassifier   m_cascadeClassifier;
    RTreeClassifier     m_rtreeClassifierFrontalFace;
    RTreeClassifier     m_rtreeClassifierProfileFace;
    RTreeClassifier     m_rtreeClassifierEyes;
    RTreeClassifier     m_rtreeClassifierLeftEye;
    RTreeClassifier     m_rtreeClassifierRightEye;
    RTreeClassifier     m_rtreeClassifierNose;
    RTreeClassifier     m_rtreeClassifierMouth;
    RTreeClassifier     m_rtreeClassifierMouthBeard;

    /** Initialization */
    void                init(const string& str, unsigned int mtd)
    {
        CDetectionAlgs::init(str, mtd);

        this->m_vDetectedFaceRects.clear();
        this->m_iFaceType               = UNDETECTED;
        this->m_bFaceDetected           = false;
        this->m_bLeftEyeDetected        = false;
        this->m_bRightEyeDetected       = false;
        this->m_bNoseDetected           = false;
        this->m_bMouthDetected          = false;
    }

public:
	CascadeClassifier m_cascadeClassifierpublic;
    /** frontal face, left profile face, right profile face, etc. */
    enum {
        FRONTAL = 0,
        LEFTPROFILE = 1,
        RIGHTPROFILE = 2,
        UPPROFILE = 3,
        DOWNPROFILE = 4,
        ALL = 9
    };

    /** face directions */
    enum {
        UNDETECTED = -1,
        DIR_DOWNFRONTAL = 0,
        DIR_DOWNLEFT = 1,
        DIR_DOWNRIGHT = 2,
        DIR_UPFRONTAL = 3,
        DIR_UPLEFT = 4,
        DIR_UPRIGHT = 5,
        DIR_FRONTAL = 6,
        DIR_LEFT = 7,
        DIR_RIGHT = 8
    };

    /** Constructor */
    CFaceDetectionAlgs( const string& str="",
                        unsigned int mtd=
                        VO_AdditiveStrongerClassifier::BOOSTING)
    {
        this->init(str, mtd);
    }

    /** Destructor */
    ~CFaceDetectionAlgs() {}

    /** set detection configurations */
    void        SetConfiguration(   const string& strfrontalface="", 
                                    const string& strprofileface="",
                                    const string& strlefteye="",
                                    const string& strrighteye="",
                                    const string& strnose="",
                                    const string& strmouth="",
                                    unsigned int mtd =
                                    VO_AdditiveStrongerClassifier::BOOSTING,
                                    unsigned int facetype = FRONTAL);
};

#endif    // __VO_FACEDETECTIONALGS_H__
CPP文件为:

#include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "VO_FacePart.h"
#include "VO_FaceKeyPoint.h"
#include "VO_FaceDetectionAlgs.h"

void CFaceDetectionAlgs::SetConfiguration(  const string& strfrontalface, 
                                            const string& strprofileface, 
                                            const string& strlefteye,
                                            const string& strrighteye,
                                            const string& strnose,
                                            const string& strmouth,
                                            unsigned int mtd,
                                            unsigned int facetype)
{
    this->m_iDetectionMethod    = mtd;
    this->m_iFaceType           = facetype;
    switch(this->m_iDetectionMethod)
    {

    case VO_AdditiveStrongerClassifier::BAGGING:
        {
            if(strfrontalface!="")
            {
                //this->m_sFile2BLoadFrontalFace  = strfrontalface;
                //this->m_rtreeClassifierProfileFace.read( this->m_sFile2BLoadFrontalFace.c_str() );
				this->m_rtreeClassifierProfileFace.read( strfrontalface.c_str() );

            }
            if(strprofileface!="")
            {
                this->m_sFile2BLoadProfileFace  = strprofileface;
                this->m_rtreeClassifierProfileFace.read( this->m_sFile2BLoadProfileFace.c_str() );
            }
            if(strlefteye!="")
            {
                this->m_sFile2BLoadLeftEye      = strlefteye;
                this->m_rtreeClassifierLeftEye.read( this->m_sFile2BLoadLeftEye.c_str() );
            }
            if(strrighteye!="")
            {
                this->m_sFile2BLoadRightEye     = strrighteye;
                this->m_rtreeClassifierRightEye.read( this->m_sFile2BLoadRightEye.c_str() );
            }
            if(strnose!="")
            {
                this->m_sFile2BLoadNose         = strnose;
                this->m_rtreeClassifierNose.read( this->m_sFile2BLoadNose.c_str() );
            }
            if(strmouth!="")
            {
                this->m_sFile2BLoadMouth        = strmouth;
                this->m_rtreeClassifierMouth.read( this->m_sFile2BLoadMouth.c_str() );
            }
        }
        break;
    case VO_AdditiveStrongerClassifier::BOOSTING:
    default:
        {
            if(strfrontalface!="")
            {
                //this->m_sFile2BLoadFrontalFace  = strfrontalface;
				cv::CascadeClassifier facedetect;
				facedetect.load(strfrontalface);
				//m_cascadeClassifierpublic.load(strfrontalface);
				m_cascadeClassifier.load(strfrontalface);
                m_cascadeClassifierFrontalFace.load( strfrontalface);
            }
            if(strprofileface!="")
            {
                //this->m_sFile2BLoadProfileFace  = strprofileface;
                //this->m_cascadeClassifierProfileFace.load( this->m_sFile2BLoadProfileFace );
				this->m_cascadeClassifierProfileFace.load( strprofileface );
            }
            if(strlefteye!="")
            {
                //this->m_sFile2BLoadLeftEye      = strlefteye;
                //this->m_cascadeClassifierLeftEye.load( this->m_sFile2BLoadLeftEye );
				this->m_cascadeClassifierLeftEye.load( strlefteye );
            }
            if(strrighteye!="")
            {
                //this->m_sFile2BLoadRightEye     = strrighteye;
                //this->m_cascadeClassifierRightEye.load( this->m_sFile2BLoadRightEye );
				this->m_cascadeClassifierRightEye.load( strrighteye );
            }
            if(strnose!="")
            {
                //this->m_sFile2BLoadNose         = strnose;
                //this->m_cascadeClassifierNose.load( this->m_sFile2BLoadNose );
				this->m_cascadeClassifierNose.load( strnose );
            }
            if(strmouth!="")
            {
                //this->m_sFile2BLoadMouth        = strmouth;
                //this->m_cascadeClassifierMouth.load( this->m_sFile2BLoadMouth );
				this->m_cascadeClassifierMouth.load( strmouth );
            }
        }
        break;
    }
}

按f11逐步进入调试吧,看看是哪个位置出问题,同时注意提头说那个地址是属于哪个变量的
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
hujilin1229 2013-06-12
  • 打赏
  • 举报
回复
为了能更好的描述问题,决定将这个代码全部贴出来,各位大神看看! 这个类的头文件为:
#ifndef __VO_FACEDETECTIONALGS_H__
#define __VO_FACEDETECTIONALGS_H__

#include <string>
#include "opencv2/opencv.hpp"
#include "VO_CVCommon.h"
#include "VO_FaceCompPos.h"
#include "VO_DetectionAlgs.h"

using namespace std;
using namespace cv;


/** 
* @author  JIA Pei
* @brief   Face detection algorithms.
*/
class CFaceDetectionAlgs : public CDetectionAlgs
{
private:
    /** Original detected face rectangle */
    vector<Rect>        m_vDetectedFaceRects;

    /** Detected face type:
        0 - no face detected; 1 - frontal; 2 - left; 3 - right */
    unsigned int        m_iFaceType;

    /** Whether .... is detected */
    bool                m_bFaceDetected;
    bool                m_bLeftEyeDetected;
    bool                m_bRightEyeDetected;
    bool                m_bNoseDetected;
    bool                m_bMouthDetected;

    /** Possible windows for further face parts detection */
    Rect                m_CVLeftEyePossibleWindow;
    Rect                m_CVRightEyePossibleWindow;
    Rect                m_CVNosePossibleWindow;
    Rect                m_CVMouthPossibleWindow;
    Rect                m_CVNoseCentralArea;

    /** Detected windows for respective face parts */
     // haven't translated back to the whole image yet
    VO_FaceCompPos      m_VOFaceComponents0;
    VO_FaceCompPos      m_VOFaceComponents;
    Rect                m_CVDetectedFaceWindow2SM;
    Mat                 m_CVDetectedFaceImagePatch2SM;

    /** Detected Key Points */
    Point2f             m_CVDetectedCenterOfGravity;
    Point2f             m_CVDetectedLeftEyeLeftCorner;
    Point2f             m_CVDetectedLeftEyeRightCorner;
    Point2f             m_CVDetectedLeftEyeCenter;
    Point2f             m_CVDetectedRightEyeLeftCorner;
    Point2f             m_CVDetectedRightEyeRightCorner;
    Point2f             m_CVDetectedRightEyeCenter;
    Point2f             m_CVDetectedNoseTip;
    Point2f             m_CVDetectedNostrilLeft;
    Point2f             m_CVDetectedNostrilRight;
    Point2f             m_CVDetectedNoseCenter;
    Point2f             m_CVDetectedMouthLeftCorner;
    Point2f             m_CVDetectedMouthRightCorner;
    Point2f             m_CVDetectedMouthCenter;

    string              m_sFile2BLoadFrontalFace;
    string              m_sFile2BLoadProfileFace;
    string              m_sFile2BLoadLeftEye;
    string              m_sFile2BLoadRightEye;
    string              m_sFile2BLoadNose;
    string              m_sFile2BLoadMouth;
    string              m_sFile2BLoadMouthBeard;

    CascadeClassifier   m_cascadeClassifierFrontalFace;
    CascadeClassifier   m_cascadeClassifierProfileFace;
    CascadeClassifier   m_cascadeClassifierEyes;
    CascadeClassifier   m_cascadeClassifierLeftEye;
    CascadeClassifier   m_cascadeClassifierRightEye;
    CascadeClassifier   m_cascadeClassifierNose;
    CascadeClassifier   m_cascadeClassifierMouth;
    CascadeClassifier   m_cascadeClassifierMouthBeard;
	CascadeClassifier   m_cascadeClassifier;
    RTreeClassifier     m_rtreeClassifierFrontalFace;
    RTreeClassifier     m_rtreeClassifierProfileFace;
    RTreeClassifier     m_rtreeClassifierEyes;
    RTreeClassifier     m_rtreeClassifierLeftEye;
    RTreeClassifier     m_rtreeClassifierRightEye;
    RTreeClassifier     m_rtreeClassifierNose;
    RTreeClassifier     m_rtreeClassifierMouth;
    RTreeClassifier     m_rtreeClassifierMouthBeard;

    /** Initialization */
    void                init(const string& str, unsigned int mtd)
    {
        CDetectionAlgs::init(str, mtd);

        this->m_vDetectedFaceRects.clear();
        this->m_iFaceType               = UNDETECTED;
        this->m_bFaceDetected           = false;
        this->m_bLeftEyeDetected        = false;
        this->m_bRightEyeDetected       = false;
        this->m_bNoseDetected           = false;
        this->m_bMouthDetected          = false;
    }

public:
	CascadeClassifier m_cascadeClassifierpublic;
    /** frontal face, left profile face, right profile face, etc. */
    enum {
        FRONTAL = 0,
        LEFTPROFILE = 1,
        RIGHTPROFILE = 2,
        UPPROFILE = 3,
        DOWNPROFILE = 4,
        ALL = 9
    };

    /** face directions */
    enum {
        UNDETECTED = -1,
        DIR_DOWNFRONTAL = 0,
        DIR_DOWNLEFT = 1,
        DIR_DOWNRIGHT = 2,
        DIR_UPFRONTAL = 3,
        DIR_UPLEFT = 4,
        DIR_UPRIGHT = 5,
        DIR_FRONTAL = 6,
        DIR_LEFT = 7,
        DIR_RIGHT = 8
    };

    /** Constructor */
    CFaceDetectionAlgs( const string& str="",
                        unsigned int mtd=
                        VO_AdditiveStrongerClassifier::BOOSTING)
    {
        this->init(str, mtd);
    }

    /** Destructor */
    ~CFaceDetectionAlgs() {}

    /** set detection configurations */
    void        SetConfiguration(   const string& strfrontalface="", 
                                    const string& strprofileface="",
                                    const string& strlefteye="",
                                    const string& strrighteye="",
                                    const string& strnose="",
                                    const string& strmouth="",
                                    unsigned int mtd =
                                    VO_AdditiveStrongerClassifier::BOOSTING,
                                    unsigned int facetype = FRONTAL);
};

#endif    // __VO_FACEDETECTIONALGS_H__
CPP文件为:

#include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "VO_FacePart.h"
#include "VO_FaceKeyPoint.h"
#include "VO_FaceDetectionAlgs.h"

void CFaceDetectionAlgs::SetConfiguration(  const string& strfrontalface, 
                                            const string& strprofileface, 
                                            const string& strlefteye,
                                            const string& strrighteye,
                                            const string& strnose,
                                            const string& strmouth,
                                            unsigned int mtd,
                                            unsigned int facetype)
{
    this->m_iDetectionMethod    = mtd;
    this->m_iFaceType           = facetype;
    switch(this->m_iDetectionMethod)
    {

    case VO_AdditiveStrongerClassifier::BAGGING:
        {
            if(strfrontalface!="")
            {
                //this->m_sFile2BLoadFrontalFace  = strfrontalface;
                //this->m_rtreeClassifierProfileFace.read( this->m_sFile2BLoadFrontalFace.c_str() );
				this->m_rtreeClassifierProfileFace.read( strfrontalface.c_str() );

            }
            if(strprofileface!="")
            {
                this->m_sFile2BLoadProfileFace  = strprofileface;
                this->m_rtreeClassifierProfileFace.read( this->m_sFile2BLoadProfileFace.c_str() );
            }
            if(strlefteye!="")
            {
                this->m_sFile2BLoadLeftEye      = strlefteye;
                this->m_rtreeClassifierLeftEye.read( this->m_sFile2BLoadLeftEye.c_str() );
            }
            if(strrighteye!="")
            {
                this->m_sFile2BLoadRightEye     = strrighteye;
                this->m_rtreeClassifierRightEye.read( this->m_sFile2BLoadRightEye.c_str() );
            }
            if(strnose!="")
            {
                this->m_sFile2BLoadNose         = strnose;
                this->m_rtreeClassifierNose.read( this->m_sFile2BLoadNose.c_str() );
            }
            if(strmouth!="")
            {
                this->m_sFile2BLoadMouth        = strmouth;
                this->m_rtreeClassifierMouth.read( this->m_sFile2BLoadMouth.c_str() );
            }
        }
        break;
    case VO_AdditiveStrongerClassifier::BOOSTING:
    default:
        {
            if(strfrontalface!="")
            {
                //this->m_sFile2BLoadFrontalFace  = strfrontalface;
				cv::CascadeClassifier facedetect;
				facedetect.load(strfrontalface);
				//m_cascadeClassifierpublic.load(strfrontalface);
				m_cascadeClassifier.load(strfrontalface);
                m_cascadeClassifierFrontalFace.load( strfrontalface);
            }
            if(strprofileface!="")
            {
                //this->m_sFile2BLoadProfileFace  = strprofileface;
                //this->m_cascadeClassifierProfileFace.load( this->m_sFile2BLoadProfileFace );
				this->m_cascadeClassifierProfileFace.load( strprofileface );
            }
            if(strlefteye!="")
            {
                //this->m_sFile2BLoadLeftEye      = strlefteye;
                //this->m_cascadeClassifierLeftEye.load( this->m_sFile2BLoadLeftEye );
				this->m_cascadeClassifierLeftEye.load( strlefteye );
            }
            if(strrighteye!="")
            {
                //this->m_sFile2BLoadRightEye     = strrighteye;
                //this->m_cascadeClassifierRightEye.load( this->m_sFile2BLoadRightEye );
				this->m_cascadeClassifierRightEye.load( strrighteye );
            }
            if(strnose!="")
            {
                //this->m_sFile2BLoadNose         = strnose;
                //this->m_cascadeClassifierNose.load( this->m_sFile2BLoadNose );
				this->m_cascadeClassifierNose.load( strnose );
            }
            if(strmouth!="")
            {
                //this->m_sFile2BLoadMouth        = strmouth;
                //this->m_cascadeClassifierMouth.load( this->m_sFile2BLoadMouth );
				this->m_cascadeClassifierMouth.load( strmouth );
            }
        }
        break;
    }
}

hujilin1229 2013-06-12
  • 打赏
  • 举报
回复
引用 4 楼 zhaokai115 的回复:
fd对象没有初始化?
CFaceDetectionAlgs fd; 也已经声明,初始化了啊
zhaokai115 2013-06-12
  • 打赏
  • 举报
回复
fd对象没有初始化?
hujilin1229 2013-06-12
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
this->m_sFile2BLoadFrontalFace 是什么数据类型?看起来应该是这个地方有问题,那个地址感觉是非法地址
刚看错了,这个也是一个私有变量
    string              m_sFile2BLoadFrontalFace;
就是string变量啊
hujilin1229 2013-06-12
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
this->m_sFile2BLoadFrontalFace 是什么数据类型?看起来应该是这个地方有问题,那个地址感觉是非法地址
这是这个类的私有变量:
CascadeClassifier   m_cascadeClassifierFrontalFace;
这个是opencv里面的,我之前定义了这个测试了这个传进去的参数,没有什么问题啊
 cv::CascadeClassifier facedetect;
    facedetect.load(frontalface);
worldy 2013-06-12
  • 打赏
  • 举报
回复
this->m_sFile2BLoadFrontalFace 是什么数据类型?看起来应该是这个地方有问题,那个地址感觉是非法地址

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧