【问题标题】:Code crashes when running but not when debugging [closed]代码在运行时崩溃,但在调试时不崩溃[关闭]
【发布时间】:2018-08-30 13:41:48
【问题描述】:

我应该编写一种拼字游戏,但我有一个大问题。我应该为每个玩家提取一张包含字母的卡片,以便决定谁开始游戏。然后,我必须再次将卡片放入包中。但是,当我运行该程序时,它会崩溃,但是当我使用调试时它可以工作。有人可以帮帮我吗?

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

char letterarand(char *firstelementarray, int numelement, vector<int> &pos)
{
  srand(time(NULL));
  int n = rand() % 100;  // 0 - 99
  pos.push_back(n);
  if (firstelementarray[n] == '0') {
    pos.pop_back();
    letterarand(firstelementarray, numelement, pos);
  }
  return firstelementarray[n];
}

void order(vector<char> &letters, vector<string> &name, int num, vector<int> &positions)
{
  for (int i = 0; i < num; ++i) {
    cout << letters[i] << endl;
  }
  for (int i = 0; i < num - 1; ++i) {
    for (int j = i; j < num; ++j) {
      if (letters[i] > letters[j]) {
        char temp = letters[i];
        letters[i] = letters[j];
        letters[j] = temp;
        string swap = name[i];  
        name[i] = name[j];
        name[j] = swap;
        int temp2 = positions[i];  
        positions[i] = positions[j];
        positions[j] = temp2;
      }
    }
  }
}

void insert(char *firstelementarray, int numplayers,
                 vector<int> positions, vector<char> extract)
{
  for (int i = 0; i < numplayers; ++i) {
    cout << extract[i] << " " << positions[i] << endl;
  }
  int j = 0;
  for (int i = 0; i < numplayers; ++i) {  //letters extracted are trasformed in '0'
    firstelementarray[positions[i]] = extract[j];
    ++j;
  }
}

int main()
{
  cout << "                  UPWORDS:               "
       << endl;
  cout << endl;
  char c = '0';
  vector<string> players;
  string playersname;
  cout << "Number of player (2-4):" << endl;
  cin >> c;
  while ((!(c >= '2' && c <= '4'))) {
    cin >> c;
  }
  int playersnum = c - '0';
  vector<char> extract;
  char bag[100] = {
      'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D',
      'D', 'D', 'D', 'D', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'F', 'F', 'F',
      'G', 'G', 'G', 'H', 'H', 'H', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'J', 'K',
      'K', 'L', 'L', 'L', 'L', 'L', 'M', 'M', 'M', 'M', 'M', 'N', 'N', 'N', 'N',
      'N', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'P', 'P', 'P', 'Q', 'R', 'R', 'R',
      'R', 'R', 'S', 'S', 'S', 'S', 'S', 'S', 'T', 'T', 'T', 'T', 'T', 'U', 'U',
      'U', 'U', 'U', 'V', 'W', 'W', 'X', 'Y', 'Y', 'Z'};
  vector<int> positions;
  cout << "name players: " << endl;
  for (int i = 0; i < playersnum; ++i) {
    cout << "player " << i + 1 << " :";
    cin >> playersname;
    players.push_back(playersname);
    extract.push_back(letterarand(bag, 100, positions));
    bag[positions[i]] = '0';
  }
  order(extract, players, playersnum, positions);
  insert(bag, playersnum, positions, extract);
}

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误最短的 b> 在问题本身中重现它所必需的代码。
  • 你需要说出程序崩溃时你使用什么输入。
  • 可能超出了向量访问范围。使用.at 而不是[],这会导致运行时错误。
  • 问题很可能是读取了一些未初始化的内存。在调试模式下它将被清零,但在发布时它将包含一个垃圾值。
  • 无关:您只想调用一次srand,除非在非常特殊的情况下。每次调用它时,您都会重新启动随机数生成器,而您几乎不想这样做。拨打srandmain 顶部附近的某个位置,并删除所有其他呼叫。

标签: c++ debugging crash


【解决方案1】:

在字母和递归代码很难理解。我可以建议:

char letterarand(char *firstelementarray, int numelement, vector<int> &pos)
{
  srand(time(NULL));        // should only be done once!  Move to main

  // chose random letter, not previously chosen
  int n
  do {
       n = rand() % 100;  // 0 - 99
  } while( firstelementarray[n] == '0';
  char letter = firstelementarray[n];

  // mark letter as chosen
  firstelementarray[n] = '0';

  pos.push_back(n);
  return letter;
}

【讨论】:

  • 添加 (numgiocatori) 时会发生什么变化?
  • 构造包含默认值的所需长度的向量cplusplus.com/reference/vector/vector/vector
  • 我试过了,但和以前一样,它只在调试期间有效
  • 我现在意识到,当我想分配“0”时,向量“位置”不为空,因为在第一个函数(字母)中有一个回退
  • 为什么?第二次提取同一张卡时可能是这样。事实上,对应于卡片的元素,假定值为 '0'
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2014-12-01
相关资源
最近更新 更多