Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.05;
Скачать: CL | DM;

Вниз

Можно ли описать запись неизвестного заранее размера   Найти похожие ветки 

 
Очень Злой   (2011-10-27 15:29) [0]

В разных места программы требуются переменные такого и подобных типов:

type  TPacket7 = packed record
     len:word;
     case byte of
     0: (buf: packed array[0..27] of byte;);
     1: (fch: packed array[0..6] of cardinal);
     2: (typepack:byte;);
     end;

type  TPacket10 = packed record
     len:word;
     case byte of
     0: (buf: packed array[0..39] of byte;);
     1: (fch: packed array[0..9] of cardinal);
     2: (typepack:byte;);
     end;

type  TPacket1024 = packed record
     len:word;
     case byte of
     0: (buf: packed array[0..4095] of byte;);
     1: (fch: packed array[0..1023] of cardinal);
     2: (typepack:byte;);
     end;

var
 a:TPacket10;
 b:TPacket7;
...
и т.д.


есть ли в Д7 возможность сделать одно описание, а затем при указании типа переменной указывать и размерность, но чтобы описание записи было одно?


 
Медвежонок Пятачок ©   (2011-10-27 15:35) [1]

PWord вместо рекордов для передачи параметра и приведение к нужному типу на принимающем конце в зависимости от значения PWord^


 
Сергей М. ©   (2011-10-27 15:36) [2]

> при указании типа переменной указывать и размерность

Накой шиш ?
Компилятор на то компилятором и поставлен чтобы самостоятельно и без лишних вопросов расчитывать размер памяти, отвоводимой под переменную конкретно указанного типа.


> чтобы описание записи было одно


Одно описание - один и размер.


 
sniknik ©   (2011-10-27 15:36) [3]

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

если себя не жалко, то работай с "чистой" не типизированной памятью, разметку тогда делай сам...


 
MBo ©   (2011-10-27 15:42) [4]

array[0..0] не подойдут?

packed перед array ни к чему писать.


 
Медвежонок Пятачок ©   (2011-10-27 15:53) [5]

> при указании типа переменной указывать и размерность


function getvar_by_size(ASize : Word) : PWord;
begin
GetMem(Result,ASize);
ZeroMemory(Result);
Result^ := ASize;
end;


 
sniknik ©   (2011-10-27 15:54) [6]

> array[0..0] не подойдут?
или, тогда,  по аналогии, с минимальной "разметкой",
type
 TPacket = packed record
  len: word;
  case byte of
    0: (buf: packed array[0..0] of byte);
    1: (fch: packed array[0..0] of cardinal);
    2: (typepack: byte);
  end;

за длинной/размером следить самому...


 
Anatoly Podgoretsky ©   (2011-10-27 15:54) [7]

Вариантная часть записи, в справке


 
Сергей М. ©   (2011-10-27 15:57) [8]


> MBo ©   (27.10.11 15:42) [4]
>
> array[0..0] не подойдут?


Подойдут для одной размерности.
Вариант с несколькими размерностями уже не прокатывает.


> Медвежонок Пятачок ©   (27.10.11 15:53) [5]


Так сам тип-то и его размер вполне определен - он же пойнтер..
А на что он там указывает в реалии - это уже из другой оперы и не соответствует желаниям ТС.


 
Медвежонок Пятачок ©   (2011-10-27 16:00) [9]

Так сам тип-то и его размер вполне определен - он же пойнтер..
А на что он там указывает в реалии - это уже из другой оперы и не соответствует желаниям ТС.


в [5] просто реализация нереализуемого буквально желания автора.


 
Очень Злой   (2011-10-27 16:09) [10]

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

Ну я и подумал: вдруг есть такая возможность, что-то типа :

type  TPacket7(n:byte) = packed record
    len:word;
    case byte of
    0: (buf: packed array[0..n*4-1] of byte;);
    1: (fch: packed array[0..n-1] of cardinal);
    2: (typepack:byte;);
    end;

а потом:

procedure ...
var
a:TPacket[7];
begin
...


 
Медвежонок Пятачок ©   (2011-10-27 16:13) [11]

кучу описаний типов записей, что сильно загромождает код

загромозди этими типами пустой модуль mytypes.pas и не парься.


 
sniknik ©   (2011-10-27 16:14) [12]

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


 
Anatoly Podgoretsky ©   (2011-10-27 16:14) [13]

> Очень Злой  (27.10.2011 16:09:10)  [10]

Массив TPacket не определен


 
sniknik ©   (2011-10-27 16:16) [14]

> и больше ничего менять не нужно
в смысле, если в типе стоит array[0..100]; это вовсе не означает что под переменную нужно выделять все 100, можно и 50, но только тогда в 51 элемент "ни ногой"...


 
Очень Злой   (2011-10-27 16:19) [15]


> Медвежонок Пятачок ©   (27.10.11 16:13) [11]
>
> кучу описаний типов записей, что сильно загромождает код
>
> загромозди этими типами пустой модуль mytypes.pas и не парься.
>


Собственно так пока и делал...


> Anatoly Podgoretsky ©   (27.10.11 16:14) [13]
>
> > Очень Злой  (27.10.2011 16:09:10)  [10]
>
> Массив TPacket не определен


Это был не код, а способ показать что мне нужно было.
Но если все говорят что такого способа нет, то получается его действительно нет.


 
Anatoly Podgoretsky ©   (2011-10-27 16:25) [16]

> Очень Злой  (27.10.2011 16:19:15)  [15]

В компиляторах не может быть чего то неизвестного размера, фокусы в расчет
не берем.


 
Очень Злой   (2011-10-27 16:25) [17]


> sniknik ©   (27.10.11 16:14) [12]
>
> > но тогда если нам нужна запись небольшого размера
> выделяй ей памяти ровно столько сколько занимает... сам.
>  и больше ничего менять не нужно. ну еще только следить
> и не вылазить за границу  массивов, проверки/ошибки не будет
> а данные можешь затереть вполне нужные.


> sniknik ©   (27.10.11 16:16) [14]
>
> > и больше ничего менять не нужно
> в смысле, если в типе стоит array[0..100]; это вовсе не
> означает что под переменную нужно выделять все 100, можно
> и 50, но только тогда в 51 элемент "ни ногой"...


Хм. Действительно... Можно будет попробовать так...


 
han_malign   (2011-10-27 17:49) [18]


> но только тогда в 51 элемент "ни ногой"...

- так, к слову...
procedure safe_semantic(const pk: array of byte);
....
with(PPacket1024(p)^)do
   safe_semantic(Slice(buf, len-sizeof(len)));


 
Slym ©   (2011-10-28 09:32) [19]

 TPacket=packed record
   len:word;
   case typepack:byte of
    0: (buf: packed array[0..39] of byte;);
    1: (fch: packed array[0..9] of cardinal);
 end;

 TPacket=packed record
   len:word;
   typepack:byte;
   Data:array[0..0];
 end;
 TDataType7=packed array[0..6] of cardinal);

if Packet.typepack=1 then
 TDataType7(Packet.Data)[1]:=0;


 
Slym ©   (2011-10-28 09:39) [20]

Slym ©   (28.10.11 9:32) [19]
TPacket=packed record
  len:word;
  typepack:byte;
  Data:array[0..0];
end;
TDataType7=packed array[0..6] of cardinal);

if Packet.typepack=1 then
TDataType7(Packet.Data)[1]:=0;

некомпилица

type
 TPacket=packed record
   len:word;
   typepack:byte;
   Data:array[0..0] of byte;
 end;
 TDataType7=packed array[0..6] of cardinal;
var Packet:TPacket;
begin
 if Packet.typepack=1 then
   TDataType7((@Packet.Data)^)[1]:=0;


 
jack128_   (2011-10-28 21:19) [21]


> Очень Злой   (27.10.11 15:29)  

переходи на С++, там такое есть:

template <int Num>
struct Packet
{
short int len;
union
{
 char buf[Num * 4];
 unsigned long fch[Num];
 char typepack;
};
};

int _tmain(int argc, _TCHAR* argv[])
{
Packet<7> p7;
Packet<10> p7;
Packet<1024> p7;
return 0;
}


 
oxffff ©   (2011-10-28 22:32) [22]


> возможность сделать одно описание, а затем при указании
> типа переменной указывать и размерность, но чтобы описание
> записи было одно?


Это называется параметризованные типы.



Страницы: 1 вся ветка

Текущий архив: 2012.02.05;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.007 c
15-1318487112
George
2011-10-13 10:25
2012.02.05
Умер Деннис Ритчи


15-1318624203
Юрий
2011-10-15 00:30
2012.02.05
С днем рождения ! 15 октября 2011 суббота


15-1318859876
lextasy
2011-10-17 17:57
2012.02.05
Посоветуйте учебник по Delphi для школьника


11-1206198913
DJ_UZer
2008-03-22 18:15
2012.02.05
Горячие клавиши


2-1319643106
Abdul
2011-10-26 19:31
2012.02.05
Помогите написать программу на Delphi