2013-10-26 4 views
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

Где находится ваш оператор вывода, который вызывает проблему? – NoChance

+0

извините за это, исправил его :) – user2921180

ответ

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

Извините, я не полностью следую. Я просто изучаю массивы сейчас, поэтому я очень новичок в этом. – user2921180

+0

Array в C и C++ основаны на нуле, поэтому, если вы создаете массив размером '4096', то действительными индексами являются' 0' thru '4095'. Ваша функция объявлена ​​как возвращающая 'int', и вы возвращаете единственное целое по' guesses [4096] ', которое фактически выходит за пределы объявленного массива (поскольку оно только увеличивается до' 4095'). – DaoWen

+3

Ой, это ужасная ужасная практика по сравнению с просто прохождением в буфере, который нужно заполнить ... –

0

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

+0

@Tribse Описание может быть не 100%, но исправление работает, тем не менее, и это действительно хорошая практика. –

+0

Да, я поставил cout для отладки, чтобы узнать, что это за ценности, они должны быть 111,1112 и т. Д., Но они были большими отрицательными числами. возврат возвращается к другой функции, извините, если я не был чист. – user2921180

+0

@Tribse, я считаю, что цель состояла в том, чтобы вернуть массив, как указано типом return (int *). Тем не менее, они возвращают мусор - как вы указали. Соответствующий способ достижения своей цели - это ввести пропуск в массив и заполнить его. – zinc1oxide

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; 
} 
Смежные вопросы