-
Добрый день
Помогите решить таккую задачу: Необходимо передать по сети (IdTCPClient/IdTCPServer) запись с данными типа
TResultArray = array of array of String;
TResultData = Record
IDClient : string[50];
IDCmd : string[50];
StatCmd : string[50];
DeepArr : string[10];
DataArray: TResultArray;
end;
Подскажите как это можно сделать, заранее благодарен.
-
> как это можно сделать
для начала преобразовать динамический массив TResultArray во что то более удобоваримое в одномерный массив например, и не указателем, а чтобы "пристыковывался", например -
TResultData = Record
IDClient : string[50];
IDCmd : string[50];
StatCmd : string[50];
DeepArr : string[10];
DataLen: integer;
DataArray: array[0..0] of char; //или DataArray: array[word] of char; другая крайность...
end;
но в любом случае за выделением памяти/превышением границ придется следить самому
-
Передавать указатели бессмысленно.
-
> TResultData = Record IDClient : string[50]; IDCmd :
> string[50]; StatCmd : string[50]; DeepArr : string[10];
> DataArray: TResultArray; end;
ИМХО, бред...
-
По логике создай запись типа:
PodMassiv=Record
Index:cardinal;//здесь по выбору!!!
Data:String;
End;
В индекс указываешь индекс 1-го массива строк, потом 2-го и т.д.
А на принимающей стороне создаешь по приходу данных заново такой же массив!
Только не забудь указывать длину пересылаемой строки!!!
Да и еще проще бы было, указать чего передавать собираешься, может все можно было-бы на много проще придумать... ;)
-
> FireMan_Alexey (06.06.2011 13:50:04) [4]
Data такой же указатель.
-
> Да и еще проще бы было, указать чего передавать собираешься, может все можно было-бы на много проще придумать... ;)
но было бы не так интересно...
> ИМХО, бред...
не совсем бред, рекорд иногда удобен, просто у него непонимание что такое указатель...
но тут было бы конечно проще если всю структуру представить 1 строкой с каким нибудь разделителем (например #13#10) тогда бы и переменная длинна была, и следить за ней не нужно было. просто с одной стороны "разложил" с другой "сложил" по разделителям, и все (а взять стринглист так и "раскладка/складка" автоматизируется).
-
> не совсем бред, рекорд иногда удобен, просто у него непонимание
> что такое указатель...
А я не про рекорд, я про то, что внутри, т.е. непосредственно про этот рекорд
-
> я про то, что внутри
внутри все нормально, кроме последнего указателя.
-
> но тут было бы конечно проще если всю структуру представить
> 1 строкой с каким нибудь разделителем (например #13#10)
да и рекорд нормально. Парсить ничего не надо
-
> IDClient : string[50]
Правда ID на 50 чаров?
-
> Парсить ничего не надо
строку тоже, если в стринглист, только что адресоваться по позиционно придется а не именовано, не всем/всегда удобно.
> Правда ID на 50 чаров?
вполне. все от специфики зависит. и больше были.
-
> ID на 50 чаров
сильно уникальный клиент )
-
> и больше были.
к примеру был составной идентификатор определяющий "офис + магазин + отдел + касса + смена + чек + позиция", кто то когда то выбрал гуиды (вроде для репликации чтобы части друг от друга не зависели), гуид в строке (именно так передает программа) = 36 символов + символ разделителя ";" (х.з. зачем, может из csv выгрузки берут).
посчитай сам какая длинна получается.
большего не было...
-
> сильно уникальный клиент )
и не только клиент уникальный...
> вполне. все от специфики зависит. и больше были.
верю что может, но не верю что здесь...
-
> sniknik © (07.06.11 12:47) [13]
Логично продолжить:
> IDCmd : string[50];
что-то вроде "kassir_poshel_na_obed_kassa_ne_rabotaet"
-
> > IDClient : string[50]Правда ID на 50 чаров?
Нет, это тестовый код.
-
Основная задача была передать указанные данные, мне показалось что в такой организации данных хранить их удобнее, если есть более удобные варианты для передачи то подскажите.
Не понятна чем плоха сама Запись.
TResultData = Record
IDClient : string[50];
IDCmd : string[50];
StatCmd : string[50];
DeepArr : string[10];
DataArray: array of array of String;
end;
Применение: с сервера поступет команда клиенту с кодом комманды IDCmd, клиент обрабатывет команду, формирует данные с указанием кода клиента IDClient , кода самой команды IDCmd, статуса StatCmd (Удачно-Неудачно), DeepArr - глубина массива полученных данных, и собственно сами полученные данные записанные в массив. И вот это все нужно передать.
-
я бы передавал не рекорды, а строку с xml.
например стало мне мало string[50].
сделал на клиенте стринг[255] и все.
сервер остался как есть и принимает уже не 50 буков, а все 255.
-
>Медвежонок Пятачок ©
Тут принцип, так чтобы всЁ/всЕ за тебя думало/и а ты запихнул запись с этой стороны и принял с той!
Парсить никто не хочет!!!!
>Archangel_x
Еще раз по русски!
0. Многомерный массив N на M =Одномерному массиву длиной N*M;
1. Создаешь заголовок, можешь как у тебя со строками или с цифровыми значениями это уже твое дело!!!!!
2. Добавляешь размерность массива перед отсылкой в заголовок!!!
3. Посылаешь в начале длину строки элемента твоего массива, а затем за ней саму строку или формируешь массив в котором между твоих строк есть разделители типа #0 как в ASCIZ строках!
4. С принимающей стороны получаешь заголовок!
5. Формируешь свой дин. массив по размерности в заголовке
6. Парсишь входные данные и заполняешь свой массив!!!!!!!!
Увы без разбора, чего пришло тебе никак не написать этот код нормально!