2011-01-20 51 views
0

我想創建一個動態大小的序列類的實現文件。這是一項家庭作業,並且根據作業的侷限性,我被允許混淆我編寫的實現文件。C++ - 動態數組鑄造垃圾

問題是,當我創建動態數組時,它看起來像是垃圾,沒有真正的價值,而且根本不像數組。當我在調試器中看到它時,我經常會得到一個類似於-6.2774385622041925e + 066的值(更新:這是由Anders K.'s catch所解決的,但是當我在調試器中查看時,我得到1個vanilla數字,而不是像我應該的整個數組,輸出顯示,第一個之後的任何元素仍然是一個瘋狂的怪異數字)。在某個點之後,程序停止運行,並抱怨損壞的堆,我懷疑它直接與數組顯示爲不可靠的值。

任何和所有的幫助表示讚賞。沒有尋找一個解決方案或任何東西,但我必須在某個地方做一些錯誤的事情,把堆丟掉。就像我說的,我只寫了實現文件,所以當然可能是錯誤的。 >。>

更新:粘貼新的清理版本的代碼,以便其他愚蠢的錯誤不會妨礙大的代碼。

這裏是我的執行文件(唯一一個我可以改變)sequence.cpp:

#include "sequence.h" 
using namespace main_savitch_4; 

typedef double value_type; 
typedef std::size_t size_type; 

sequence::sequence(size_type initial_capacity){ 
    data = new value_type[initial_capacity]; 
    used = 0; 
    current_index = initial_capacity + 1; 
    capacity = initial_capacity; 
} 

sequence::sequence(const sequence& source){ 
    capacity = source.size(); 
    used = capacity; 
    current_index = capacity + 1; 
    data = new value_type[capacity]; 
    for (int i = 0; i < used; i++) 
     data[i] = source.data[i]; 
} 

sequence::~sequence(){ 
    delete [] data; 
} 

void sequence::resize(size_type new_capacity){ 
    if (new_capacity > used){ 
     value_type *temp = new value_type[new_capacity]; 
     for(int i = 0; i < used; i++) 
      temp[i] = data[i]; 
     value_type *destroyme = data; 
     data = temp; 
     delete [ ] destroyme; 
     capacity = new_capacity; 
    } 
} 

void sequence::start(){ 
    current_index = 0; 
} 

void sequence::advance(){ 
    current_index += 1; 
} 

void sequence::insert(const value_type& entry){ 
    if (used + 1 > capacity){ 
     resize(capacity + 5); 
    } 
    value_type *temp = new value_type[capacity]; 
    int i(0); 
    if (is_item()){ 
     for(i=i; i < current_index; i++) 
      temp[i] = data[i]; 
     temp[i] = entry; 
     current_index = i; 
     i++; 
     for(i=i; i < used; i++) 
       temp[i] = data[i]; 

     value_type *destroyme = data; 
     data = temp; 
     delete [ ] destroyme; 

    } 
    else{ 
     for(int i = used; i > 0; i--) 
      data[i] = data[i - 1]; 
     data[0] = entry; 
     current_index = 0; 
    } 


    used += 1; 
} 

void sequence::attach(const value_type& entry){ 
    if (used + 1 > capacity){ 
     resize(capacity + 5); 
    } 
    value_type *temp = new value_type[capacity]; 
    if (is_item()){ 
     int i(0); 
     for(i; i <= current_index + 1; i++) 
      temp[i] = data[i]; 
     temp[i] = entry; 
     current_index = i; 
     for(i; i <= used; i++) 
      temp[i] = data[i]; 
     value_type *destroyme = data; 
     data = temp; 
     delete [ ] destroyme;  
    } 
    else{ 
     data[used] = entry; 
     current_index = used; 
    } 

    used+= 1; 

} 

void sequence::remove_current(){ 
    for(int i = current_index; i < used; i++) 
     data[i] = data[i + 1]; 
    used = used - 1; 
} 

void sequence::operator=(const sequence& source){ 
    capacity = source.size(); 
    used = capacity; 
    current_index = capacity + 1; 
    data = new value_type[capacity]; 
    for (int i = 0; i < used; i++) 
     data[i] = source.data[i]; 
} 

size_type sequence::size() const{ 
    return used; 
} 

bool sequence::is_item() const{ 
    if (current_index < used) 
     return true; 
    else 
     return false; 
} 

value_type sequence::current() const{ 
    return data[current_index]; 
} 

下面是相關的頭文件sequence.h:

#ifndef MAIN_SAVITCH_SEQUENCE_H 
#define MAIN_SAVITCH_SEQUENCE_H 
#include <cstdlib> // Provides size_t 

namespace main_savitch_4 
{ 
    class sequence 
    { 
    public: 
     // TYPEDEFS and MEMBER CONSTANTS 
     typedef double value_type; 
     typedef std::size_t size_type; 
     static const size_type DEFAULT_CAPACITY = 30; 
     // CONSTRUCTORS and DESTRUCTOR 
     sequence(size_type initial_capacity = DEFAULT_CAPACITY); 
     sequence(const sequence& source); 
    ~sequence(); 
     // MODIFICATION MEMBER FUNCTIONS 
    void resize(size_type new_capacity); 
     void start(); 
     void advance(); 
     void insert(const value_type& entry); 
     void attach(const value_type& entry); 
     void remove_current(); 
     void operator =(const sequence& source); 
     // CONSTANT MEMBER FUNCTIONS 
     size_type size() const; 
     bool is_item() const; 
     value_type current() const; 
    private: 
     value_type* data; 
     size_type used; 
     size_type current_index; 
    size_type capacity; 
    }; 
} 

#endif 

我得到以下輸出當我運行它:

Running tests for sequence class with a dynamic array 

START OF TEST 1: 
Testing insert, attach, and the constant member functions (4 points). 
Starting with an empty sequence. 
Testing that size() returns 0 ... Passed. 
Testing that is_item() returns false ... Passed. 
I'll call start() and look at the items one more time... 
All tests passed for this sequence. 

I am now using attach to put 10 into an empty sequence. 
Testing that size() returns 1 ... Passed. 
Testing that is_item() returns true ... Passed. 
The cursor should be at item [0] of the sequence 
(counting the first item as [0]). I will advance the cursor 
to the end of the sequence, checking that each item is correct...Passed. 
I'll call start() and look at the items one more time... 
The cursor should be at item [0] of the sequence 
(counting the first item as [0]). I will advance the cursor 
to the end of the sequence, checking that each item is correct...Passed. 
All tests passed for this sequence. 

I am now using insert to put 10 into an empty sequence. 
Testing that size() returns 1 ... Passed. 
Testing that is_item() returns true ... Passed. 
The cursor should be at item [0] of the sequence 
(counting the first item as [0]). I will advance the cursor 
to the end of the sequence, checking that each item is correct...Passed. 
I'll call start() and look at the items one more time... 
The cursor should be at item [0] of the sequence 
(counting the first item as [0]). I will advance the cursor 
to the end of the sequence, checking that each item is correct...Passed. 
All tests passed for this sequence. 

I am now using attach to put 10,20,30 in an empty sequence. 
Then I move the cursor to the start and insert 5. 
Testing that size() returns 4 ... Passed. 
Testing that is_item() returns true ... Passed. 
The cursor should be at item [0] of the sequence 
(counting the first item as [0]). I will advance the cursor 
to the end of the sequence, checking that each item is correct... 
    The item [1] should be 10, 
    but it was -6.27744e+066 instead. 
Failed. 
Test of the sequence's items failed. 

Test 1 failed. 
END OF TEST 1. 


START OF TEST 2: 
Testing situations where the cursor goes off the sequence (4 points). 
Using attach to put 20 and 30 in the sequence, and then calling 
advance, so that is_item should return false ... passed. 
Inserting 10, which should go at the sequence's front. 
Then calling advance three times to run cursor off the sequence ... passed. 
Calling attach to put the numbers 40, 50, 60 ...300 at the sequence's end. 
Now I will test that the sequence has 10, 20, 30, ...300. 
    Test failed to find 30 
Test 2 failed. 
END OF TEST 2. 


START OF TEST 3: 
Testing remove_current (4 points). 
Using attach to build a sequence with 10,30. 
Insert a 20 before the 30, so entire sequence is 10,20,30. 
Testing that size() returns 3 ... Passed. 
Testing that is_item() returns true ... Passed. 
The cursor should be at item [1] of the sequence 
(counting the first item as [0]). I will advance the cursor 
to the end of the sequence, checking that each item is correct... 
    The item [2] should be 30, 
    but it was 10 instead. 
Failed. 
Test of the sequence's items failed. 

Test 3 failed. 
END OF TEST 3. 


START OF TEST 4: 
Testing the resize member function (2 points). 
I will now resize a sequence to a larger capacity, and then 
attach that many items. The sequence should NOT need to 
resize itself under this situation. 
    sequence does not contain correct items. 
+0

使用[copy-and-swap idiom](http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)。 – GManNickG 2011-01-20 05:14:42

回答

1

一個問題: 這裏就initializati你應該初始化所有的itens。

sequence::sequence(size_type initial_capacity){ 
data = new value_type[initial_capacity]; 
used = 0; 
current_index = initial_capacity + 1; 
capacity = initial_capacity; 
} 

爲什麼current_index設置在最後一項? 另外current_index應該是initial_capacity少一個。 C從零開始計數。

+0

我相信我已經處理了所有四位數據成員。我錯過了什麼? current_index被要求有能力根據項目指導原則沒有選擇任何東西。它用is_item函數幾次檢查這個。我決定讓它不被選擇的方式是讓它的值大於所使用的值。這就是它的原因current_index + 1 – stygma 2011-01-20 04:42:05

2

這個片段看起來有點躲閃(插入):

for(int i = used; i > 0; i--) 
    data[used] = data[i - 1]; 

我想你應該做些什麼來得到一些訂單添加斷言在你的方法 以確保值是你所期望的是什麼是。

+0

只有在current_index已經耗盡的情況下,該片段纔會變爲活動狀態,在這種情況下,按照分配,它需要在序列的開始處插入。唯一可以考慮的做法是在不創建全新陣列的情況下完成此操作,將所有內容從最後開始整理到一個地方,然後覆蓋數組中的第一個項目。我相信那是我在那裏做的。 – stygma 2011-01-20 04:47:58