開発環境
- OS X Mavericks - Apple, ときどき
Windows 8.1 + Cygwin64, MinGW (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C++ (プログラミング言語)
- g++(コンパイラ)
C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅤ部(言語のその他の機能)の22章(例外)、22.3(プログラミング実習)、実習 22-1.を解いてみる。
その他参考書籍
- C++プログラミング入門 (グレゴリー サティア (著)、ダウグ ブラウン (著)、Gregory Satir (原著)、Doug Brown (原著)、望月 康司 (翻訳)、谷口 功 (翻訳)、オライリージャパン)
実習 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 コメント:
コメントを投稿