Форум: "Начинающим";
Текущий архив: 2012.02.05;
Скачать: [xml.tar.bz2];
ВнизМожно ли описать запись неизвестного заранее размера Найти похожие ветки
← →
Очень Злой (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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.004 c