目前分類:C++ (3)

瀏覽方式: 標題列表 簡短摘要
C++真是越寫越好玩,今天又發現一個好玩的函式 _tsplitpath_s
這是用來將檔案路徑切分出 磁碟代號 資料夾 檔名 副檔名

先宣告四個字串
TCHAR strDrive[_MAX_DRIVE];        // 磁碟代號
TCHAR strDir[_MAX_DIR];                 // 資料夾
TCHAR strFile[_MAX_FNAME];         // 檔名
TCHAR strExt[_MAX_EXT];                // 副檔名


※ _MAX_DRIVE,_MAX_DIR,_MAX_FNAME,_MAX_EXT
是 compiler 決定值

假設 strFilePath 是所有路徑
TCHAR strFilePath;                            // 所有路徑

_tsplitpath_s(strFilePath, strDrive, _MAX_DRIVE, strDir, _MAX_DIR, \
strFile, _MAX_FNAME, strExt, _MAX_EXT);

就可以切出所有檔案路徑資訊

若有不想要的資訊,假設只要 副檔名 的資訊
_tsplitpath_s(strFilePath, NULL, 0, NULL, 0, \
NULL, 0, strExt, _MAX_EXT);

這樣就解決了

方便吧!

smalldd 發表在 痞客邦 留言(0) 人氣()

類別要互相使用彼此偶爾會遇到
但是兩個類別標頭檔案(.h)中互相引用(include)彼此的標頭檔案
在 Visual C++ 2005 中會造成 compiler 不認識彼此類別
這可真是一件頭痛的事,該怎麼辦呢?

有一個方法可以解決,就是在標頭檔案中
告訴 compiler 有外部類別存在
在類別實作檔案(.cpp)中,才引用(include)彼此的標頭檔案

範例:

class A
===== A.h =====

class B;

class A
{
  A(B b);
  ~A();
};
=============


==== A.cpp ====
#include "A.h"
#include "B.h"

A::A(B b)
{
}

A::~A()
{
}
============


class B
===== B.h =====

class A;

class B
{
  B(A a);
  ~B();
};
=============


==== B.cpp ====
#include "B.h"
#include "A.h"

B::B(A a)
{
}

B::~B()
{
}
============

這樣兩個類別就可以互相使用了

smalldd 發表在 痞客邦 留言(0) 人氣()

動態配置二維陣列不外乎都是利用下面這種方式
int i;
int data_height, data_width;
int **data;
p = new int*[data_height];
for(i = 0; i < data_height; i++)
    data[i] = new int[data_width];



可惜這種方式在釋放記憶體空間的時候就必須
for(i = 0; i < data_height; i++)
    delete [] data[i];
delete [] data;



不是很方便,且不能使用
memset(data[0], 0, sizeof(int)*data_height*data_width);
初始值為 0
以及用 memcpy() 複製值至另一個陣列


因此參考了程式設計俱樂部 記憶體配置問題 此篇文章
改寫原本用 malloc 動態配置二維陣列的方式
使用 new 的方式建立二維陣列
void* new2d(int h, int w, int size)
{
    register int i;
    void **p;

    p = (void**)new char[h*sizeof(void*) + h*w*size];
    for(i = 0; i < h; i++)
    {
        p[i] = ((char *)(p + h)) + i*w*size;
    }

    return p;
}


因此就可以用這 function
動態建立二維陣列
data = (int **)new2d(data_height, data_width, sizeof(int));


為了增加閱讀方便,以及撰寫程式的方便
在程式前頭增加
#define NEW2D(H, W, TYPE) (TYPE **)new2d(H, W, sizeof(TYPE))

更新記錄:
2011/01/22 01:07

便可簡化剛剛動態配置二維陣列寫法
data = NEW2D(data_height, data_width, int);


此外此種動態配置記憶體的方法在釋放記憶體也比之前寫法方便多
delete [] data;
就可以釋放記憶體

smalldd 發表在 痞客邦 留言(2) 人氣()