Страница 1 из 2

Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 11:41
Maverick
Коллеги, приветствую!
Столкнулся с такой проблемой (8.10)
Есть описание прототипа в VIH, в нем же - объявлены конструктор и деструктор.
В VIP дано их описание, через include естественно цепляется этот VIH.
VIP компилируется естественно через файл проекта директивой make, строчником. Версия компилера 5.4.44.
При компиляции вылетает ошибка "Конструктор должен быть описан в в прототипе", со ссылкой на строку где в VIP собственно и описывается конструктор.

У кого есть лекарство от этой беды? Или здравые идеи? У самого есть подозрение, что пропустил какой-то системный define.

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 11:56
Den
Предположу, что конструктор описан в ObjInterface а нужно в Vipinterface

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 12:07
Maverick
Нет, все корректно.
В Obj описаны ф-ии, в VipInterface который implement от Obj через паблик объявлено

Код: Выделить всё

Public:
    Constructor Init;
    Destructor  Done;
End;
Само описание конструктора и деструктора - непосредственно уже в теле Interface

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 12:17
Den
Собрал у себя на 8,10 посредством 5,4,44, небольшой примерчик. все ок без ошибок собирается.

1.vih

Код: Выделить всё

ObjInterface ObjProtocolSap;  
  Procedure InitAct(p : string);
end;

Vipinterface ProtocolSap implements ObjProtocolSap;
public:
  Constructor InitP(pTune: string);
end;

1.vip

Код: Выделить всё

#include 1.vih

Interface ProtocolSap;
  var path: string;

  procedure InitAct(p: string);
  {
   Message(Path);
  }

  constructor InitP(pTune : string);
  {
    Path := PTune;
    Message(Path);
    Result := true;
  }
end.

Interface GetListFile;
 var infprot: ProtocolSap noauto;

  HandleEvent
    CmInit: {
      infprot := new(ProtocolSap,InitP('c:\debug'));
      infprot.InitAct('Maverick');
    }
 end;
end.

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 12:28
Maverick
Значит проблема все-таки по-видимому в каких-то define - пытаюсь отдельно пересобрать кусок последнего патча F_PAT в части деклараций. Полдня вчера убил.
Ладно, буду еще разбираться

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 15:02
Maverick
Все равно, чушь какая-то...
Поотключал все что можно...
В итоге имеЮ:

1.vih

Код: Выделить всё

ObjInterface ieXML;  

  Function GetStLastError : string;
  Function CreateDoc : LongInt;
  Function CreateNode(
    _xmlDoc : LongInt;  // ID xml документа
    _Parent : LongInt;  // ID родителя
    _sName  : string    // имя вершины
  ) : LongInt;
  Function CreateText(
    _xmlDoc : LongInt;  // ID xml документа
    _Parent : LongInt;  // ID родителя
    _sName  : string;   // имя вершины
    _sData  : string    // значение вершины
  ) : boolean;
  Function GetTextValue(
    _xmlNode : LongInt  // ID вершины
  ) : string;

End; 
VipInterface eXML implements ieXML;
Public: 
    Constructor Init;
    Destructor Done;
End;
1.vip (описание функций в интере опустил)

Код: Выделить всё

#include 1.Vih
Interface eXML '' (,,);
Var sLastError : string;
Constructor Init;
{
  Result := False;
  FpLogInit;
  Result := True;
}

Destructor Done;
{
  FpLogDone;
}

End. 




Компилирую уже без всяких define, в итоге получаю

Ошибка: Конструкторы и деструкторы должны быть описаны в прототипе VIP-интерфейса (стр.4, поз.17 в SOURCE\1.Vip)
│ Constructor Init;
│ ^

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 15:13
Den
у меня ок собрался твой пример

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 15:16
Maverick
мдя.... все страньше и страньше...
на всякий случай:
compile.bat

Код: Выделить всё

set VIPPATH=D:\GAL810
set ATLANTIS=D:\Atlantis
set iProject=.
set SOURCE=D:\GalSrc810
@echo ***!!!!!!!!!!***
%VIPPATH%\EXE\vip.exe /c=%iProject%\vip.cfg %iProject%\f_pat.prj
f_pat.prj

Код: Выделить всё

#make "Source\1.vip"

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 15:16
Den
интересно, а если собрать 1.vip в саппорте у тебя в "компиляторе интерфейсов", то тоже так ругаться будет..

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 15:27
Maverick
аналогично

PS
Миль пардон, компиляция этот кусок нормально хавает, ругается уже дальше на неопр. ф-ии.. Т.е. по факту Саппорт хавает.

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 16:10
Maverick
:-x :-x :-x :-x :-x :-x :-x ;-) :?: *MOBILA* SOS!!!

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 16:35
Den
Упростить настройки проекта сборки вообще по минимуму. Убрать все лишнее из vip.cfg.

в какой нить новой папке сделать батник 1.bat:
C:\gal810\exe\vip.exe %1 /c:C:\gal810\vip.cfg

и собрать с командной строки 1.bat 1.vip

А так может в .\exe еще хрень какая то.
скинуть может куда нить твой каталог exe и попробовал бы я с ним собрать.
Ну там явно что то где то у тебя проблемы а не галактики

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 18:41
Maverick
не помогло.
кфг - минимальный, только /I+ и пути прописаны.
в проекте только make.

Все равно та же бредятина... Впроу биться головой о чугунивые батареи...

Re: Конструкторы в теле интерфейса

Добавлено: 12 фев 2015, 21:35
Maverick
Так, причину вроде бы нашел, но как устранить - пока не знаю.
Дело в том что в VIH перед объявлением ObjInterface описываются типы данных а-ля

Код: Выделить всё

Type TXmlAttrValue = record
  Name : string;
  Value: string;
End;
Type TXmlAttrValueList = Array[0..0] of TXmlAttrValue;
А в самом Obj - объявляется ряд функций, использующих данный тип или являющихся функциями данного типа.

Код: Выделить всё

ObjInterface ieXML;  

  Function GetStLastError : TXmlAttrValueList;
  Function CreateDoc : LongInt;
  Function CreateNode(
    _xmlDoc : LongInt;  // ID xml документа
    _Parent : LongInt;  // ID родителя
    _sName  : string    // имя вершины
  ) : LongInt;
  Function CreateText(
    _xmlDoc : LongInt;  // ID xml документа
    _Parent : LongInt;  // ID родителя
    _sName  : string;   // имя вершины
    _sData  : string    // значение вершины
  ) : boolean;
  Function GetTextValue(
    _xmlNode : LongInt  // ID вершины
  ) : string;

End; 
VipInterface eXML implements ieXML;
Public: 
    Constructor Init;
    Destructor Done;
End;
Если снести описание типов и закомментить использующие их ф-ии - все компилится ОК без ошибок.
Попытка же вынести описание типов в отдельный inc и подключить сначала на уровне VIH, а потом на уровне файла проекта опять приводит к ошибке, описанной в пред. постах.

Возможно я упустил какую-то директиву компилера? Честно говоря, пока теряюсь в догадках...

Re: Конструкторы в теле интерфейса

Добавлено: 13 фев 2015, 10:26
edward_K
Сдается мне, что ваш фейс не видит в какую компоненту у вас vih собрался. Укажите явно компоненту и там и там.
Да и чего то в вашей vih не хватает - как правило там куча ifndef - чтобы повторно не компильнуть. С виду все нормуль. Посмтрел специально в 810 - полно там таких vih. Ну еще не мешало бы добавлять licensed(free) в строку VipInterFace - вас ваши логи компиляции не раздражают?