Очередная "Загадочная ошибка" ...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Очередная "Загадочная ошибка" ...

Сообщение zub » 13.07.2017 16:10:02

>>Но ты по моему просто не "вник" ...
Я вникать не собираюсь. И другим не советую - нечего поощрять чужую лень.
Минимальный пример - почти всегда это уже решение проблемы, как минимум она перестанет быть загадочной и станет элементарной
zub
долгожитель
 
Сообщения: 2134
Зарегистрирован: 14.11.2005 23:51:26

Re: Очередная "Загадочная ошибка" ...

Сообщение pupsik » 13.07.2017 16:17:50

zub вы ещё не привыкли к загадкам алекса? :lol:
pupsik
энтузиаст
 
Сообщения: 991
Зарегистрирован: 20.08.2014 16:20:13

Re: Очередная "Загадочная ошибка" ...

Сообщение Лекс Айрин » 13.07.2017 16:26:59

pupsik, а надо?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3924
Зарегистрирован: 19.02.2013 16:54:51

Re: Очередная "Загадочная ошибка" ...

Сообщение pupsik » 13.07.2017 17:01:33

В принципе идея с VT интересна. Стащил пробник из демок VT, подправил (для интереса).... Хм... запустилось и без руганья (демка VT). Так что... алекс или перемудрил, или не ... в общем: zub прав по поводу теста.

Из ссылки "о рыбе" вскользя посмотрел... чёт не охото ковырять в наброске.

п.с.
Лекс Айрин дело вкуса.
pupsik
энтузиаст
 
Сообщения: 991
Зарегистрирован: 20.08.2014 16:20:13

Re: Очередная "Загадочная ошибка" ...

Сообщение Лекс Айрин » 13.07.2017 17:21:31

pupsik,знаешь, а ведь я реально несколько раз пытался готовить минимальный пример и находил таки ошибку.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3924
Зарегистрирован: 19.02.2013 16:54:51

Re: Очередная "Загадочная ошибка" ...

Сообщение pupsik » 13.07.2017 18:22:49

я реально несколько раз пытался готовить минимальный пример
сделали, мордой ткнули, убедили. А так: есть бубен... он помогает ВСЕМ.
pupsik
энтузиаст
 
Сообщения: 991
Зарегистрирован: 20.08.2014 16:20:13

Re: Очередная "Загадочная ошибка" ...

Сообщение Лекс Айрин » 13.07.2017 19:05:37

pupsik, бубен это слишком суровый способ... я тут недели две переделывал свой старый код, который до этого работал... и у меня волосы дыбом вставали... а у меня только хвост где-то 30см длинной...в общем, ирокез еще тот))) Перепутанный порядок присваиваний это только самое простое. Пришлось учиться пользоваться отладчиком(( А в одном месте я вообще очищал все и до сих пор удивляюсь как это работало.

А со ссылками вообще надо сразу на ежиках пробовать, замыкать код работающий со ссылками в отдельные объекты и проверять каждый шаг по три раза.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3924
Зарегистрирован: 19.02.2013 16:54:51

Re: Очередная "Загадочная ошибка" ...

Сообщение pupsik » 13.07.2017 19:21:36

" я тут недели две переделывал свой старый код" - и кто в сим доктор?

п.с.
и до сих пор удивляюсь как это работало.
:mrgreen:
pupsik
энтузиаст
 
Сообщения: 991
Зарегистрирован: 20.08.2014 16:20:13

Re: Очередная "Загадочная ошибка" ...

Сообщение Лекс Айрин » 13.07.2017 19:28:20

упс... имеется ввиду две недели назад. Хотя я пишу медленно, так что и так тоже верно)))
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 3924
Зарегистрирован: 19.02.2013 16:54:51

Re: Очередная "Загадочная ошибка" ...

Сообщение Alex2013 » 13.07.2017 22:09:58

В общем это "неправильные пчелы и они делают неправильный мед" .... :roll: :wink:

1 Минимальный пример Без VT работает И так И ЭДАК !
То есть весь гон на NewStr( ...); и DisposeStr(...); идет лесом полем ...

Код: Выделить всё
unit CT_u1;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

  TLCLTextData = record
    T1: PString;
    T2: PString;
    DT : Integer;
  end;
  PLCLTextData = ^TLCLTextData;



var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
Function inputStr(Q,D:String;W:Integer):String;
Var
L,l1,l2:TLabel;
E:TEdit;
B:TButton;
rF:Tform;
begin
rF:=Tform.Create( Application);
begin
L:=TLabel.Create(rf);
l.Caption:=Q; L.Align:=alTop;
  L1:=TLabel.Create(rf);
l1.Caption:='Название'; L1.Align:=alTop;
  L2:=TLabel.Create(rf);
l2.Caption:='Значение'; L2.Align:=alTop;

E:=TEdit.Create(rf);
E.Text:=D;
E.Align:=alTop;

B:=TButton.Create(rf);
b.Align:=alTop;
B.Caption:='Ok';
B.ModalResult:=mrOk;
rf.InsertControl(b);
rf.InsertControl(e);
rf.InsertControl(l2);
rf.InsertControl(l);
rf.InsertControl(l1);
end;
rF.Top:=top+20;
rf.Left:=Left+10;
rF.Width:=W;
rF.Height :=100;
l.Caption:=Q;
if  rF.ShowModal=mrOk then
  inputStr:=e.text else inputStr:=D;
rF.Free;
end ;
var
Data: PLCLTextData;
S,S1,s2:String;
PS:PString;

begin
Data:=GetMem(SizeOf(TLCLTextData));

Data^.T1:=NewStr('Вес в МТ');  Data^.T2:=NewStr('00000');
PS:= Data^.T2 ;S:=Data^.T1^;
if PS<>Nil then S1:=PS^ else S1:='' ;// Тут ясное дело проверка не нужна но для чистоты эксперимента  пусть будет ...
DisposeStr(PS);PS:=Nil;
S2:=InputStr(S,s1,220);
Data^.T2 :=   NewStr(S2); //DisposeStr(PS);
Label1.Caption:=Data^.T2^;
FreeMem(Data);
end;

end.


2 Ошибка вылезает ВНУТРИ кода VT (и не спрашивайте меня как она вылезла в inputStr )....

3 Идея в том что сделал хомут в при добавлении новых элементов ....
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
Node: PVirtualNode;
Data: PLCLTextData;
begin
  With VST3 do
begin
  NodeDataSize := SizeOf(TLCLTextData);
  Node :=  AddChild(nil  );
  Data := GetNodeData(Node);
Data^.T1:=NewStr('Вес в МТ');  Data^.T2:=NewStr('00000');
//ValidateNode(Node, False); // понятия не имею нужна ли это строка но что с ней что без нее.. результат тот-же . :idea:
end;
end;

в попытке "сделать правильно" пытался добавить ручное выделение памяти
Node := AddChild(nil ,getMem(SizeOf(TLCLTextData)) );
но разницы нет....
4 Ковыряй код AddChild я нигде не нашел getMem или что-то подобное ... :shock:
(Такое впечатление что VT как то кучей самостоятельно рулит ... или делает это неизвестным мне способом )

5 В примерах вообще просто RootCount увеличивают ...
Короче чем глубже влез тем дальше "вылез" .. :wink:

Зы
Если кто не понял вопрос в НАДЕЖНОСТИ эмпирически найденного решения .
Пока работает но что если это "стечение глюков и удачное состояние фазы луны" :?:
Зы Зы
Гм вроде не так все и плохо как я подумал ... В примерах на wiki.lazarus.freepascal.org
http://wiki.lazarus.freepascal.org/Virt ... or_Lazarus
вроде делают что-то похожее на мои каракули ... :idea:
Alex2013
энтузиаст
 
Сообщения: 664
Зарегистрирован: 03.04.2013 11:59:44

Re: Очередная "Загадочная ошибка" ...

Сообщение daesher » 13.07.2017 23:02:15

Alex2013 писал(а):Или я что-то не понял ....Или вы хотите сказать что S1:=PS^ передает не данные, а УКАЗАТЕЛЬ ? Но это же бред какой-то ...

Давайте рассмотрим аналогию. Вы можете ехать на своей машине сами (аналог - вручную расправляться с указателями), либо нанять профессионального водителя, которому надо только сказать, откуда ехать и куда. Вы же наняли водителя и командуете ему периодически под руку "нажми тормоз", "отпусти сцепление". Нет, конечно, хозяин - барин, но он привык водить иначе, так что, выполняя не всегда своевременные указания, можно и в ДТП попасть.
Можно разобрать поподробнее.
Все данные в Паскале могут быть статическими и динамическими. Статические хранятся сразу ясно где, это определено ещё при компиляции, динамические - там, где на них найдётся место (и это место надо выделять и освобождать). Можно делать это вручную - и добро пожаловать в систему указателей, можно - выбрать специальные типы данных (строки - кроме ShortString, динамические массивы, классы), и компилятор вставит код, который автоматически выделит память, скопирует, освободит ненужное (особенно для строк). Копируя строку, Вы поручаете компилятору решить самому, когда скопировать только указатель, а когда - создать совершенно новую строку (наверно, перед тем, как Вы измените одну из "копий"). Но рассчитывать, что здесь у Вас будет копия указателя, а там - копия строки - не стоит, как не стоит рассчитывать, что перед данным поворотом данный профессиональный водитель нажал сцепление. Общее правило: нужны указатели - работайте с PChar, хотите удобства и строк - используйте тип String и забудьте о выделении/освобождении памяти. Можно переходить от одного к другому, но работать с каждым из них надо отдельно. Получили PChar(String) - скопируйте строку куда-то, а уж потом освобождайте по ненадобности.
daesher
постоялец
 
Сообщения: 183
Зарегистрирован: 09.03.2010 22:17:14

Re: Очередная "Загадочная ошибка" ...

Сообщение LearnMagic » 14.07.2017 00:37:15

Alex2013 писал(а):... В примерах на wiki.lazarus.freepascal.org вроде делают что-то похожее на мои каракули...

Принципиальные отличия:

TTreeData = record
Column0: String;
Column1: String;
Column2: String;
end;

Код: Выделить всё
procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Data: PTreeData;
begin
  Data := VST.GetNodeData(Node);
  if Assigned(Data) then begin
    Data^.Column0 := '';
    Data^.Column1 := '';
    Data^.Column2 := '';
  end;
end;


Data^.Column0 := ''; - освобождение памяти занимаемой строками
LearnMagic
новенький
 
Сообщения: 21
Зарегистрирован: 10.11.2016 23:13:38

Re: Очередная "Загадочная ошибка" ...

Сообщение zub » 14.07.2017 01:11:46

Примера нет...

1.Доступные компилятору локальные стринг переменные автоматически инициализируются и финализируются.
2."Размножение" стринг переменных "указателями" не вызывает увеличения их refcount

Вангую что ты сначала делаешь 2, а потом компилятор делает 1 и у тебя на руках остается дохлый указатель при попытке разименования которого в дальнейшем всё валится
zub
долгожитель
 
Сообщения: 2134
Зарегистрирован: 14.11.2005 23:51:26

Re: Очередная "Загадочная ошибка" ...

Сообщение Alex2013 » 14.07.2017 02:06:22

"Зубы чистили ?" :D рискую совсем занудой стать .... но уже писал !
:arrow: viewtopic.php?p=123838#p123838
Третий вариант тестового проекта ...
Там все было так же кроме Assigned(Data) ну не догадался я самостоятельно что это важно ...
В примерах что идут поставке такого не обнаружили .
Код: Выделить всё
procedure TForm1.VST3FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: PLCLTextData;
begin
  Data := Sender.GetNodeData(Node);
  Data^.T1 := '';
  Data^.T2 := '';
end;


Потом сделал так
Код: Выделить всё
procedure TForm1.VST3FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: PLCLTextData;
begin
  Data := Sender.GetNodeData(Node);
      DisposeStr(Data^.T1);
      DisposeStr(Data^.T2);
end;


Пример есть просто он не сработал я думал, что VT там совсем не причем ... оказалось иначе . :idea:

Ладно ухожу собирать очередное исследование по примерам в вике ....(Жль их сразу не обнаружил )
Alex2013
энтузиаст
 
Сообщения: 664
Зарегистрирован: 03.04.2013 11:59:44

Re: Очередная "Загадочная ошибка" ...

Сообщение zub » 14.07.2017 02:36:49

Alex2013 хорэ замусоривать интернет
zub
долгожитель
 
Сообщения: 2134
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru
cron