PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопрос по Procedure и List


Вопрос по Procedure и List

Сообщений 1 страница 10 из 10

1

Столкнулся с проблемой заполнения List через ParseJson.

Код:
DeclareModule Test
  ;   
  Interface NewTest
    _set(*LocationList)
    _set2(List LocationList())
    Destroy()
  EndInterface
  ;   
  Declare New()
EndDeclareModule


Module Test
  Structure TestClass
    *vTable
  EndStructure  
  
  Structure Location
    x.l
    y.l
  EndStructure
  
  Procedure New() ;FUNC Global Class|Structure 
    Protected *obj.TestClass
    *obj = AllocateStructure(TestClass)
    If *obj
      *obj\vTable = ?vTable_TestClass
    EndIf
    ProcedureReturn *obj
  EndProcedure
  ;  
  Procedure _set(*this.TestClass, *LocationList) ;test 1
    Protected Result.i, json.i, Input$  
    
    Input$ = "[ {" + Chr(34) + "x" + Chr(34) + ": 10, " + Chr(34) + "y" + Chr(34) + ": 20}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": 30, " + Chr(34) + "y" + Chr(34) + ": 50}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": -5, " + Chr(34) + "y" + Chr(34) + ": 100} ]"
    json = ParseJSON(#PB_Any, Input$)
    If IsJSON(json)
      ExtractJSONList(JSONValue(json), *LocationList.Location())
      FreeJSON(json)
      Result = #True
    Else
      Result = #False
    EndIf
    ProcedureReturn Result
  EndProcedure
  ;   
  Procedure _set2(*this.TestClass, List LocationList()) ;Test 2
    Protected Result.i, json.i, Input$  
    
    Input$ = "[ {" + Chr(34) + "x" + Chr(34) + ": 10, " + Chr(34) + "y" + Chr(34) + ": 20}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": 30, " + Chr(34) + "y" + Chr(34) + ": 50}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": -5, " + Chr(34) + "y" + Chr(34) + ": 100} ]"
    json = ParseJSON(#PB_Any, Input$)
    If IsJSON(json)
      ExtractJSONList(JSONValue(json), LocationList.Location())
      FreeJSON(json)
      Result = #True
    Else
      Result = #False
    EndIf
    ProcedureReturn Result
  EndProcedure
  
  Procedure Destroy(*this.TestClass)
    If *this
      FreeStructure(*this)
    EndIf
  EndProcedure
  ;   
  DataSection
    vTable_TestClass:
    data.i @_set()
    data.i @_set2()
    data.i @Destroy()
  EndDataSection
EndModule


Structure Location
  x.l
  y.l
EndStructure

NewList Locations.Location()

Define T.Test::NewTest
T = Test::New()
t\_set(@Locations.Location())
t\_set2(Locations())

ForEach Locations()
  Debug Str(Locations()\x) + ", " + Str(Locations()\y)
Next

В общем у меня в Procedure _set (Реальная процедура имеет другое имя, так для теста) поступает ответ от сервера в виде Array.Structure (mysql список записей в таблитце) и нужно передать в Procedure_set List.Structure()
Но получаю ошибку в виде:

Код:
[16:07:47] [COMPILER] Строка 91: The list doesn't match with the procedure parameter.
[16:15:11] [COMPILER] Строка 40: *LocationList() is not a function, array, list, map or macro.

Есть у кого идеи.

И да вот JSON ответ сервера:

Код:
[
{"id":"1","hwid":"123","author":"test","name":"Ftest","version":"1.0.0.0","version_auth":"1.0.0.0","url_update":"http://test","update_data":"0","hash":"123","date":"0","moderate":"0","price_type":"0","price":"0","acess":"0"},
{"id":"2","hwid":"234","author":"test","name":"test2","version":"1.0.0.0","version_auth":"1.1.1.1","url_update":"http://ya.ru","update_data":"0","hash":"43543534","date":"44444","moderate":"1","price_type":"0","price":"0","acess":"0"}
]

И да, я могу вернуть из Procedure JSON-ответ и обработать, но хотелось бы узнать возможно ли сделать это в Procedure.

Отредактировано Ste1nS (10.01.2021 14:37:58)

0

2

Ste1nS написал(а):

В общем у меня в Procedure _set

Чем не подошла процедура _set2 из кода?
Функция ExtractJSONList требует список, а не указатель.

0

3

Пётр написал(а):

Чем не подошла процедура _set2 из кода?
Функция ExtractJSONList требует список, а не указатель.

Так он ошибку выдает:
Строка 90: The List doesn't match with the procedure parameter.

Вот поправил код:

Код:
DeclareModule Test
  ;   
  Interface NewTest
    _set2(List LocationList())
    Destroy()
  EndInterface
  ;   
  Declare New()
EndDeclareModule


Module Test
  Structure TestClass
    *vTable
  EndStructure  
  
  Structure Location
    x.l
    y.l
  EndStructure
  
  Procedure New() ;FUNC Global Class|Structure 
    Protected *obj.TestClass
    *obj = AllocateStructure(TestClass)
    If *obj
      *obj\vTable = ?vTable_TestClass
    EndIf
    ProcedureReturn *obj
  EndProcedure
  ;  
  Procedure _set2(*this.TestClass, List LocationList()) ;Test 2
    Protected Result.i, json.i, Input$  
    
    Input$ = "[ {" + Chr(34) + "x" + Chr(34) + ": 10, " + Chr(34) + "y" + Chr(34) + ": 20}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": 30, " + Chr(34) + "y" + Chr(34) + ": 50}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": -5, " + Chr(34) + "y" + Chr(34) + ": 100} ]"
    json = ParseJSON(#PB_Any, Input$)
    If IsJSON(json)
      ExtractJSONList(JSONValue(json), LocationList.Location())
      FreeJSON(json)
      Result = #True
    Else
      Result = #False
    EndIf
    ProcedureReturn Result
  EndProcedure
  
  Procedure Destroy(*this.TestClass)
    If *this
      FreeStructure(*this)
    EndIf
  EndProcedure
  ;   
  DataSection
    vTable_TestClass:
    data.i @_set2()
    data.i @Destroy()
  EndDataSection
EndModule


Structure Location
  x.l
  y.l
EndStructure

NewList Locations.Location()

Define T.Test::NewTest
T = Test::New()
t\_set2(Locations())

ForEach Locations()
  Debug Str(Locations()\x) + ", " + Str(Locations()\y)
Next

Отредактировано Ste1nS (10.01.2021 15:45:05)

0

4

Код:
DeclareModule Test
  
  Structure Location
    x.l
    y.l
  EndStructure
  ;   
  Interface NewTest
    _set2(List LocationList.Location())
    Destroy()
  EndInterface
  ;   
  Declare New()
EndDeclareModule


Module Test
  Structure TestClass
    *vTable
  EndStructure
  
  Procedure New() ;FUNC Global Class|Structure 
    Protected *obj.TestClass
    *obj = AllocateStructure(TestClass)
    If *obj
      *obj\vTable = ?vTable_TestClass
    EndIf
    ProcedureReturn *obj
  EndProcedure
  ;  
  Procedure _set2(*this.TestClass, List LocationList.Location()) ;Test 2
    Protected Result.i, json.i, Input$  
    
    Input$ = "[ {" + Chr(34) + "x" + Chr(34) + ": 10, " + Chr(34) + "y" + Chr(34) + ": 20}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": 30, " + Chr(34) + "y" + Chr(34) + ": 50}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": -5, " + Chr(34) + "y" + Chr(34) + ": 100} ]"
    json = ParseJSON(#PB_Any, Input$)
    If IsJSON(json)
      ExtractJSONList(JSONValue(json), LocationList())
      FreeJSON(json)
      Result = #True
    Else
      Result = #False
    EndIf
    ProcedureReturn Result
  EndProcedure
  
  Procedure Destroy(*this.TestClass)
    If *this
      FreeStructure(*this)
    EndIf
  EndProcedure
  ;   
  DataSection
    vTable_TestClass:
    Data.i @_set2()
    Data.i @Destroy()
  EndDataSection
EndModule


NewList Locations.Test::Location()

Define T.Test::NewTest
T = Test::New()
t\_set2(Locations())

ForEach Locations()
  Debug Str(Locations()\x) + ", " + Str(Locations()\y)
Next

0

5

Пётр написал(а):
...

DeclareModule Test
 
  Structure Location
    x.l
    y.l
  EndStructure
  ;   
  Interface NewTest
    _set2(List LocationList.Location())
    Destroy()
  EndInterface
  ;   
  Declare New()
EndDeclareModule

Module Test
  Structure TestClass
    *vTable
  EndStructure
 
  Procedure New() ;FUNC Global Class|Structure
    Protected *obj.TestClass
    *obj = AllocateStructure(TestClass)
    If *obj
      *obj\vTable = ?vTable_TestClass
    EndIf
    ProcedureReturn *obj
  EndProcedure
  ; 
  Procedure _set2(*this.TestClass, List LocationList.Location()) ;Test 2
    Protected Result.i, json.i, Input$ 
   
    Input$ = "[ {" + Chr(34) + "x" + Chr(34) + ": 10, " + Chr(34) + "y" + Chr(34) + ": 20}, " +
             "{" + Chr(34) + "x" + Chr(34) + ": 30, " + Chr(34) + "y" + Chr(34) + ": 50}, " +
             "{" + Chr(34) + "x" + Chr(34) + ": -5, " + Chr(34) + "y" + Chr(34) + ": 100} ]"
    json = ParseJSON(#PB_Any, Input$)
    If IsJSON(json)
      ExtractJSONList(JSONValue(json), LocationList())
      FreeJSON(json)
      Result = #True
    Else
      Result = #False
    EndIf
    ProcedureReturn Result
  EndProcedure
 
  Procedure Destroy(*this.TestClass)
    If *this
      FreeStructure(*this)
    EndIf
  EndProcedure
  ;   
  DataSection
    vTable_TestClass:
    Data.i @_set2()
    Data.i @Destroy()
  EndDataSection
EndModule

NewList Locations.Test::Location()

Define T.Test::NewTest
T = Test::New()
t\_set2(Locations())

ForEach Locations()
  Debug Str(Locations()\x) + ", " + Str(Locations()\y)
Next

То есть без объявления структуры ни как да?

Просто у меня фаил со структурами очень большой, и не зотелось бы им засирать Interface :'(

Отредактировано Ste1nS (11.01.2021 14:36:14)

0

6

Ste1nS написал(а):

То есть без объявления структуры ни как да

Компилятор должен знать тип списка, т. к. от этого зависит какой будет машинный код. Ведь если тип списка неизвестен, как функция ExtractJSONList узнает что и куда копировать из json?

0

7

по моему я никогда листом не пользовался. рассказываю из далека :) дизассемблер хочу. худо бедно парсер набросал. теперь то надо результаты показывать. они у меня построчно в массиве болтаются. и массив большой. потом надо его показывать, и не придумал ничего лучше как сделать второй массив, и переписывать в него строки, добавляя пустые строки там где надо. и после отображать уже этот второй массив, с привязкой с скроллбару. потом решил сделать листом в перспективе редактирования - добавления или удаления строк. в процессе парсинга кода добавляю в него AddElement и заполняю. но этот AddElement случаем не как аналог ReDim для массива? не будет ли быстрее сначала бахнуть большой лист, а после уже вписывать свои строки в него, не добавляя AddElement. будет ли это быстрее?

непутевый форум. писал пост и все стерлось при отправке.

Отредактировано SeregaZ (15.02.2024 08:07:06)

0

8

SeregaZ написал(а):

писал пост и все стерлось при отправке

есть плаг (Textarea Cache), который сохраняет любой текст в боксе, как раз предназначен для такого случая.

SeregaZ написал(а):

я никогда листом не пользовался.

он самый ходовой товар на PB, лучше массива.

SeregaZ написал(а):

но этот AddElement случаем не как аналог ReDim

не аналог. Список удобнее обрабатывать в цикле, удобно вставлять элемент в средину, при этом не переписывая весь список как в массиве.
Для списка аналога ReDim не нужен. Увеличение списка только через AddElement(). Можно конечно InsertElement(), но это чисто для создания особой последовательности, а не вообще.

Можно было создать тему, зачем подымать старую и с косвенным вопросом.

Отредактировано AZJIO (15.02.2024 09:18:01)

0

9

юзал поиск :) уж что более менее подошло - туда и написал. насчет удобства... пока еще не ясно. начну на канвасе редактор делать для этого листа и там уже пойму что да как в плане удобства.

0

10

SeregaZ, в вики написано как устроен и работает двусвязный список https://ru.wikipedia.org/wiki/Связный_список

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопрос по Procedure и List