В вашем коде есть ряд проблем, особенно в Initialize_My_String_Array
.
void Initialize_My_String_Array (My_String_Array[30720])
{
string Initialization_Values[]={"A","B","C","D","E"};
int Index=0;
int i=0;
int j=0;
while (i<=30719){
My_String_Array[i]=Initialization_Values[Index];
i++;
j++;
if (j=6144){
j=0;
Index++;
}
}
}
- Вашего метод подпись неверна. Вы указали переменную
My_String_Array[30720]
, но вы ее не указали. Из контекста, я думаю, что тип должен быть std::string
.
- В заявлении
if
вы написали if(j = 6144)
. =
не является оператором равенства, это оператор присваивания. ==
- оператор равенства. Ваш код назначает от 6144 до j
, а затем продвигает (ненулевое) значение в логическое, что делает оператор if всегда выполняемым, что означает, что Index
всегда увеличивается. В пределах 5 итераций цикла Index
увеличивается за пределы размера Initialization_Values
, что приводит к неопределенному поведению, а в вашем случае - к нарушениям доступа.
Исходя из контекста, я думаю, что исправленный код выглядит следующим образом:
//Type is now correctly defined.
void Initialize_My_String_Array (string My_String_Array[30720])
{
string Initialization_Values[]={"A","B","C","D","E"};
int Index=0;
int i=0;
int j=0;
while (i<=30719){
My_String_Array[i]=Initialization_Values[Index];
i++;
j++;
if (j == 6144){
j=0;
Index++;
}
}
}
Помимо этого, вам нужно потратить некоторое время пересматривают, как вы написали этот код. Сложные массивы в стиле C обычно считаются плохой практикой на C++, и ваш код является отличным примером того, почему. C++ std::array
объекты намного превосходят и должны быть предпочтительны для любого кода, подобного этому. Кроме того, вы включили некоторый код спагетти, включающий индексы и границы массива. Есть много лучших способов справиться с этим. Я написал, что я считаю намного лучше вариант этого кода:
void Initialize_My_String_Array (std::array<std::string, 30720> & My_String_Array)
{
const std::array<std::string, 5> Initialization_Values{"A","B","C","D","E"};
const size_factor = (My_String_Array.size()/Initialization_Values.size());
for(size_t index = 0; index < My_String_Array.size() && (index/size_factor) < Initialization_Values.size(); index++) {
My_String_Array[index] = Initialization_Values[index/size_factor];
}
}
int main(int argc, char* argv[]) {
std::array<std::string, 30720> My_String_Array;
Initialize_My_String_Array (My_String_Array);
for(std::string const& s : My_String_Array) {
std::cout << s << std::endl;
}
system("pause");
return 0;
}
еще одно: где-то в вашем коде, вы написали что-то вроде using namespace std;
. Избавиться от этого. It's bad practice и делает ваш код труднее интерпретировать для других пользователей («ли string
пользовательского типа или std::string
?»)
Вы должны провести некоторое время правильно обучение C++. Представленный здесь код содержит довольно значительные синтаксические ошибки. – Xirema
Итак, у вас есть 2 массива, к которым вы обращаетесь - вы разработали, какой из них вызывает у вас проблему? – UKMonkey
@Xirema спасибо за ваш ответ, но не могли бы вы указать, что такое синтаксическая ошибка, пожалуйста? – Abdelrahman