-
Добрый день
Помогите решить таккую задачу: Необходимо передать по сети (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. Парсишь входные данные и заполняешь свой массив!!!!!!!!
Увы без разбора, чего пришло тебе никак не написать этот код нормально!
-
парсить никому и не надо. парсит xml документ
-
Не понятна чем плоха сама Запись.
тем плоха, что последнее поле придется передавать в несколько вызовов.
и принимать в несколько вызовов.
вместо одного единственного в случае xml.
-
> Парсить никто не хочет!!!!
так парсить xml и не нужно (противопоказано), для этого есть IDOMдокумент... а от "велосипедных парсеров" одни только проблемы.
кстати предлагаемый выше вариант с разделителем из переноса строки тоже парсить не обязательно, стринглист с этим прекрасно справится сам.
в общем не выдумывай сам себе "страшилок".
-
в общем убрать рекорд нафик и с сервера и с клиента.
на клиенте сразу заполнять xml документ.
передавать на сервер одним вызовом свойство xml
на сервере принимать строку целиком и делать loadxml.
а про весь этот онанизм с рекордами забыть.
-
json еще можно
-
> статуса StatCmd (Удачно-Неудачно)
И за каким вот 50 чаров тут, когда даже байта много?
-
-
хммм... мне вот интересен сам механизм передачи в инди - можно пример кода с использованием индейцев, а то у меня тоже тут залет вышел изза сокетов. отказаться пришлось.
-
> у меня тоже тут залет вышел изза сокетов
Наверно не предохранялся ..
-
презервативы отменили?
-
Странно что в теме слова rtti еще не прозвучало.
-
Не слушай их, они плохому научат! Прасить, не парсить, XML, не XML... фигня всё! Сохрани запись в файл, заархивируй и отправь по почте! Работает 100%, проверено!
-
> Передача записи (Record) с данными посети
Да и вообще что это за "посеть" такая, ты у неё разрешение спрашивал чтобы её данные куда-то передавать? Или ты ей данные передать хочешь? А они ей нужны? Посеть она, капризная.
-
некрофилы?