Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.003 c
15-1318620676
Rouse_
2011-10-14 23:31
2012.02.05
Хм, задачка...


15-1318487112
George
2011-10-13 10:25
2012.02.05
Умер Деннис Ритчи


2-1319706575
Faceless
2011-10-27 13:09
2012.02.05
Вывод в командную строку (cmd.exe)


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


15-1319033042
Arrant
2011-10-19 18:04
2012.02.05
как создать собственную "очередь сообщений" для DDE сервера?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский