Заполнение массива целыми числами

0

Я пытаюсь заполнить массив номерами от 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];
    }
  • 0
    Где ваш выходной оператор, который вызывает проблему?
  • 0
    извините за это, исправил
Теги:
arrays

3 ответа

4

Ваш тип возврата неверен. 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 поскольку вы просто обновляете массив, который был передан, и вам не нужно возвращать что-либо новое.

  • 0
    Извините, я не полностью следую. Сейчас я только изучаю массивы, поэтому я очень новичок в этом.
  • 0
    Массивы в C и C ++ начинаются с нуля, поэтому, если вы создаете массив размером 4096 , то допустимые индексы - от 0 до 4095 . Объявлено, что ваша функция возвращает int , и вы возвращаете единственное целое число в guesses[4096] , которое на самом деле находится за пределами объявленного вами массива (так как оно достигает только 4095 ).
Показать ещё 6 комментариев
3

Ваш 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;
}
0

Вы создаете свой массив локально, а затем пытаетесь вернуть его. Если вы попробуете распечатать (отладить) результат вашего массива до возвращения, вы увидите, что все в порядке. Однако, как только вы вернетесь, массив не будет задерживаться. Попробуйте передать массив в свою функцию.

  • 0
    @Tribse Описание не может быть на 100%, но, тем не менее, исправление работает, и это действительно хорошая практика.
  • 0
    Да, я поставил cout для отладки, чтобы увидеть, какие значения были, они должны быть 111,1112 и т. Д., Но это были большие отрицательные числа. возврат возвращает это другой функции, извините, если я не был ясен.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню