2014年5月3日土曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅤ部(言語のその他の機能)の22章(例外)、22.3(プログラミング実習)、実習 22-1.を解いてみる。

その他参考書籍

実習 22-1.

コード(BBEdit, Emacs)

sample447_1.cpp

#include <iostream>
#include <cstdlib>
#include <assert.h>

const int QUEUE_SIZE = 100;     // キューの最大サイズ

class queue {
private:
  int count;
  int data[QUEUE_SIZE];
public:
  explicit queue();
  // queue(const queue& old_queue)
  // ~queue()
  // operator = (const queue& old_queue)
  void put(int item);
  int get();
};

class bound_err {
public:
  const std::string what;
  bound_err(const std::string& i_what) : what(i_what) {}
  // bound_err
  // ~bound_err
  // bound_err& operator =
};

inline queue::queue()
{
  count = 0;
}

inline void queue::put(int item)
{
  // assert(count >= 0 && count < QUEUE_SIZE);
  if ((count < 0) ||
      (count >= static_cast<int>(sizeof(data)/sizeof(data[0])))) {
    bound_err overflow("Put overflows queue");
    throw overflow;
  }
  data[count] = item;
  ++count;
}

inline int queue::get()
{
  // assert(count >  0 && count < QUEUE_SIZE);

  if ((count <= 0) || (count >= static_cast<int>(sizeof(data)/sizeof(data[0]))))
    throw("Push underflows queue");
  int t = data[0];
  int i;

  --count;
  for (i = 0; i < count; ++i)
    data[i] = data[i + 1];

  return t;
}

static queue test_queue;
static void put_a_lot() {
  int i;

  for (i = 0; i < 5000; ++i)
    test_queue.put(i);
}

int main()
{
  try {
    put_a_lot();
  }
  catch (bound_err& err) {
    std::cerr << "Error: Bounds exceeded\n";
    std::cerr << "Reason: " << err.what << std::endl;
  }
  catch (...) {
    std::cerr << "Error: Bounds exceeded\n";
    exit (8);
  }
  
  return (0);
}

Makefile

CC=g++
CFLAGS=-g -Wall
all: sample447_1

sample447_1: sample447_1.cpp
 ${CC} ${CFLAGS} -o sample447_1 sample447_1.cpp

clean:
 rm sample447_1

入出力結果(Terminal)

$ make && ./sample447_1
g++ -g -Wall -o sample447_1 sample447_1.cpp
Error: Bounds exceeded
Reason: Put overflows queue
$

0 コメント:

コメントを投稿