Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2015, 11:48   #11
Masam
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 19
По умолчанию

Для Аватар.
Больше похоже, что он по сети не успевает как бы передать данные, НО у меня код переделывания в массив в клиентской части стоит позже, чем принятия этих данных, т.е. он в любом случае должен исполнять его лишь после принятия данных, но даже если он как то все таки не успел передать, то я ставил задержку Sleep и в 1 сек. и более. Все равно выходит ошибка.

Вот код с серверной части

Код:
//Функция переделывания из массива в TStringList
Function FMatrixStrings(Matrix:DynMas):TStrings;
var
  STemp:string;
  i,j:integer;
begin
 Result:=TStringList.Create;
 Result.Clear;
 for i:=0 to globN-1 do
  begin
  Stemp:='';
   for j:=0 to globJ-1 do
   STemp:=STemp+Matrix[j,i]+'#';
  Result.Add(STemp);
  end;
end;

//Код отправки
//-----------------------------------------------------------------------------
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  MStr:TStrings;
begin
 try
 MStr:=TStringList.Create();

 PGetFileUsed;
 MStr:=FMatrixStrings(Matrix);
 AThread.Connection.WriteStrings(MStr,true);

 PGetUsers;
 MStr:=FMatrixStrings(Matrix);
 AThread.Connection.WriteStrings(MStr,true);
 finally
  FreeAndNil(MStr);
  Finalize(Matrix);
  AThread.Connection.Disconnect;
 end;
end;
Используй кнопку # для оформления кода
Модератор
О_о

Последний раз редактировалось Аватар; 06.08.2015 в 11:58.
Masam вне форума Ответить с цитированием
Старый 06.08.2015, 11:57   #12
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

вариант нового кода
Код:
function fStringsMatrix(list : TStrings; var ret : TUserStrArray) : integer;
var i,l,p : integer;
    S     : string;
begin
  result := list.Count;
  for i:=0 to Length(ret)-1 do
    Finalize(ret[i]);
  Finalize(ret);
  if result=0 then exit;
  SetLength(ret, list.Count);
  mx := 0;
  for i:=0 to list.Count-1 do
  begin
    S:=list.Strings[i]+'#';
    repeat
      p:=Pos('#',S);
      if p>0 then
      begin
        l := Length(ret[i]);
        SetLength(ret[i], l+1);
        ret[i,l] := copy(s,1,p-1);
        system.Delete(s,1,p);
      end;
    until p=0;
  end;
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 06.08.2015 в 21:47.
JUDAS вне форума Ответить с цитированием
Старый 06.08.2015, 11:57   #13
Masam
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 19
По умолчанию

JUDAS
Вы совсем не правильно поняли.

"максимальная длина массива у тебя формируется по первой строке
вопрос, а если вторая строка длинее первой а третья короче второй, что произойдёт?"

У меня не может быть что во второй строчке будет больше или меньше колонок чем в первой или любой другой строчке, они строго фиксированы, количество символов не несомненно будет разное (т.е. в каждой строчке СтрингЛист будет только определенное количество символов "#" - этот знак как раз и показывает заканчивалась ячейка в массиве, дальше после этого знака пошли символы уже другой ячейки массива, но той же строки).

Попробую проще объяснить. Вот смотрите есть две таблицы у каждой таблицы определенное количество столбцов (у каждой таблицы свое определенное количество столбцов), но количество строк не известно, оно очень быстро изменяется. Далее что бы передать эти таблицы от одного компьютера к другому я пользуюсь компонентами инди (idTCPServer и idTCPClient на серверной и клиентской части соответственно), для того что бы передать таблицы в виде массива я их преобразую в СтрингЛист (Типа как по технологии XML таблиц), далее компьютер который принимает он сначала получает естественно СтрингЛисты и он потом их обратно преобразует в массив который выводится в СтрингГрид. Но самое интересное в том, что вся эта конструкция работает как бы сказать в единичных подобных запросах, но как только я пытаюсь сделать что бы он допустим запрашивал эти таблицы раз в 2 сек. и при этом начинаю подключаться к расшарам, выходит эта ошибка. Надеюсь так более понятно изложил.
О_о

Последний раз редактировалось Masam; 06.08.2015 в 12:12.
Masam вне форума Ответить с цитированием
Старый 06.08.2015, 12:01   #14
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

вопросы:
1. число знаков # в строке отличается?
2. имя папки может содержать один или несколько #? (знак допустим для имён)

Попробуйте мой вариант, и вам не нужно будет контролировать размеры, для каждой строки они будут установлены отдельно.
п.с. конструкция array of array это не квадратная матрица из учебника по вышу, а к4аждый из элементов может содержать любое количество ячеек включая 0


вариант кода серверной части
Код:
procedure FMatrixStrings(Matrix:TUserStrArray; var list : TStrings);
var i, j : integer;
    S : string;
begin
 if not Assigned(list) then
    list := TStrings.Create;
 list.Clear;
 for i:=0 to Length(Matrix)-1 do
 begin
   S:=' ';
   for j:=0 to Length(Matrix[i])-1 do
    S:=S+Matrix[i,j]+'#';
   if S[length(S)]='#' then
     delete(S,length(S),1);
   list.Add(Trim(S));
 end;
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 06.08.2015 в 12:06.
JUDAS вне форума Ответить с цитированием
Старый 06.08.2015, 12:28   #15
Masam
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 19
По умолчанию

Для JUDAS
1. Число знаков # в строках не отличаются, в каждой строке их только определенное количество.
2. У нас сервере нету папок в которых есть названия с этим символом.
---------
Пасиба за вашу помощь, завтра проанализирую ваши варианты кода и попробую внедрить, сегодня уже не успеваю.
О_о
Masam вне форума Ответить с цитированием
Старый 06.08.2015, 21:46   #16
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

>
Цитата:
Надеюсь так более понятно изложил.
понятно, в любом раскладе мои функции будут работать без вылетов.
Проблем в изначальном коде в том, что Вы тупо переполняете стек и забиваете память мусором по причине возврата динамического массива в качестве результата функции.
В таких случаях, динамический массив лучше передавать параметром VAR (см. красный текст выше по посту) и чистить на входе в функцию (см.фиолетовый текст выше).
рекомендую чистить не только результирующий двухмерный массив, а и каждый его элемент "минимассивчик"-строчка.

п.с. Когда в 1996 году я начал изучать Паскаль, мне говорил один гуру-программист - "всё что ты в проекте породил, ты должен умножить на ноль".... иначе утечка памяти
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 06.08.2015 в 21:54.
JUDAS вне форума Ответить с цитированием
Старый 07.08.2015, 06:48   #17
Masam
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 19
По умолчанию

JUDAS
Спасибо огромное, получилось! =) Осталось не много переделать, под ваш новый одномерный массив, где каждый элемент дополнительный подмассив. =)

Цитата:
Проблем в изначальном коде в том, что Вы тупо переполняете стек и забиваете память мусором по причине возврата динамического массива в качестве результата функции.
Вот тут я вообще рассчитывал на то, что по завершении функции он переименовывает указатель массива возвращаемой функции на мой массив, т.е. как бы мой массив становится результатом возврата функции, который я очищаю в блоке finally, с помощью функции finalize. Но тут видимо сказывается моя неопытность с работой указателей.
О_о
Masam вне форума Ответить с цитированием
Старый 07.08.2015, 11:06   #18
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Причина не в неопытности, а в не в правильном пути при выборе технологии.
Ещё в конце 90-х опытные дяди программисты меня учили - "старайся создавать такие функции, чтобы размер памяти в результате не превышал 8 байт".
Когда я написал первую функцию которая возвращает динамический массив трёхмерных точек в result, и во время работы появлялась плавающая ошибка а при длительной out of memory, я вспомнил слова того "дядьки" и переделал функцию из такого вида
Код:
type
  TMyType = array of XXX;
function return():TMyType;
в такой
Код:
function return(var ret :TMyType): integer
а в качестве строкового параметра на входе функции использую
или
const XXX : string;
или
var XXX:string;

и никогда не использую
XXX:string;

п.с. string Это тоже ..как бы.. встроенный динамический массив
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 07.08.2015, 11:35   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
п.с. string Это тоже ..как бы.. встроенный динамический массив
со строками так не надо все же.
они хоть и массив в сути, но работают иначе, они всегда в куче, и никогда не на стеке(не путаем с ShortString), передаются по ссылке и копируются по необходимости.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.08.2015, 12:03   #20
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
со строками так не надо все же.
они хоть и массив в сути, но работают иначе, они всегда в куче, и никогда не на стеке(не путаем с ShortString), передаются по ссылке и копируются по необходимости.
Пепел Феникса. я тебе поясню два своих варианта передачи строки, а ты поясни мне тритий

вариант 1 function XXX(const value : string):integer;
передача строки в качестве константы, которая не изменяется внутри функции. Параметр принимается, на основании информации передаваемой value выполняются какие то операции и формируется результат

вариант 2 function XXX(var value : string):integer;
передача строки в качестве переменной, которая может изменяться внутри функции. Параметр принимается, со строкой могут выполнятся какие то манипуляции вплоть до очистки, формируется какой то результат

вариант 3 function XXX(value : string):integer; ???
цель и функции такого описания
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при создании матрицы (access violation) Svejk Помощь студентам 3 24.08.2013 14:30
Ошибка при вызове функции Access violation Hottabych Win Api 1 22.01.2011 20:35
TList. Ошибка Access Violation при создании. thexqn Помощь студентам 3 28.11.2010 21:01