2015-02-15 2 views
3

Я только начинаю изучать программирование на C++ и для упражнений, я нашел эту задачу. Я должен написать динамический массив на основе массива. Это то, что я получил до сих пор.C++ dynamic, массив на основе массива

#include <iostream> 
using namespace std; 
class CStack 
{ 
private: 
    char *bottom_; 
    char *top_; 
    int size_; 
public: 
    CStack(int n = 20){ 
     bottom_ = new char[n]; 
     top_ = bottom_; 
     size_ = n; 
    } 
    int getSize(){ return size_; } 
    void push(char c){ 
     if (!full()){ 
      *top_ = c; 
      top_++; 
     } 
     else{ 
      resize(size_ * 2); 
      *top_ = c; 
      top_++; 
     } 
    } 
    void resize(int newSize){ 

      //Allocate new array and copy in data 
      char *newArray = new char[newSize]; 
      memcpy(newArray, bottom_, size_); 

      //Delete old array 
      delete[] bottom_; 
      //Swap pointers and new size 
      memcpy(bottom_, newArray, newSize); 
      size_ = newSize; 
      cout << "array has been resized" << endl; 
    } 

    int num_items() { 
     return (top_ - bottom_); 
    } 
    char pop(){ 
     top_--; 
     return *top_; 
    } 
    int full() { 
     return (num_items() >= size_); 
    } 
    int empty() { 
     return (num_items() <= 0); 
    } 
    void print(){ 
     cout << "Stack currently holds " << num_items() << " items: "; 
     for (char *element = bottom_; element<top_; element++) { 
      cout << " " << *element; 
     } 
     cout << "\n"; 
    } 
    ~CStack(){ // stacks when exiting functions 
     delete[] bottom_; 
    } 
}; 
int main(){ 
    CStack s(5); 
    s.print(); cout << "\n"; 
    s.push('s'); s.push('t'); s.push('a'); s.push('c'); s.push('k'); 
    s.print(); cout << "\n"; 
    s.push('='); 
    s.print(); cout << "\n"; 
    cout << "Popped value is: " << s.pop() << "\n"; 
    s.print(); cout << "\n"; 
    s.push('!'); 
    s.print(); cout << "\n"; 
    s.pop(); 
    s.pop(); 
    s.print(); cout << "\n"; 
    while (!s.empty()) s.pop(); 
    if (s.num_items() != 0) { 
     cout << "Error: Stack is corrupt!\n"; 
    } 
    s.print(); cout << "\n"; 
    // destructor for s automatically called 
    system("pause"); // execute M$-DOS' pause command 
    return 0; 
} 

Он отлично работает до тех пор, пока массив не будет заполнен, и я изменю его размер. После этого вместо букв начинается печать этого printout. И когда программа завершена, и я должен нажать любую клавишу, чтобы выйти, она дает следующую ошибку: error

Заранее за вашу помощь.

+2

При отладке, что вы нашли? Какая часть кода работает не так, как ожидалось, как она работает, и какое поведение ожидается? – Blob

+1

'delete [] bottom_; memcpy (bottom_, newArray, newSize);' просто неверно – wimh

+0

Ошибка находится где-то в функции resize(). Без него все отлично. – niko85

ответ

0

ошибка действительно в методе resize:

void resize(int newSize){ 
    //Allocate new array and copy in data 
    char *newArray = new char[newSize]; 
    memcpy(newArray, bottom_, size_); 

    // Set the top to the new array 
    top_ = newArray + (top_ - bottom_); 

    // Delete old array 
    delete[] bottom_; 

    // Update pointers and size 
    bottom_ = newArray; 
    size_ = newsize; 

    cout << "array has been resized" << endl; 
} 

Ваш код забыл исправить top_ указатель и использовать memcpy обновить указатели, когда вместо того, чтобы просто назначение не требуется.

+0

Большое спасибо. Он работает сейчас. – niko85

0

Вы должны установить top_ в новый верх памяти в resize().

void resize(int newSize){ 

      //Allocate new array and copy in data 
      char *newArray = new char[newSize]; 
      memcpy(newArray, bottom_, size_); 

      top_ = newArray + (top_ - bottom_); 

      //Delete old array 
      delete[] bottom_; 

      size_ = newSize; 
      bottom_ = newArray; 

      cout << "array has been resized" << endl; 
    } 
+0

ваша 'delete [] bottom_;' строка удаляет новый массив – 6502

+0

Благодарим за помощь. Просто запустил код с этой версией resize(), и результат был точно таким же. – niko85

+0

yep, исправлено. – Anonymous

Смежные вопросы