|
|
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
Подскажите, как можно описать структуру: Имеется запись: int, long, char[неопределенное] Как можно описать (char ch[]) в виде: struct { int I; long l; char ch[]; } Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 12:14 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
EvolVERПодскажите, как можно описать структуру: Имеется запись: int, long, char[неопределенное] Как можно описать (char ch[]) в виде: struct { int I; long l; char ch[]; } Спасибо. как вы знаете, динамические массивы формируются через указатели и функции выделения памяти. Поэтому, Ваша структура будет: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 12:19 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
Знаю... здесь другой случай, например, дамп памяти: 03 30 45 46 47 48 31 31 32 33 34 35 00 где 03 30 - int 45 46 47 48 - long 31 31 32 33 34 35 00 - char[] если поставим указатель, то затрется массив ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 12:23 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
EvolVERЗнаю... здесь другой случай, например, дамп памяти: 03 30 45 46 47 48 31 31 32 33 34 35 00 где 03 30 - int 45 46 47 48 - long 31 31 32 33 34 35 00 - char[] если поставим указатель, то затрется массив А если так: Код: plaintext 1. 2. 3. 4. 5. или Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 12:27 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
ErV или Код: plaintext 1. 2. 3. 4. 5. к сожелению не позволит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 12:28 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
EvolVER ErV или Код: plaintext 1. 2. 3. 4. 5. к сожелению не позволит... Тогда второй вариант можно использовать. Насколько я понимаю, вы будете брать указатель на дамп и кастить его в указатель на данную структуру... Соответственно, можно вписать в размер массива любой размер (хоть тот же char c[65536]), так как выход за его (массива) пределы, вроде как, все равно не проверяется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 13:47 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
это хорошо, когда статика. А в случае динамики массив неопределен, и если мы укажем [65535] то компилер будет аллокировать память под этот массив, соответственно либо затрутся данные, если мы делаем поверх дампа, либо если таких структур тьма: struct *massiv; то памяти сожрет немеренно : на 10 записей уже (65535+8)*10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 14:13 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
EvolVERэто хорошо, когда статика. А в случае динамики массив неопределен, и если мы укажем [65535] то компилер будет аллокировать память под этот массив, соответственно либо затрутся данные, если мы делаем поверх дампа, либо если таких структур тьма: struct *massiv; то памяти сожрет немеренно : на 10 записей уже (65535+8)*10. Если вы хотите такую структуру создавать через new, то лучше этого делать не стоит. Просто по вашим словам я понял так, что вам передается указатель на данные, которые храняться в таком формате и вы хотите превратить её в нечто удобоваримое, вы не упомниали, что сами хотите получить структуру, данные в которой представлены в таком виде. Для неё надо будет выделять память через malloc, либо создавать процедуру, которая будет брать исходные данные, и запаковывать их в нужный формат, опять же, используя malloc. Массив из таких структур (я имею в виду через struct *massiv) вы не сделаете по той простой причине, что размер структуры в памяти неизвестен. Нужно будет выделять сырой блок памяти и гулять по нему адресной арифметикой. Либо же использовать struct **masiv, и выделять память отдельно для каждой стуруктуры в нужном для неё размере. На мой взгляд, будет намного проще хранить данные так, как удобно, но создать метод, который сможет их сохранить в пямять в нужном формате. Например, взяв исходные данные, посчитает размер требуемого блока, выделит память и заполнит блок нужными значениями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 14:51 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
ErV EvolVERэто хорошо, когда статика. А в случае динамики массив неопределен, и если мы укажем [65535] то компилер будет аллокировать память под этот массив, соответственно либо затрутся данные, если мы делаем поверх дампа, либо если таких структур тьма: struct *massiv; то памяти сожрет немеренно : на 10 записей уже (65535+8)*10. Если вы хотите такую структуру создавать через new, то лучше этого делать не стоит. Просто по вашим словам я понял так, что вам передается указатель на данные, которые храняться в таком формате и вы хотите превратить её в нечто удобоваримое, вы не упомниали, что сами хотите получить структуру, данные в которой представлены в таком виде. Для неё надо будет выделять память через malloc, либо создавать процедуру, которая будет брать исходные данные, и запаковывать их в нужный формат, опять же, используя malloc. Массив из таких структур (я имею в виду через struct *massiv) вы не сделаете по той простой причине, что размер структуры в памяти неизвестен. Нужно будет выделять сырой блок памяти и гулять по нему адресной арифметикой. Либо же использовать struct **masiv, и выделять память отдельно для каждой стуруктуры в нужном для неё размере. На мой взгляд, будет намного проще хранить данные так, как удобно, но создать метод, который сможет их сохранить в пямять в нужном формате. Например, взяв исходные данные, посчитает размер требуемого блока, выделит память и заполнит блок нужными значениями. Мне хотелось бы создать структуру, которая действительно помогла бы работать с таким блоком памяти, т.е. имея struct, указывающую на блок памяти и работать с ней. Загвостка была только в одном - char[] и если бы можно было это каким-нить образом описать, то проблема была бы решена. Пока решение нашел с использованием структуры и отдельной переменной, указывающей на массив char[]. А думал, что можно ухитриться использовать все в одной струтуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 15:23 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
ErV пишет: > А если так: > > struct{ > int a; > long b; > char c[*0*]; > } > > ? > или > > struct{ > int a; > long b; > char c[*65536*]; > } > > если компилятор не позволит использовать char c[0]? char c[1]; Да именно так. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 15:38 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
EvolVER ErV EvolVERэто хорошо, когда статика. А в случае динамики массив неопределен, и если мы укажем [65535] то компилер будет аллокировать память под этот массив, соответственно либо затрутся данные, если мы делаем поверх дампа, либо если таких структур тьма: struct *massiv; то памяти сожрет немеренно : на 10 записей уже (65535+8)*10. Если вы хотите такую структуру создавать через new, то лучше этого делать не стоит. Просто по вашим словам я понял так, что вам передается указатель на данные, которые храняться в таком формате и вы хотите превратить её в нечто удобоваримое, вы не упомниали, что сами хотите получить структуру, данные в которой представлены в таком виде. Для неё надо будет выделять память через malloc, либо создавать процедуру, которая будет брать исходные данные, и запаковывать их в нужный формат, опять же, используя malloc. Массив из таких структур (я имею в виду через struct *massiv) вы не сделаете по той простой причине, что размер структуры в памяти неизвестен. Нужно будет выделять сырой блок памяти и гулять по нему адресной арифметикой. Либо же использовать struct **masiv, и выделять память отдельно для каждой стуруктуры в нужном для неё размере. На мой взгляд, будет намного проще хранить данные так, как удобно, но создать метод, который сможет их сохранить в пямять в нужном формате. Например, взяв исходные данные, посчитает размер требуемого блока, выделит память и заполнит блок нужными значениями. Мне хотелось бы создать структуру, которая действительно помогла бы работать с таким блоком памяти, т.е. имея struct, указывающую на блок памяти и работать с ней. Загвостка была только в одном - char[] и если бы можно было это каким-нить образом описать, то проблема была бы решена. Пока решение нашел с использованием структуры и отдельной переменной, указывающей на массив char[]. А думал, что можно ухитриться использовать все в одной струтуре. Если вы напишите в поле структуры char c[]; то в этом месте будет 4хбайтный указатель (это если 32битная платформа ;)). Чтобы там сразу был массив, к которому можно было бы обращаться по индексу, и который лежал бы в памяти сразу после первых полей структуры, там должно быть char c[x]; где x - любое число, которое вам нравится.. (как справедливо MasterZiv написал, можно char c[1]; ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 15:50 |
|
||
|
Описание структуры с динамическим массивом
|
|||
|---|---|---|---|
|
#18+
MasterZiv char c[1]; Согласен, самый короткий вариант. Спасиб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 17:50 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34380112&tid=2028471]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
62ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 373ms |

| 0 / 0 |
