forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Visual Basic (http://forum.boolean.name/forumdisplay.php?f=62)
-   -   Проблемы с переводом (http://forum.boolean.name/showthread.php?t=12664)

Лit}{Ъ 13.06.2010 06:48

Проблемы с переводом
 
Напрод, я вот пытаюсь перевести прогу с 6 вб на 2010 (из VisualStudio). На данный момент исправленны почти все проблеммы, кроме следующей: Прога что то криво связывается по классам, т.е. (описываю свои действия) Бывшие *.bas модули одзываю *.vb грохаю нафиг "Attribute VB_Name=" в модулях, присоединяю к проекту и окружаю текст каждого модуля сторками Public Class ****(имя модуля) и End Class. Проблемма следующая, из классов корректно везде используются только Типы (бывшие в вб 6.0 Type ныне Structure) и константы. Переменные же, функции и процедуры (Всё Public - классы, и они сами) не читабтся в упор, даже при прописывании ИмяМодуля.Функция (Со Structure именно так и сработало). Подскажите плиз чё делать? :SOS:

pax 13.06.2010 10:49

Ответ: Проблемы с переводом
 
Для решения проблемы надо использовать Shared модификатор. Т.к. каласс - это объект, чтобы воспользоваться его функциями - надо либо создать его экземпляр, либо сделать все его методы/поля Shared (общедоступными).

Ключевое слово Shared

т.е. объявлять все эти функции и поля так:
Код:

Public Shared Function Func() As Integer
....
End Function

Public Shared FieldName as Integer


Лit}{Ъ 13.06.2010 12:46

Ответ: Проблемы с переводом
 
Огромное спасибо :super: ! Я ужепытался классы в Strukture пихать и описывать такую переменную в каждом классе (так функции с прцедурами работали:-) ). Уфф.. Проблемой меньше...

Лit}{Ъ 13.06.2010 12:51

Ответ: Проблемы с переводом
 
Вопрос любознательного человека - Что именно подразумевается под этими ставами?

Цитата:

Сообщение от pax (Сообщение 150146)
создать его экземпляр

Вы имели ввиду тупое копирование функции или что то иное?

pax 13.06.2010 16:58

Ответ: Проблемы с переводом
 
Я имел ввиду создание объекта:
Код:

Class Foo

  Public myField as Integer

End Class

'Другой класс использует первый как экземпляр

Class Boo

  Public myFoo as Foo = new Foo()

  Public Sub SetFooValue( Value as Integer)
      myFoo.myField = Value;
  End Sub

  Public Function GetFooValue() as Integer
      Return myFoo.myField;
  End Function

End Class

Сто лет на бэйсике не писал, так что могу ошибок наделать, но смотрится вроде правильно ))

Лit}{Ъ 13.06.2010 21:00

Кстати, я правильно понял, что Public - это значит доступен из всех классов в данном *.vb файле, а Shared доступен из всех *.vb файлов? И Как будет работать Private Shared (если верить мануалу, так можно).

ППЦ. Ошибка "Cannot refer to an instanse member of a class from within a shared mamber initializer without an explicit instanse of the class" - вылазит когда я пытаюсь воспользоватся внутриклассовой функцией (Private) , Что не так? (Внеклассовые работают ОК)

Подскажите есть ли возможность в Structure описать массив фиксированного размера? Если есть то как?

Hurrit 13.06.2010 22:45

Ответ: Проблемы с переводом
 
слушай чувак, не надо так много постов подряд писать, можно же предыдущие изменять

pax 14.06.2010 00:06

Ответ: Проблемы с переводом
 
Public - видимость членов класса внутри и вне класса для его экземпляров.
Private - видимо тока внутри класса.
Shared - объявление членов для всех экземпляров, т.е. общих.

Например допустим что у нас есть класс, описывающий данные отдельного человека:
Код:

Public Class Person
  Public Name As String
  Public Email As String
End Class

Можно создать два экземпляра для двух разных людей и не Shared поля будут предоставлять различные данные для каждого из них:

Код:

Dim Person1 As Person = New Person ()
Person1.Name = "Лit}{Ъ"
Person1.Email = "Лit}{Ъ@blabla.ru"

Dim Person2 As Person = New Person ()
Person2.Name = "PAX"
Person2.Email = "[email protected]"

Допустим теперь, что класс Person имеет общедоступный метод, к которому можно обращаться без создания экземпляров этого класса. Например представим, что у нас есть база данных с уже сохраненными этими двумя людьми, описанными выше. И есть метод, который из базы данных может по электронному адресу человека создать экземпляр записи базы данных со всеми заполненными полями. Выглядело бы это следующим образом:

Код:

Public Class Person
  Public Name As String
  Public Email As String
  Public Shared Function GetPersonFromDB(email As String) As Person
    Dim Person1 As Person = New Person ()
    ' далее поиск по базе данных
    '...
    ' назначение полей
    Person1.Name = dataRow["Name"].ToString()
    Person1.Email = dataRow["Email"].ToString()
    Return Person1
  End Function
End Class


А использование уже где-то из вне можно было бы выполнить следующим образом:
Код:

Dim Person1 As Person = Person.GetPersonFromDB("Лit}{Ъ@blabla.ru")
Dim Person2 As Person = Person.GetPersonFromDB("[email protected]")

Т.е. работать уже с функцией самого класса, а не с его экземпляром.

Надеюсь объяснить смог )))

Лit}{Ъ 14.06.2010 06:49

Ответ: Проблемы с переводом
 
Цитата:

Сообщение от Hurrit (Сообщение 150181)
слушай чувак, не надо так много постов подряд писать, можно же предыдущие изменять

Сори... Учту

Лit}{Ъ 01.07.2010 16:30

Ответ: Проблемы с переводом
 
Ещё одина прозьба. Если не сложно - пожалуйста напишите аналог следующего текста.
Open "C:\1.txt" for input as #1
input #1, a
input #1, b
Close #1
Зарание сенкаса!

SBJoker 01.07.2010 16:40

Ответ: Проблемы с переводом
 
неплохо бы указывать на какой вам язык перевести ;)
Чисто алгоритмически:
Открыть файл "C:\1.txt" для чтения с идентификатором 1 (хотя это быдлокод ппц какой)
прочитать из файла значение в переменную a (от типа переменной будет зависеть число прочитаных байт и интерпретация их)
прочитать из файла значение в переменную b
закрыть файл

Лit}{Ъ 01.07.2010 18:33

Ответ: Проблемы с переводом
 
Я не в том смысле! На русском я и так знаю. Как это звучит на VB 2010?

Спустя некоторое время...

Всё, решение найдено, на случай если кто пойдёт по моим стопам - код следующий.
Microsoft.VisualBasic.FileOpen(1, "C:\1.txt", OpenAccess.Read)
Microsoft.VisualBasic.Input(1, a)
Microsoft.VisualBasic.Input(1, b)
Microsoft.VisualBasic.FileClose(1)

Кста, можно сделать так чтобы он не ругался на строку
"With Microsoft.VisualBasic"? Геморно каждый раз писать...

И ещё - вопрос к Joker. Почему быдлокод то?

SBJoker 02.07.2010 00:27

Ответ: Проблемы с переводом
 
Быдло код потому что в строке открытия файла прописан хендл открытого файла жестко, так делать нельзя может так случится что не будет он доступен.
Для получения валидного хендла файла есть функция h = FreeFile
Которая занесёт в переменную h свободный id файла.

Лit}{Ъ 02.07.2010 08:24

Ответ: Проблемы с переводом
 
Ещё один вопрос - Чем OpenAcces.Read отличается от OpenMode.Input (в случае чтения файлов)?

SBJoker 02.07.2010 10:39

Ответ: Проблемы с переводом
 
Блин ты на каком языке пишешь для начала? Узать костыль совместимости со старым VB это верх идиотизма при наличии прекрасного BinaryReader.

Отличие в том что разрешениена чтение почти всегда гарантировано получишь у системы в вот на Чтение/Запись могут и отказать.

Лit}{Ъ 05.07.2010 14:44

Ответ: Проблемы с переводом
 
Я вроде сказал. Перевожу программу с VB 6.0 на VB 2010.
Я что то не понял смысла второго прндложения, можно на чуть более руском?

Dream 05.07.2010 14:56

Ответ: Проблемы с переводом
 
что не понятно? для того чтобы сделать Read|Write, если такого файла нет, прога попытается его создать, что, если у юзера нету прав на создание этого файла, в этом месте, повлечёт за собой обвал программы, или вылет до ближайшего обработчика.

Лit}{Ъ 10.07.2010 12:17

Ответ: Проблемы с переводом
 
Я вообшето спрашивал про второе предложение а не про вторую строчку! Сажу подругому - что значит:" Узать костыль совместимости со старым VB это верх идиотизма при наличии прекрасного BinaryReader."

Что за BinaryReader и костыль совместимости?

pax 10.07.2010 12:46

Ответ: Проблемы с переводом
 
Костыль совместимости это Microsoft.VisualBasic.*
BinaryReader - это средство бинарного чтения из потоков данных, например из файловых потоков, в структуре Net Framework.

Для операций ввода/вывода в Net обычно используются классы пространства имен System.IO

Лit}{Ъ 28.07.2010 19:47

Ответ: Проблемы с переводом
 
Кто нибудь знает как в 2010 называются константы с кодами клавиш? В 6.0 были vbKeyLeft, vbKeyUp, vbKeyW а здесь как? (Подскажите пудь до класса содержащего оные)

pax 28.07.2010 21:18

Ответ: Проблемы с переводом
 
Ну если использовать события Windows.Forms, то тебе нужно перечисление System.Windows.Forms.Keys

Лit}{Ъ 28.07.2010 22:29

Ответ: Проблемы с переводом
 
Спс...
Подскажите пожалуйста как в ВБ 2010 ведётся отладка! Я исправил все ошибки компиляции выставляю Solution Configurations на Debug жму F5 - результат чёрный экран, курсор часиками, загрузка цп сначала поднимается до 100 потом падает до нуля и ничего не происходит! Открываю диспетчер - процес проекта (который уже запущенная форма) не отвечает (просто свернуть не получается) - завершаю - у окошка Vb на секунду появляется сообщение об ошибке с решениями и сразу проподает... Что я не так делаю?:''((

pax 28.07.2010 22:37

Ответ: Проблемы с переводом
 
Черный экран? В смысле консоль? Приложение Windows.Forms или консольное?

Лit}{Ъ 28.07.2010 22:59

Ответ: Проблемы с переводом
 
Windows Forms. С Директ Х в фул скрине.

pax 28.07.2010 23:01

Ответ: Проблемы с переводом
 
Код главного цикла посмотреть можно? Как он реализован?

Лit}{Ъ 28.07.2010 23:07

Ответ: Проблемы с переводом
 
А что считать главным циклом? У меня там всё через таймеры (приложение должно неприрывно реиндинговать и отображать картинку).

Вопрос вообще в том как настроить ВБ в режим отладки. 6.0 при таких случаях после завершения работы выделял строчку на которой стопорнулся и объяснял суть ошибки - как добится этого от 2010?

pax 28.07.2010 23:14

Ответ: Проблемы с переводом
 
Таймерами никто не делает, главный цикл - это цикл отрисовки. Мне кажется в Managed.DirectX должен быть каркас приложения, вызывающий функции отрисовки во время простоя приложения, когда нет оконных сообщений.

Лit}{Ъ 28.07.2010 23:29

Ответ: Проблемы с переводом
 
??? :4to: Жуть! Я думал циклы используются только в ДОС приложениях или конечных программмах. Все исходники что я видел были с таймерами. Вот я ими и пользуюсь раз в N милисекунд обновляю картинку на экране и радуюсь!

А почему не делают то?

Лit}{Ъ 28.07.2010 23:34

Ответ: Проблемы с переводом
 
Я раз в 30 милли секунд обращаюсь к

Код:

Private Shared Sub Reinder_Timer()
  Dim A As String, I1 As Long, Re As RECT, B As Long
  Re.Bottom = 1000
  Re.Right = 1000
  If UP2D.DirectDraw = True Then
  For I = 1 To UP2D.NDisp Step 1
    UP2D.Display(I).XCam = UpPhiz.Body(I).Dat.Znach(1) - UP2D.Kartinka(I).RECT(0, 0).Right / 2
    UP2D.Display(I).YCam = UpPhiz.Body(I).Dat.Znach(2) - UP2D.Kartinka(I).RECT(0, 0).Bottom / 2
  Next I
  For I = 1 To UpPhiz.NPhB Step 1
    A = A + " " + CStr(UpPhiz.Body(I).Active)
  Next I
  Call UpSo.Zvuchi()
  Call UP2D.StartDraw()
  For I = 1 To UpGP.Nn Step 1
    Call UpGP.See(I)
    Call UpSo.Lissen(I)
  Next I
  For I1 = 1 To UP2D.NDisp Step 1
    With UpSo.Ears(UpPhiz.Body(I1).Dat.Znach(13))
    For I = 1 To .Ind(0) Step 1
      If UpSo.Zvuk(.Ind(I)).Taim = 1 Then
      Call UpSo.Play(UpSo.Zvuk(.Ind(I)).Tip)
      End If
    Next I
    End With
    With UpGP.Glaza(UpPhiz.Body(I1).Dat.Znach(13))
    For I = 1 To .Ind(0) Step 1
      B = .Ind(I)
      With UpPhiz.Body(B).Dat
      Call UP2D.Draw(UpPhiz.Body(B).Tip, I1, CLng(.Znach(1)), CLng(.Znach(2)), UP2D.Pha(.Znach(3)), CLng(.Znach(10)), UpPhiz.Body(B).Phase)  'Risovanie kartinki
      End With
    Next I
    End With
  Next I1
  Call UP2D.EndDraw()
  End If
 End Sub


pax 28.07.2010 23:36

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

Самый простой способ отрисовки в цикле, это в перегруженной функции OnPaint формы в конце написать Invalidate(), что приведет к новой перерисовке снова и снова.

Лit}{Ъ 28.07.2010 23:46

Ответ: Проблемы с переводом
 
Бррр - никогда так не делал! Тоесть условно говоря мы пихаем куданибудь в форме Do Loop между ними делаем всё что надо а перед Loop ставим Invalidate()?

А чем нам мешает "перерисовка формы" ? Ну например у меня в программе раз в 70 мили секунд опрашивается клавиатура, раз в 40 проверяется физика а раз в тридцать на форму выводится новая картинка и всем хорошо...

pax 28.07.2010 23:52

Ответ: Проблемы с переводом
 
Нет, никаких циклов в Windows.Forms
у тебя должна быть функция перерисовки окна:
PHP код:

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        
'код отрисовки


        Invalidate()
    End Sub 

Цитата:

Сообщение от Лit}{Ъ (Сообщение 156521)
А чем нам мешает "перерисовка формы" ? Ну например у меня в программе раз в 70 мили секунд опрашивается клавиатура, раз в 40 проверяется физика а раз в тридцать на форму выводится новая картинка и всем хорошо...

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

Лit}{Ъ 29.07.2010 00:06

Ответ: Проблемы с переводом
 
Я правельно понимаю что речь идёт о Form Events? Из них у меня есть только просто Paint... Хотя скорее всего реч идёт о чём то другом... А если так то получается мы каждый раз когда видим что форме вздумалось перерисоваться застовляем её нанести на себя нужную нам картинку?

pax 29.07.2010 00:13

Ответ: Проблемы с переводом
 
Да, но используя Invalidate() в конце функции перерисовки OnPaint мы заставляем ее перерисовываться постоянно, тратя на это свободные ресурсы системы для получения максимального количества кадров в секунду.

Лit}{Ъ 29.07.2010 00:15

Ответ: Проблемы с переводом
 
Цитата:

Сообщение от pax (Сообщение 156523)
Представь ситуацию, что твоему процессору и видеокарте не угнаться за таймером, если функция отрисовки будет слишком тяжелой ;) А при применении отрисовки в цикле будет выводиться столько кадров, на сколько хватит ресурсов компьютера.

И тут я понял откуда взялось Fraps Past Second :) ! А у меня получается сия величина была фиксированной!


Цитата:

Сообщение от pax (Сообщение 156530)
Да, но используя Invalidate() в конце функции перерисовки OnPaint мы заставляем ее перерисовываться постоянно, тратя на это свободные ресурсы системы для получения максимального количества кадров в секунду.

То есть при команде Invalidate() мы якобы говорим -" рисуйся как только сможеш"? И в следующий раз onPaint сработает как только ЦП компьютера достаточно освободится?

А В это время работают к примеру таймеры Физики и Опроса клавиатуры, а OnPaint втискивается между ними максимально возможное колличество раз?!

pax 29.07.2010 00:24

Ответ: Проблемы с переводом
 
Invalidate() говорит форме, что ее область не действительна и ее нужно перерисовать. И когда она сможет, она ее перерисует.

Вот нашел в интернете довольно старые уроки, но может пригодятся для понятия общих принципов http://progs.biz/directx/direct3d/vb/vb01.aspx

Лit}{Ъ 29.07.2010 00:34

Ответ: Проблемы с переводом
 
Огромное спасибо! Вы раскрыли мне глаза на истину! Обязательно перепишу рейдринг на досуге.

Только до сих пор остаётся действительным вопрос о том как заставит VB не закрывать окно об ошиьке после завершения приложения. Проблема сейчас явно не в перерисовке (таймеры с запасом) да и на 6.0 это прикрасно фурычит.В прблесках окна с ошибкой я понял что он зависает на загруске информации однако что по этому поводу сообщает VB непонятно... Так как окно проподает с глаз долой..

pax 29.07.2010 00:36

Ответ: Проблемы с переводом
 
Цитата:

А В это время работают к примеру таймеры Физики и Опроса клавиатуры, а OnPaint втискивается между ними максимально возможное колличество раз?!
Тут еще такой казус может случиться... таймеры работают в отдельных потоках приложения и при этом может случиться перекрестная работа с одними и теми же переменными для отрисовки и изменения.
Если использовать цикл как в первом туторе, то можно рендерить постоянно кадры, а основываясь на времени вызывать методы обновления физики и игровой логики. Пример такого принципа - цикл с твинигом в Blitz3d. Там функция Update вызывается столько раз, сколько нужно для обеспечения выполнения обновления игры например 30 раз в секунду. а все остальное вермя выполняется рендеринг геометрии с интерполяцией по промежуточным положениям.

pax 29.07.2010 00:38

Ответ: Проблемы с переводом
 
Цитата:

Сообщение от Лit}{Ъ (Сообщение 156537)
Огромное спасибо! Вы раскрыли мне глаза на истину! Обязательно перепишу рейдринг на досуге.

Только до сих пор остаётся действительным вопрос о том как заставит VB не закрывать окно об ошиьке после завершения приложения. Проблема сейчас явно не в перерисовке (таймеры с запасом) да и на 6.0 это прикрасно фурычит.В прблесках окна с ошибкой я понял что он зависает на загруске информации однако что по этому поводу сообщает VB непонятно... Так как окно проподает с глаз долой..

Для отладки работай для начала в оконном режиме и ставь где надо точки останова (слева от кода красные точки) для просмотра состояния переменных на разных шагах работы приложения. Да и возможно правильно составленный цикл отрисовки решит проблемы. Хотя взможно проблема в неверной инициализации графического режима... тут надо думать. Самый простой способ зарегистрировать ошибку в полноэкранном режиме - ставить блоки Try для ловли ошибок и писать их в файл.

Лit}{Ъ 29.07.2010 00:48

Ответ: Проблемы с переводом
 
Про точки вкурсе! Только вот зараза - Оконный режим диркт Х это как раз то с чем я не умею работать.... Мудрый 6.0. выводил ошибку в MSG BoX который не закрывается покане нажмёш - а тут... Пипец...

Чёрт! С точками тоже не помогает!

pax 29.07.2010 00:50

Ответ: Проблемы с переводом
 
Пробуй блоки ловли исключений, вот пример: http://www.homeandlearn.co.uk/NET/nets5p4.html
т.е.:
PHP код:

Try

'Действие, которое может вызвать ошибку'

Catch ex As Exception

' если произошла ошибка между Try и Catch - ее регистрация (запись в файл или вывод в MessageBox)'
MessageBox.Show(ex.Message)
End Try 

UPD: Решил проспамить пример работы с DirectDraw и сюда тоже http://gpwiki.org/index.php/DirectX:...NET:DX9:Basics

Лit}{Ъ 29.07.2010 01:16

Ответ: Проблемы с переводом
 
Помогло! 1 ошибкой меньше! Только без дебагинга с маркерами и просмотром значений будет туго. Чего компу может нехватать что он не может свернуть(развернуть) приложение?

pax 29.07.2010 01:21

Ответ: Проблемы с переводом
 
Для сворачивания надо чтобы окно могло выполнять оконные сообщения... попробуй нажимать сочетание клавиш Windows + D для сворачивания всех окон и потом переключения на студию.

Вообще попробуй организовать цикл так, как приведено в туторе по ссылке в посте 41. Там как раз бесконечный цикл и есть вызов Application.DoEvents(), который дает системе возможность обработки сообщений, в том числе и оконных. А я спать пошел.

Лit}{Ъ 29.07.2010 01:31

Ответ: Проблемы с переводом
 
До цикла даже не доходит! У меня походу компа на нужды студии не хватает... Сейчас я понял самую гениальную вещ изобретённую человеком MSG Box! Я при помощи него переменные отлеживаю. Ужассс...

Огромный сенкс за прмощ.

pax 29.07.2010 20:50

Ответ: Проблемы с переводом
 
Ну как бы полноэкранный режим - это только маленькая часть возможностей, которые нужно реализовать правильно. Один раз понять в чем проблема, а далее будет все как по маслу. Тестировать конечно надо в оконном режиме и иметь возможность в любой момент перейти в полноэкранный.

Лit}{Ъ 16.09.2010 17:48

Ответ: Проблемы с переводом
 
Я нарыл исходник с бесконечным циклом отриссовки и оконным режимом. Возникли следующие вопросы:
Что обозначает строка DoEvents перед loop в бесконечном цикле отрисовки?(без неё проект тупо виснет)
Нормально ли что отрисовка в цикле сделана без функции OnPaint?
Что делает метод DirectDrawSurfase7 Blt?
Что за метод Flip, а точнее почему он необходим при FullScreen режиме (в конце для отрисовки), но не требуется в оконном?

pax 16.09.2010 20:52

Ответ: Проблемы с переводом
 
1. DoEvents - выполняет цикл по оконным сообщениям, необходим для правильной работы окна. Если его убрать, то окно не сдвинешь с места и возможно не будет верной отрисовка. Так что он обязателен.
2. Нормально.
3. Понятия не имею, т.к. с DerectDraw не работал, возможно что-то связанное с синхронизацией буферов или блоков памяти. Вот нашел описание - ссылкаhttp://www.gamedev.ru/code/forum/?id=36432#m3. Похоже это копирование части или всего сурфэйса в другой сурфэйс.
4. Flip обычно меняет местами передний и задний буферы. Т.е. картинка рисуется на заднем буфере, а потом отображается пользователю полностью. На самом деле в оконном режиме он скорее всего тоже необходим для правильной отрисовки.

Лit}{Ъ 05.10.2010 18:04

Ответ: Проблемы с переводом
 
Подскажите плиз. Каким образом в структуре описать НЕ SHARED массив ФИКСИРОВАННОЙ ДЛИННЫ?
(что то духе)
Public Structure a
Public b(100) As Long
End Structure
(только работающее)

pax 05.10.2010 18:25

Ответ: Проблемы с переводом
 
В структурах нельзя объявлять массивы сразу фиксированной длины.

SBJoker 05.10.2010 22:02

Ответ: Проблемы с переводом
 
Хотел бы уточнить что DoEvents выделяет системе время на обработку событий, в том числе и на отрисовку невалидных областей экрана. В ресурсоемких и долгих по времени циклах рекомендуется ставить чтобы небыло фриза приложения плоть до непрорисовки элементов окна.

Лit}{Ъ 06.10.2010 14:46

Ответ: Проблемы с переводом
 
????
А как тогда реатизовать в ВБ 2010 аналог следующего кода в вб 6.0

Public Type A
B(100) as long
End type

pax 06.10.2010 15:01

Ответ: Проблемы с переводом
 
А почему бы класс не использовать вместо структуры?

Лit}{Ъ 06.10.2010 15:34

Ответ: Проблемы с переводом
 
Я об этом подумывал. Тогда другой вопрос. Как решить nullReferenceExpresion was unhandled: Object reference not set to an instance of an object?(Это выдаётся в случае с классом)

pax 06.10.2010 16:16

Ответ: Проблемы с переводом
 
класс надо сначала инициализировать (выделить память под экземпляр при создании с ключевым словом New)

Лit}{Ъ 06.10.2010 16:40

Ответ: Проблемы с переводом
 
А как обойти Arrays cannot be declared with new?

pax 06.10.2010 18:58

Ответ: Проблемы с переводом
 
Да что же тут такого сложного
PHP код:

Public Class A
   
Public B(100) As Long
End 
Class

'создание экземпляра класса:
Dim _a As A = New A 


Лit}{Ъ 07.10.2010 14:22

Ответ: Проблемы с переводом
 
Простие, вы меня не поняли. Знаю, сам виноват - изяснялся туманно. Про выделение памяти для ПЕРЕМЕННЫХ все было понятно с первого раза. Я переспрашиват как выделять память на МАССИВЫ. Если
Public Class A
Public B(100) As Long
End Class
Public Shared C(100) As new A

То Arrays cannot be declared with 'New'.

если

Public Shared C(100) As A= new A
то Explicit initialization is not permitted for arrays declared with explicit bounds.

Это и сложно...

pax 07.10.2010 15:07

Ответ: Проблемы с переводом
 
Нельзя инициализировать массив во время обявления, если у него объявлен размер.

Если надо в другом классе объявить инициализированный массив типа А, то в его статическом конструкторе нужно проинициализировать каждый элемент.

PHP код:

Public Shared C(100) As  A

Shared Sub 
New()
    For 
As Integer 0 To C.Length 1
        C
(i) = New A
    Next
End Sub 


Лit}{Ъ 07.10.2010 15:20

Ответ: Проблемы с переводом
 
О ужас! Куда я попал! ....

Тоесть здравый анлалог (в смысле без гемора инициализации) следующего кода в 2010 невозможен?
Public Type A
b(100) as long
end type
Public a(100) as a

pax 07.10.2010 15:36

Ответ: Проблемы с переводом
 
Если не инициализировать, то в каждом элементе второго массива будет Nothing, а не экземпляр класса A.

При использовании структур как выяснилось - запрещается объявлять массивы фиксированный длины.

:pardon: я вообще на C# программирую ;)

Может нужно что-то проще? зачем объявлять тип для массива?

Лit}{Ъ 07.10.2010 15:58

Ответ: Проблемы с переводом
 
У меня есть программа. Движок на вб 6.0, там больше 2000 строк. Я хочу перевести его на более современный язык. Это последняя проблема (из тех что обнаружены). В движке очень активно используются типы (например чтобы не заводить массивы XNpc YNpc и т.д. я использую тип NPC с характеристикаим Х и Y) это очень удобная функция(Как нам объясняли это и есть оьъекно ориентированное прогаммирование) очень жаль что её так изнахратили в 2010.

Хотя, я тут подумал - что если создать одну большую процедуру и прогемороиться описать в ней выделение памяти всем массивам?(риторический вопрос)

Другое дело - в 2010 есть ну очень хорошая функция - динамические массивы. Как быть с ними - выделить память N -элементам, а дальше выделять по мере увеличения размера?

h1dd3n 07.10.2010 17:25

Ответ: Проблемы с переводом
 
Цитата:

Сообщение от Лit}{Ъ (Сообщение 164007)
очень жаль что её так изнахратили в 2010.

Каво изнахратили? Создай класс Player с полями int X, int Y и создавай свои объекты как и раньше (хотя думаю в 2010 все так и осталось как раньше просто ты чего-то напутал).
Цитата:

Хотя, я тут подумал - что если создать одну большую процедуру и прогемороиться описать в ней выделение памяти всем массивам?(риторический вопрос)
Выделяй память массивам в конструкторе.
Вот то что ты хочешь (vb .net не знаю это с шарпа конвертировано):
Код:

Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Public Class Program
    Public Shared Sub Main(ByVal args As String())
        Dim somep As New Player(20, 50)
        Console.Read()
    End Sub
End Class
Public Class Player
    Public Items As Integer()
    Public Sub New(ByVal pX As Integer, ByVal pY As Integer)
        Items = New Integer(99) {}
        X = pX
        Y = pY
    End Sub
    Public X As Integer
    Public Y As Integer
End Class


pax 07.10.2010 20:10

Ответ: Проблемы с переводом
 
Цитата:

Сообщение от Лit}{Ъ (Сообщение 164007)
очень жаль что её так изнахратили в 2010.

Ну и выражение...

Пользоваться конструкторами для классов - это один из способов лучше контролировать свою программу и выделение памяти. То что запретили создавать массивы в структурах с заранее заданными границами - это не проблема. Для программиста написать лишние три строчки кода инициализации массива - это как два байта переслать.

Вот пример с отложенной инициализацией массивов внутри структуры. При первом обращении к массиву через свойство он будет создан. Переменная хранящая массив скрыта.
PHP код:

Public Structure A
        
Private _b() As Long

        
Public ReadOnly Property B() As Long()
            
Get
                
If _b Is Nothing Then
                    Dim c
(100) As Long
                    _b 
c
                End 
If
                Return 
_b
            End Get
        End Property
    End Structure

    
Public Shared C(100) As 



Часовой пояс GMT +4, время: 10:25.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot