Sub Prov(a, b, ParamArray tabl()) 'выполняет проверку
'Dim jLeft, jRight, i, j As Integer
'ReDim Tabl(1 To 8, 1 To 8) As Boolean
For i = a To 8
For j = 1 To 8
tabl(a, j) = False 'закрашиваем горизонталь
Next
tabl(i, b) = False 'закрашиваем вертикаль
Next
jLeft = b
jRight = b
For i = a + 1 To 8 'закрашивание диагоналей начинаем со следующей строки
jLeft = jLeft - 1
jRight = jRight + 1
If jLeft > 0 Then tabl(i, jLeft) = False 'закрашиваем левую диагональ
If jRight < 9 Then tabl(i, jRight) = False 'закрашиваем правую диагональ
Next
tabl(a, b) = True
End Sub
Задался я вопросом расписать абсолютно все варианты расстановки ферзей из Задача о восьми ферзях. Я знаю, что есть куча решений данной проблемы в сети, но мне захотелось из "спортивного интереса" сделать все самостоятельно, поэтому не предлагайте варианты решений. Вверху часть кода для решения сей задачи. Я уже нашел частное решение проблемы в графической интерпретации в excel (собственно оттуда и взят код сверху, который был предварительно подкорректирован, NB: это набросок для массивного решения, он не проверялся). Вопрос такой: хочу осуществить обращение к этой процедуре из другой, но не знаю как при этом обрабатывать массив в таком случае. Вот, например:
Код
sub adf(a,b)
здесь код, описывающий операции над массивом (приведен вверху)
end sub
sub adjdj([здесь разные аргументы])
dim массив(1 to 8, 1 to 8) as boolean
здесь какой-то код
call adf(a,b)
здесь какой-то код
end sub
Сделаю пояснение. Брут форс всех комбинаций будет осуществляться с помощью как минимум 8 циклов, а учитывая что хочу найти все способы, получается не меньше 9. Как минимум в семи абсолютно идентичных циклах будет использоваться обращение к процедуре проверке Prov. Я понимаю, что можно обойтись и без этой проверочной процедуры, просто вставив код самой процедуры в тело цикла. Хотелось бы узнать можно ли все-таки такое обращение наладить?
если я правильно понял, вы хотите передать параметры a и b в процедуру, а назад получить заполненный массив. тогда самое быстрое объявить этот массив глобально( до всех процедур в модуле):
Код
dim ar(1 to 8, 1 to 8) as boolean
sub prov(a&, b& ;)
end sub
можно также объявлять массив в функции и передавать как результат:
Код
function prov(a&, b& ;)
dim ar (1 to 8, 1 to 8)
prov=ar
end function
можно передавать массив как параметр( вообще.. не в этом конкретном случае, а когда действительно нужно передать массив как параметр и получить его обратно измененным):
Код
sub prov(a&, b&, ar())
...
end sub
но, повторюсь, быстрее будет глобальный массив. в начале процедуры его, очевидно, придется реинициализировать:
Спасибо за ответ. Слэн, именно это и имел ввиду - чтобы на выходе был заполненный определенным образом массив. Сам уже подумывал над глобальным декларированием массива, но хотел узнать, что по этому поводу думают другие, более продвинутые, пользователи. Очень часто в кодах видел вот это:
Код
sub prov(a&, b& ;)
Можете объяснить здесь наличие точки с запятой и амперсентов?
Точка с запятой, это скорее всего баг форума, который вместо скобки рисует смайлик, а амперсанд означает, что переменная имеет тип Long Аналогично записи sub prov(a As Long, b As Long)