C++ “не был объявлен в этом объеме” ошибкой компиляции

Другой вариант - нарезать массив, перебирая его для нахождения наилучшей прибыли:

res = ary.each_with_index.with_object([]) do |(buy_val, i), res|
  highest_val = ary[i..].max
  highest_idx = ary[i..].each_with_index.max[1] + i
  res << [highest_val - buy_val, i, highest_idx]
end.max_by(&:first)

#=> [12, 1, 4]

Где 12 - прибыль, 1 - индекс покупки, а 4 - индекс продаж.


Чтобы понять, как это работает, запустите эту расширенную версию, это стоит больше, чем любое письменное объяснение:

res = []
ary.each_with_index do |buy_val, i|
  p buy_val
  p ary[i..]
  p highest_val = ary[i..].max
  p highest_idx = ary[i..].each_with_index.max[1] + i
  res << [highest_val - buy_val, i, highest_idx]
  p '----'
end

res #=> [[0, 0, 0], [12, 1, 4], [9, 2, 4], [6, 3, 4], [0, 4, 4], [2, 5, 8], [4, 6, 8], [9, 7, 8], [0, 8, 8]]

Из стандартной библиотеки Ruby я использовал Enumerable # each_with_index , [118 ] Enumerable # each_with_object , Enumerable # max и Enumerable # max_by .


За получение индекса максимума, который я любезно украл у Чака ( https://stackoverflow.com/a/2149874 ), спасибо и +1. Я не искал лучшего варианта.

Согласно комментарию Кэри Свовеланд в связанном посте:

[..] a.index(a.max) вернет индекс первого, а a.each_with_index.max[1] вернет индекс последний [..]

blockquote>

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

10
задан 23 March 2009 в 17:41
поделиться

6 ответов

Что случилось:

Определение "nonrecursivecountcells" не имеет никакого параметра, названного сеткой. Необходимо передать имя типа И имя переменной к функции. Вы только передали тип.

Отметьте, используете ли Вы сетку имени для параметра, то имя не имеет никакого отношения к Вашему основному () объявление сетки. Вы, возможно, использовали любое другое имя также.

***Также Вы не можете передать массивы как значения.


Как зафиксировать:

Простой способ зафиксировать это состоит в том, чтобы передать указатель на массив к функции "nonrecursivecountcells".

int nonrecursivecountcells(color[ROW_SIZE][COL_SIZE], int, int);

лучше и безопасный с точки зрения типов->

int nonrecursivecountcells(color (&grid)[ROW_SIZE][COL_SIZE], int, int);

Об объеме:

Переменная, созданная на стеке, выходит из объема, когда блок, в котором это объявляется, завершается. Блок - что-либо в рамках открытия и соответствия закрывающей фигурной скобке. Например, если () {}, функция () {}, в то время как () {}...

Обратите внимание, что я сказал что переменная и не данные. Например, можно выделить память на "куче", и те данные все еще останутся допустимыми даже за пределами объема. Но переменная, которая первоначально указала на него, все еще выйдет из объема.

14
ответ дан 3 December 2019 в 19:35
поделиться

сетка не является глобальным, это локально для основной функции. Измените это:

int nonrecursivecountcells(color[ROW_SIZE][COL_SIZE], int row, int column)

к этому:

int nonrecursivecountcells(color grid[ROW_SIZE][COL_SIZE], int row, int column)

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

4
ответ дан 3 December 2019 в 19:35
поделиться

Первый аргумент nonrecursivecountcells () не имеет имени переменной. Вы пытаетесь сослаться на него как на сетку в теле функции, таким образом, Вы, вероятно, хотите назвать это сеткой.

1
ответ дан 3 December 2019 в 19:35
поделиться

сетка не присутствует на объеме nonrecursivecountcells.

Или сделайте сетку глобальным массивом или передайте ее в качестве параметра функции.

0
ответ дан 3 December 2019 в 19:35
поделиться

исправьте объявление функции на

int nonrecursivecountcells(color grid[ROW_SIZE][COL_SIZE], int row, int column)
0
ответ дан 3 December 2019 в 19:35
поделиться

Поскольку в компиляторе говорится, grid не был объявлен в пределах Вашей функции :) "Объем" в основном означает ряд фигурных скобок. Каждая переменная ограничена объемом, в котором она объявляется (к ней нельзя получить доступ вне того объема). В Вашем случае Вы объявляете grid переменная в Вашем main() функционируйте и пытающийся использовать его в nonrecursivecountcells(). Вы, кажется, передаете его как аргумент colors однако, таким образом, я предлагаю, чтобы Вы просто переименовали свое использование grid в nonrecursivecountcells() кому: colors. Я думаю, что может быть что-то не так с попыткой передать массив тот путь также, таким образом, необходимо, вероятно, исследовать передачу его как указатель (если кто-то еще не говорит что-то об обратном).

1
ответ дан 3 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: