2015-02-26 3 views
1

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

#include <iostream> 

using namespace std; 


class DynamicIntegerStack 
{ 
private: 
    int *bottom_; 
    int *top_; 
    int size_; 
public: 
    DynamicIntegerStack(int n = 20){ 
     bottom_ = new int[n]; 
     top_ = bottom_; 
     size_ = n; 
    } 

    int getSize(){ return size_; } 

    void push(int c){ 
     if (!full()){ 
      *top_ = c; 
      top_++; 
     } 
     else{ 
      resize(size_ * 2); 
      *top_ = c; 
      top_++; 
     } 
    } 

    void resize(int newSize){ 
     //Allocate new array and copy in data 
     int *newArray = new int[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; 
    } 

    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 (int *element = bottom_; element<top_; element++) { 
      cout << " " << *element; 
     } 
     cout << "\n"; 
    } 
    ~DynamicIntegerStack(){ // stacks when exiting functions 
     delete[] bottom_; 
    } 
}; 
int main(){ 
    DynamicIntegerStack s(5); 
    s.print(); cout << "\n"; 
    s.push(1); s.push(3); s.push(5); s.push(10); s.push(15); 
    s.print(); cout << "\n"; 
    s.push(20); 
    s.print(); cout << "\n"; 
    cout << "Popped value is: " << s.pop() << "\n"; 
    s.print(); cout << "\n"; 
    s.push(30); 
    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; 
} 

Он отлично работает, пока массив не заполнен, и я изменяю его размер. После этого вместо целых чисел он начинает печатать это. DynamicIntegerStack

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

+2

Означает ли это подсказку, если я скажу вам (a) 'memcpy' использует ** байт ** count для аргумента размера, и (b)' int' * очень * вероятно * больше *, чем один байт на вашей платформе? Возможно, попробуйте 'std :: copy (bottom_, bottom_ + size_, newArray);' во время изменения размера и отметьте 'memcpy'. [См. Это вживую] (http://ideone.com/czYtqy) – WhozCraig

+0

в чем проблема? – Mukit09

+0

std :: copy дал мне ошибки, это считается небезопасным. – niko85

ответ

1

Когда вы используете memcpy, размер памяти, которую вы копируете, должен указываться в байтах.

Итак, вы должны умножить sizeof(int) на n.

+0

Спасибо, что он работает. – niko85

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