※ ChatGPTを利用し、要約された質問です(原文:プログラムがバグっている箇所を教えて下さい(1))
プログラムがバグっている箇所を教えて下さい(1)
このQ&Aのポイント
C++初心者です。以下のソースコードでバグっていると思われる箇所を教えていただけるとありがたいです。
int型整数を格納するスタックを、配列を用いて実現する(格納上限1000個)
C++のプログラムにバグがあり、修正が必要です。スタックのプッシュとポップの機能が正しく動かないようです。正常系テストと境界値テストを実行してバグの原因を特定してください。
C++初心者です。
以下のソースコードでバグっていると思われる箇所を教えていただけるとありがたいです。
/* 02_LIFO.cpp
*
* int型整数を格納するスタックを、配列を用いて実現する(格納上限1000個)
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "02_LIFO.h"
/* スタック格納要素最大数実装 */
const int LIFO::m_maxSize = 1000 * sizeof(int);
/* コンストラクタ */
LIFO::LIFO()
{
memset(m_stack, 0, m_maxSize);
}
/* デストラクタ */
LIFO::~LIFO()
{
/* nop */
}
/* プッシュ */
int LIFO::LIFO_push_array(const int push_value)
{
if (m_stored > m_maxSize) {
return EXIT_FAILURE;
} else {
m_stack[m_stored++] = push_value;
return EXIT_SUCCESS;
}
}
/* ポップ */
int LIFO::LIFO_pop_array(int *pop_value)
{
if (m_stored == 0) {
return EXIT_FAILURE;
} else {
*pop_value = m_stack[m_stored--];
return EXIT_SUCCESS;
}
}
/* 以下テスト用 */
static void Check(bool result, int line)
{
if (result == false) {
/* 結果がおかしい処理の行をログ出力 */
printf("ERROR Line:%d\n", line);
}
}
/* 正常系テスト */
static void TestNormal(void)
{
int result;
LIFO stack;
result = stack.LIFO_push_array(10);
Check((result == EXIT_SUCCESS), __LINE__);
result = stack.LIFO_push_array(20);
Check((result == EXIT_SUCCESS), __LINE__);
int val = 0;
result = stack.LIFO_pop_array(&val);
Check((result == EXIT_SUCCESS), __LINE__);
Check((val == 20), __LINE__);
result = stack.LIFO_pop_array(&val);
Check((result == EXIT_SUCCESS), __LINE__);
Check((val == 10), __LINE__);
}
/* 境界値テスト */
static void TestLimit(void)
{
int result;
LIFO stack;
/* 空の状態でPOP */
int val = 0;
result = stack.LIFO_pop_array(&val);
Check((result == EXIT_FAILURE), __LINE__);
/* MAX値までPUSH */
for (int i = 0; i < 1000; i++) {
result = stack.LIFO_push_array(10);
Check((result == EXIT_SUCCESS), __LINE__);
}
/* MAX値を超えてPUSH */
result = stack.LIFO_push_array(10);
Check((result == EXIT_FAILURE), __LINE__);
}
/* メイン関数 */
int main()
{
/* テスト */
printf("TestStart\n");
TestNormal();
TestLimit();
printf("TestEnd\n");
return 0;
}
お礼
なるほど…納得です。回答ありがとうございます^^