Как грамотно написать Функцию?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Как грамотно написать Функцию?

Сообщение Thomas » 30.09.2006 (Сб) 19:43

Приветствую всех.
Что-то я совсем заучился. :oops: Вроде все правильно написал, ан нет студия возмущается.

Ситуация такова.
в проекте форма и модуль. В модуле я прописал часто используемые функции, которые по мере надобности вызываю из формы.
И вот возникла необходимость написать функцию, которая генерирует уникальные ID в заданном диапазоне и возвращает массиф этих ID.
Вот код самой функции.
Код: Выделить всё

Function UniekID(ByVal всего As Integer, ByVal minValue As Integer, ByVal maxValue As Integer)
        Dim gen As New Random
        Dim число, i, j As Integer
        Dim tabel(всего) As Integer
        Dim равно As Boolean

        While i < всего
            число = gen.Next(minValue, maxValue)
            j = 0
            равно = False
            While j < i ' пока счетчик меньше заполненных позиций в массиве
                If число = tabel(j) Then ' проверяем записано такое число в массив или нет
                    равно = True ' если число уже было
                    Exit While 'выходим из цикла проверки
                Else
                    j += 1 'проверяем следующую позицию в массиве
                End If
            End While 'j < i  закончили проверку
            If равно = False Then 'если числа не было
                tabel(i) = число 'поещаем уникальное число в массив
                i += 1 ' переходим на следующий индекс массива
            End If
        End While 'i < всего ' закончили генерировать
        Return tabel(всего) 'возвращаем массив с уникальными числами
    End Function


Значит передав функции три параметра: сколько ID мы хотим получить, и в каком интервале (например между 101 и 999)
на выходе должены получить массив .

И возникает вопрос: А такое в принципе возможно?
И как синтаксически правильно вызвать эту функцию в коде формы.
Ну например проверить что получилось.

Код: Выделить всё

Dim table() As Integer
table = Tool.UniekID(99, 1, 500)


так например не получается.

Может "гуру" подскажут студенту в чем его ошибка.
Заранее благодарен.
Всего доброго.
Последний раз редактировалось Thomas 01.10.2006 (Вс) 1:19, всего редактировалось 1 раз.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 30.09.2006 (Сб) 20:02

Код: Выделить всё
Return tabel


А чем не устраивает GUID ?
Код: Выделить всё
Dim G As Guid = Guid.NewGuid
MsgBox(G.ToString)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.09.2006 (Сб) 20:02

Return tabel(всего) - это команда возвращения одного числа. Последнего.

Рекомендуется также обратить внимание на коллекции как на способ контроля уникальности.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 01.10.2006 (Вс) 1:13

Nord777, GSerg
Спасибо, что откликнулись.
Я обязательно посмотрю что такое GUID, и как обстоят дела с коллекциями.

Но вопрос остается открытым:
Как грамотно написать функцию?

В данном конкретном случае, возможно ли такое? Передав функции три параметра типа integer получить в результате массив типа integer?
Если да, то как это правильно записать в коде? Код внутри функции рабочий на 153%, мне кажеться проблема в состоит в том : как правильно записать параметры, которые должны передаваться функции, и то, что она возвращает.

GSerg, замечание по поводу
Return tabel(всего) - это команда возвращения одного числа. Последнего

Похоже верное.

Пока в моей голове все переклинило и верного решения нет. Постараюсь временно отвлечься, а потом вернуться к данной проблеме.
И конечно надеюсь на помощь Уважаемого Сообщества.
Всего доброго.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.10.2006 (Вс) 1:55

Thomas, внимательно перечитай http://bbs.vbstreets.ru/viewtopic.php?p=6632519#6632519, особенно начало...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

justboy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 13.07.2006 (Чт) 19:05
Откуда: Воронеж

Сообщение justboy » 01.10.2006 (Вс) 10:51

Thomas, так твой написанный код - он что не работает?
Вот я бы, например, для проверки уникальности значений с удовольствием применил HashTable: HashTable.ContainsKey.
И почему бы не возвращать саму HashTable?
Или я чего-то недопонял в теме?
Если транслятор не нашел ошибок в программе - обратитесь к системному программисту - он исправит ошибки в трансляторе.

Подпись в стадии отладки...
Please wait...

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 01.10.2006 (Вс) 11:25

GSerg
Слона то я и не заметил. :oops: :oops: :oops:
Спасибо.

Функция работает, а для получения результата пишем
Return tabel. Без СКОБОК!!!

А в коде формы пишем так
Код: Выделить всё

Dim tabel() as Integer
tabel=Tool.UniekID(99,101,999) 'т.е. заполнили таблицу ста уникальными числами в диапазоне 101-999

И далее уже в For ... Next можно клиентам присваивать уникальные ID
Это просто учебный проект.


justboy
Я задал этот вопрос потому как ступил :oops: в синтаксисе.
Функция работает и возвращает что она должна возвращать.
Моя ошибка была в лишних скобочках.

А до HashTable мы еще не дошли. (я в школе учусь)

Еще раз всем СПАСИБО.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.10.2006 (Пн) 7:24

и объявленная так функция нормально возвращает массив?

Код: Выделить всё
Function UniekID(ByVal всего As Integer, ByVal minValue As Integer, ByVal maxValue As Integer)



Стоит заменить на

Код: Выделить всё
Function UniekID(ByVal всего As Integer, ByVal minValue As Integer, ByVal maxValue As Integer)  As Integer()
Весь мир матрица, а мы в нем потоки байтов!

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 02.10.2006 (Пн) 14:18

!Viper!
Так обьявленная функция, как ни странно, возвращает массив. :roll:
Но в связи с вашим замечанием, меня гложут сомнения. Вот из-за таких сомнений я и поднял этот вопрос.
Если вас не затруднит, то обьясните почему последний вариант ПРАВИЛЬНЕЕ, что это меняет?
Может у вас есть ссылка на ресурс где об этом написано.

ЗЫ я мог бы конечно спросить об этом у препода, так он буржуй, и шаг в лево, шаг в право отступление от темы => дополнительная оплата. :evil: А я и так с трудом наскрёб на обучение. :cry:

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.10.2006 (Пн) 14:29

Если первый вариант у тебя фурчит нормально это означает, что у тебя не стоит такая фишка как Option Strict. При установке этой опции тебе надо явным образом проводить привидение типов и объявить функцию как
Код: Выделить всё
Function MyFunction()

невозможно. Нужно явно задавать возвращаемый тип, т.е. хотя бы так
Код: Выделить всё
Function MyFunction() As Object

например.

Очень рекомендуется эту опцию (а также OPtion Explicit) использовать всегда и везде. Почитать можно в MSDN естественно
Весь мир матрица, а мы в нем потоки байтов!

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 02.10.2006 (Пн) 14:58

!Viper!
Благодарю покорно.
Я так понимаю это относится к настройкам самой студии. Прямо сейчас пройду на сайт MSDN и почитаю, что там написано.
А про функции , я понял так, нужно всегда указывать тип возвращаемого значения. Правильно?

Еще раз благодарю за разъяснения и всего доброго.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.10.2006 (Вт) 7:31

При качественном программировании нужно всегда явно указывать тип переменной и тип возвращаемого значения функции, а также производить явное преобразование типов.

Option Explicit и Option Strict можно задать как на уровне студии, так и для каждого отдельного файла, написав в начале
Option Strict On
Option Explicit On


или

Option Strict Off
Option Explicit Off


если хочется отключить это для конкретного файла
Весь мир матрица, а мы в нем потоки байтов!

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 03.10.2006 (Вт) 8:49

!Viper!
Еще раз спасибо за дополнительные разъяснения.
Я вчера почитал MSDN и выяснил где в 2005-ой студии устанавливаются эти параметры.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35

    TopList