Страница 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
Re: Конструкторы в теле интерфейса
Добавлено: 12 фев 2015, 15:16
Den
интересно, а если собрать 1.vip в саппорте у тебя в "компиляторе интерфейсов", то тоже так ругаться будет..
Re: Конструкторы в теле интерфейса
Добавлено: 12 фев 2015, 15:27
Maverick
аналогично
PS
Миль пардон, компиляция этот кусок нормально хавает, ругается уже дальше на неопр. ф-ии.. Т.е. по факту Саппорт хавает.
Re: Конструкторы в теле интерфейса
Добавлено: 12 фев 2015, 16:10
Maverick
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 - вас ваши логи компиляции не раздражают?