2010-04-01 66 views
0

我試圖創建一個tm *結構體的數組,然後在函數結束時返回它們。這就是我目前的樣子:從函數返回一個tm *結構體的數組

struct tm* BusinessLogicLayer::GetNoResponceTime() 
{ 
    struct tm* time_v[3]; 
    struct tm* time_save; 
    int s = 3; 
    time_save = LastSavedTime(); 
    time_v[0] = time_save; 
    sleep(5); 
    time_save = LastSavedTime(); 
    time_v[1] = time_save; 
    sleep(5); 
    time_save = LastSavedTime(); 
    time_v[2] = time_save; 

    return time_v; 
} 

我明白,既然有代碼,我現在就不可能返回數組,因爲當函數結束它會被銷燬。任何人都可以幫助我關於如何能夠在函數結束後從返回值訪問數組?

問候

保羅

+0

你的意思或者「'tm'結構數組」,「一個「tm *'指向結構的指針」數組? – MSalters 2010-04-01 12:32:51

+0

tm * – paultop6 2010-04-01 12:46:20

回答

4

無論是在堆上分配的數組,但你需要記住delete[]數組,當你使用完。

tm* time_v = new tm[3]; 

或者因爲這是C++,更好的選擇是使用一個vector

std::vector<tm> time_v(3); 

本身在堆棧上分配的載體,但它保持其在堆上分配的陣列。當你複製矢量(例如返回它)時,底層數組的內容也被複制。

您還可以通過不使用臨時變量time_save

time_v[0] = *LastSavedTime(); 
sleep(5); 

time_v[1] = *LastSavedTime(); 
sleep(5); 

time_v[2] = *LastSavedTime(); 

的C風格的結構聲明也沒有用C需要++

struct tm* time_v[3]; 

//should be 
tm* time_v[3]; 
+0

不應該是'std :: vector time_v(3);'和同樣是'new'變種? – 2010-04-01 12:27:17

+0

這對我來說似乎沒問題 – Elemental 2010-04-01 12:34:30

+0

@Andreas這遠遠不止是給出的代碼示例,但是我會懷疑,它似乎應該不是一個不使用指針的問題。 – Yacoby 2010-04-01 12:39:27

4

創建副本,並返回,而不是簡化的功能:

vector<tm> ret; 
struct tm* time_save; 

time_save = LastSavedTime(); 
ret.push_back(*time_save); 

Sleep(5); 
time_save = LastSavedTime(); 
ret.push_back(*time_save); 

Sleep(5); 
time_save = LastSavedTime(); 
ret.push_back(*time_save); 

return ret; 

顯然,您需要更改簽名。

0

對不起保羅,在輕微的着急,但是試試這個...

struct tm* time_v = new struct tm[ 3 ]; 

這將分配結構適合你,那麼你就對其進行初始化,並返回按你的函數提供的代碼。

但是我想提醒你,一旦它是沒有必要的,請使用「刪除」

希望這有助於釋放內存 - 尼爾