2017-01-11 2 views
2

Я пытаюсь взять введенные пользователем заметки и сохранить их в массиве. Проверка работает нормально, но когда я ввода последнего значения в цикле я получаю:Ошибка отладки. BIG_ALLOCATION_ALLIGNMENT

Debug Assertion Failed! 
Expression: "(_Ptr_user & (_BIG_ALLOCATION_ALIGNMENT - 1))==0"&&0 
An invalid parameter was passed to a function that considers invalid parameters fatal. 

Я изо всех сил, чтобы понять, где проблема и как я могу это исправить.

#include "stdafx.h" 
#include <iostream> 
#include <string> 

using namespace std; 

typedef string noteName; 

noteName getNoteName(int i) 
{ 
    bool flag = true; 
    noteName Namein; 

    do 
    { 
     cout << "Please enter note name no. " << i + 1 << ": "; 
     cin >> Namein; 
     cout << "------------------------------------\n"; 

     if (Namein.length() > 3 || Namein.length() < 2) 
     { 
      cout << "Sorry, a note name must be 2 or 3 characters long. Please try again.\n"; 
      flag = false; 
     } 
     else if (Namein.length() == 3 && Namein[1] != '#') 
     { 
      cout << "Sorry, the second character of a sharp note name must be #. Please try again.\n"; 
      flag = false; 
     } 
     else if ((Namein[0] < 'a' || Namein[0] > 'g') && (Namein[0] < 'A' || Namein[0] > 'G')) 
     { 
      cout << "Sorry, the first character of a note name must be a letter between A and G. Please try again.\n"; 
      flag = false; 
     } 
     else if (isdigit(Namein.back()) == false) 
     { 
      cout << "Sorry, the last character of a note name must be a number. Please try again.\n"; 
      flag = false; 
     } 
     else 
     { 
      flag = true; 
     } 
    } while (flag == false); 

    return Namein; 
} 

int main() 
{ 
    const int numNotes = 4; 

    noteName NoteNames[numNotes]; 

    cout << "Hello\n"; 

    for (int i = 0; i <= numNotes; i++) 
    { 
     NoteNames[i] = getNoteName(i); 
    } 

    cout << "Thank you, the note names and lengths you entered were: \n\n"; 

    for (int i = 0; i <= numNotes; i++) 
    { 
     cout << i << ". " << NoteNames[i] << "\n"; 
    } 

    cout << "Done!"; 

    return 0; 
} 

Я хочу сказать, что это что-то делать с getNoteName() имея тип string возвращения, как я не имел этот вопрос с любым из моих других функций, которые возвращают int.

ответ

1

noteName NoteNames[numNotes]; определяет массив, где NoteNames[numNotes - 1] - это самый большой элемент, к которому вы можете получить доступ.

Вы идете дальше этого. Поведение при этом - undefined, который проявляет себя как крах, который вы наблюдаете.

Замените лимиты цикла на for (int i = 0; i < numNotes; i++) или аналогичные.

(. У вас также есть свои условности CamelCase для имен классов и имена переменных переключения раунда от того, что это нормально, что делает ваш код запутанным читать)

(я бы тоже предпочел видеть constexpr int numNotes = 4;: Google, что для получения более подробной информации .)

Смежные вопросы