对于循环数组迭代,如果循环测试索引是否为true / false,则错误地评估true

时间:2015-08-12 07:24:31

标签: c++ arrays if-statement for-loop switch-statement

我正在使用库存系统作为我目前所知的c ++数量的挑战,我正在使用带有枚举索引的数组并使用值true或false初始化。这是代码:

using namespace std;

enum items
{
    LASER_RIFLE,
    LASER_SWORD,
    LASER_PISTOL,
    PLASMA_LAUNCHER,
    MAX_ITEMS
};


void playerInventory()
{
    bool items[MAX_ITEMS];
    items[LASER_RIFLE] = true;
    items[LASER_SWORD] = false;
    items[LASER_PISTOL] = false;
    items[PLASMA_LAUNCHER] = true;

    int itemName;
    for (int item = 0; item <= MAX_ITEMS; ++item)
        if (items[item] == true)
        {
            switch (itemName)
            {
            case 1:
                cout << "Laser Rifle\n";
                break;
            case 2:
                cout << "Laser Sword\n";
                break;
            case 3:
                cout << "Laser Pistol\n";
                break;
            case 4:
                cout << "Plasma Launcher \n";
                break;
            }
        }
        else
            cout << "Not in Inventory\n";
}

该声明仅对激光手枪评估为真,对其他一切评估为假。我无法弄清楚为什么会这样。

4 个答案:

答案 0 :(得分:1)

  • 您正在切换myController.php $Activity = Activity::lists('name', 'value'); array_walk($Activity, function(&$item2, $key) { $item2 = trans('kcal.' . $item2); }); 。您应切换为itemName

  • 默认情况下的枚举从0开始,而不是1.您的案例应从0开始。

  • 在for循环中,您必须检查item而不是<

结果如下:

<=

请参阅:ideone

答案 1 :(得分:0)

您永远不会为itemName分配任何内容。

  

将开关(itemName)更改为切换(项目)。

答案 2 :(得分:0)

您有两个地方正在调用undefined behaviour

  1. sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); groupIdQuery = ParseQuery.getQuery("Recent"); groupIdQuery.whereContainsAll("members", Arrays.asList(user1ObjectId, user2ObjectId)); Log.d("objectArray", Arrays.asList(user1ObjectId, user2ObjectId).toString()); groupIdQuery.findInBackground(new FindCallback<ParseObject>() { @Override public void done(List<ParseObject> list, ParseException e) { if (e == null && list.size() != 0) { for (ParseObject dealsObject : list) { recentClassObjectId = dealsObject.getObjectId(); groupId = (String) dealsObject.get("groupId"); Log.d("!!!!!GroupId", groupId); //String members = (String) dealsObject.get("members"); //Toast.makeText(getApplicationContext(), "ObjectId: " + recentClassObjectId + "\n" + "GroupId: " + groupId + " value present", Toast.LENGTH_LONG).show(); } editor = sharedpreferences.edit(); editor.putString(gId, groupId); Log.d("ifGroupId", groupId); editor.commit(); } else { SharedPreferences.Editor editor = sharedpreferences.edit(); Toast.makeText(getApplicationContext(), " No Data present", Toast.LENGTH_LONG).show(); groupId = user1ObjectId + user2ObjectId; editor.putString(gId, groupId); editor.commit(); Log.d("!!!!ElseGroupId", groupId); entryToRecentChat = new ParseObject("Recent"); entryToRecentChat.put("groupId", groupId); entryToRecentChat.put("lastUser", ParseObject.createWithoutData("_User", user1ObjectId)); entryToRecentChat.put("user", ParseObject.createWithoutData("_User", user2ObjectId)); entryToRecentChat.addAllUnique("members", Arrays.asList(user1ObjectId, user2ObjectId)); entryToRecentChat.saveEventually(new SaveCallback() { @Override public void done(ParseException e) { if (e == null) { Toast.makeText(getApplicationContext(), "Value saved", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "Value not saved", Toast.LENGTH_LONG).show(); Log.d("exception", e.getMessage()); } } }); Log.d("elseGroupId", groupId); editor = sharedpreferences.edit(); editor.putString(gId, groupId); Log.d("ifGroupId", groupId); editor.commit(); } } }); valueId = sharedpreferences.getString(gId, "default"); mFirebaseRef = new Firebase(FIREBASE_URL).child(valueId); Log.d("FinalGroupId", valueId); 应为item <= MAX_ITEMS;否则你将超出其范围访问数组。
  2. 访问未初始化的变量:item < MAX_ITEMS
  3. 一旦你有未定义的行为,所有的赌注都会被取消。不要指望该程序有任何合理的输出。

答案 3 :(得分:0)

itemName永远不会被初始化,所以使用itemName INSIDE for scope并用它来均衡真实的或者直接用item更改它。

哦,你正在寻找一个超出阵列范围的地方。数组的长度可能为MAX_ITEMS长,但您的索引从0开始。因此,您应使用item < MAX_ITEMS代替item <= MAX_ITEMS

顺便说一下:您可能希望使用默认的switch-case结构。这不是必需的,但它可以成为救星。