Я пытаюсь заполнить массив номерами от 1111 до 8888, причем каждое целое число в числе составляет от 1 до 8 в c++. Однако, когда я запускаю его, он выводит только большие отрицательные числа, указывающие на ошибку. Я честно понимаю, что такое ошибка, поэтому было бы полезно, если бы вы могли мне помочь. Благодарю!
int fillArray()
{
int arrayPosition;
int guesses[4096];
arrayPosition = 0;
for (int i = 1; i <= 8; i++)
for (int j = 1; j <= 8; j++)
for (int k = 1; k <= 8; k++)
for (int m = 1; m <= 8; m++)
{
guesses[arrayPosition] = ((i * 1000) + (j * 100) + (k *10) + m);
cout << guesses[arrayPosition];
arrayPosition++;
}
return guesses[4096];
}
Ваш тип возврата неверен. int fillArray()
, но вы пытаетесь вернуть int[4096]
который был объявлен в стеке... Что вы на самом деле делаете с return guesses[4096];
возвращает первое место памяти после вашего массива в памяти, что, вероятно, просто мусор, следовательно, ваша проблема с большими отрицательными числами.
Вы можете исправить это, выделив свой массив в куче и вернув указатель на начало этого массива:
int * fillArray()
{
int arrayPosition;
int * guesses = new int[4096];
// other stuff stays the same...
return guesses;
}
Однако, поскольку ваша функция называется fillArray, было бы более целесообразно передавать в массив и заполнять ее, а не создавать массив в этой функции. (Если вы хотите это сделать, вместо этого вы можете называть его чем-то вроде make_1_to_8_array
, чтобы было более ясно, что вы создаете что-то, что нужно будет удалить позже.) Предоставление int*
в качестве первого аргумента позволит вам пройти базовый адрес вашего массива, который вы хотите заполнить:
void fillArray(int * guesses)
{
int arrayPosition;
// other stuff stays the same...
}
Или, если вы хотите проверить, что вы используете массив точного размера:
void fillArray(int (&guesses)[4096])
{
int arrayPosition;
// other stuff stays the same...
}
Обратите внимание, что функция теперь возвращает void
поскольку вы просто обновляете массив, который был передан, и вам не нужно возвращать что-либо новое.
4096
, то допустимые индексы - от 0
до 4095
. Объявлено, что ваша функция возвращает int
, и вы возвращаете единственное целое число в guesses[4096]
, которое на самом деле находится за пределами объявленного вами массива (так как оно достигает только 4095
).
Ваш for
-loops выглядит правильно, но обработка вашего массива выключена, как подчеркивается другими ответами.
В C++ более привычно использовать std::vector
и передавать это по ссылке в качестве аргумента. Это избавит вас от необходимости использовать выделение памяти и освобождение памяти. Вот пример, в том числе и на выходе в for
-loops:
#include <iostream>
#include <vector>
int fillArray(std::vector<int>& guesses)
{
for (int i = 1; i <= 8; i++)
for (int j = 1; j <= 8; j++)
for (int k = 1; k <= 8; k++)
for (int m = 1; m <= 8; m++)
{
guesses.push_back((i * 1000) + (j * 100) + (k * 10) + m);
std::cout << guesses.back() << std::endl;
}
return guesses.back();
}
int main()
{
std::vector<int> guesses;
std::cout << fillArray(guesses) << std::endl;
}
Вы создаете свой массив локально, а затем пытаетесь вернуть его. Если вы попробуете распечатать (отладить) результат вашего массива до возвращения, вы увидите, что все в порядке. Однако, как только вы вернетесь, массив не будет задерживаться. Попробуйте передать массив в свою функцию.