|
|
|
Наткнусь ли я на баг, при таком подходе?
|
|||
|---|---|---|---|
|
#18+
У меня есть две структуры следующего вида Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. в своей программе я использую TTreeView, в который заношу данные через создание узла-объекта. в таком виде Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. Все хорошо при наполнении, а при работе столкнулся с такой проблемой: при клике по узлу, в обработчике onChange, получаю ссылку на выбранный узел TTreeNode * Node, а через нее ссылку на данные (Node->Data) типа void *. В каждой структуре сидит поле , определяющее тип данных в узле, для того, чтобы можно было корректно данные извлечь Код: plaintext проблема в том, что получив адрес на данные в момент выделения узла, я фактически знаю что они там есть, но не знаю, как их проинтерпретировать, используя конструкцию вида Код: plaintext 1. 2. 3. 4. так как незннаю, какова вида структура там сидит, фактически имея только адрес. То есть я пологал, что в момент выделения узла, я смогу узнать какие данные в нем сидят, применив конструкцию типа Код: plaintext 1. 2. 3. 4. Вот такая получилась неодназначность, которую попытался решить двумя способами. Первый по легкому пути, взял создал одну структуру, которая вместила в себя все поля двух выше перечисленных Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. неэкономично, но зато теперь я точно знаю, как проинтерпретировать данный, и второй способ, по которому есть вопрос. Во втором способе я зделал структуру вида Код: plaintext 1. 2. 3. 4. 5. 6. 7. и в момен выделения узла, и получения ссылки на его данные, прежде чем начать их обработку, я узнаю тип узла вот такой конструкцией Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. то есть такая как бы вольная интерпетация данных, исходя из того предположения, что в памяти у меня две сструктуры двух типов, разных размеров, но я знаю, что первым полем в каждой из них идет enum, который как я пологаю, должен занимать фиксированное количество байт и в первой и во второй структуре. Вопрос в том, если я буду запускать программу на разных машинах, с разными операционками, в которых может быть под enum отводится разное количество байт, скажем на одной 4, на другой 8, не загребу ли я таким подходим лишнию порцию байтов, в результате чего получу неправельную интерпретацию Код: plaintext ----------------------------------------------------------- С уважением,MySQLdb ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 10:32 |
|
||
|
Наткнусь ли я на баг, при таком подходе?
|
|||
|---|---|---|---|
|
#18+
прошу прощения если неправильно понял с чем-то похожим приходится часто сталкиваться и мне делаю выборки из бд и строю дерево объектов. делаю так: когда данных в узле мало или же эти поля почти одинаковы для то использую ваш первый вариант с флажком признаком типа узла Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 13:18 |
|
||
|
Наткнусь ли я на баг, при таком подходе?
|
|||
|---|---|---|---|
|
#18+
Во-первый, Вы ассоциируете данные с узлом дерева и сразу же эти данные удаляете - то есть Ваша программа получит Access Violation как только Вы попытаетесь разименованить данные: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Освобождать данные Вам надо по закрытию приложения. Второе, чтобы гарантировать размер enum используется такая техника: Код: plaintext Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 13:36 |
|
||
|
Наткнусь ли я на баг, при таком подходе?
|
|||
|---|---|---|---|
|
#18+
Тогда вопрос такого плана: допустим я делаю так typedef struct STname { ............... } ForType;//некая структура typedef ForType* PForType; //указатель на эту структуру я как и описывал, через new заполняю ее данными, и подвязываю к узлу. Есть ли какой нибуть способ, фактически имея void* на эти данный посредством (Node->Data), узнать програмно, что там сидит структура, имя которой STName. ????? И еще вопрос, структуры могут быть вложенными? К примеру typedef struct STname { ............... } ForType;//некая структура typedef struct STname1 { ForType StructInStruct; } ForType1;//некая структура ----------------------------------------------------------- С уважением,MySQLdb ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 13:42 |
|
||
|
Наткнусь ли я на баг, при таком подходе?
|
|||
|---|---|---|---|
|
#18+
авторЕсть ли какой нибуть способ, фактически имея void* на эти данный посредством (Node->Data), узнать програмно, что там сидит структура, имя которой STName. ???? нет, для этого Вы и ввели поле типа. авторИ еще вопрос, структуры могут быть вложенными? К примеру У Вас не структуры вложены, а структура содержит другую структуру в качестве члена данных. Вложенные структуры это: Код: plaintext 1. 2. 3. 4. Прислушайтесь к совету black_zorro и используйте полиморфизм (второй пример автора), тогда поле типа Вам не понадобится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 13:56 |
|
||
|
Наткнусь ли я на баг, при таком подходе?
|
|||
|---|---|---|---|
|
#18+
авторПрислушайтесь к совету black_zorro и используйте полиморфизм (второй пример автора), тогда поле типа Вам не понадобится Это значит мне надо для определенного типа узла сделать для него класс, указав в нем поля, а затем создать экземпляр этого класса, получив на него указатель, и этот указатель поместить в TreeNode ->Data? а как к примеру тогда будет выглядеть вызов функции do_some_work_for_this_node (void){ // some code } через (Node->Data) ??? ----------------------------------------------------------- С уважением,MySQLdb ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 14:56 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32689599&tid=2034438]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 185ms |
| total: | 309ms |

| 0 / 0 |
