|
Вопрос # 5 550/ вопрос решён / |
|
internal error C1624
Привет, камрады.
Проблема абсолютно мне непонятна, может вы подскажете - в чем тут дело.
type
array_of_const = array of TVarRec;
function _(anArgs: array of const) : array_of_const; overload;
var
I : WORD;
Index : WORD;
Length : WORD;
begin
Length := 0;
if ( High (anArgs) >= 0 ) then
Length := Length + High (anArgs) - Low (anArgs) +1;
if ( Length > 0 ) then
begin
SetLength (Result,Length);
Index := 0;
for I := Low (anArgs) to High (anArgs) do
begin
Result [Index] := anArgs [I];
Inc (Index);
end;
end;
end;
function _(anArgs1, anArgs2: array of const) : array_of_const; overload;
var
I : WORD;
Index : WORD;
Length : WORD;
begin
Result := _([]);
try
Length := 0;
if ( High (anArgs1) >= 0 ) then
Length := Length + High (anArgs1) - Low (anArgs1) +1;
if ( High (anArgs2) >= 0 ) then
Length := Length + High (anArgs2) - Low (anArgs2) +1;
if ( Length > 0 ) then
begin
SetLength (Result,Length);
Index := 0;
if ( High (anArgs1) >= 0 ) then
for I := Low (anArgs1) to High (anArgs1) do
begin
Result [Index] := anArgs1 [I];
Inc (Index);
end;
if ( High (anArgs2) >= 0 ) then
for I := Low (anArgs2) to High (anArgs2) do
begin
Result [Index] := anArgs2 [I];
Inc (Index);
end;
end;
except
Result := _([]);
end;
end;
//...
class function TRandomTestDialog.Open (anArgs: array of const;
var aRandomType: String) : Integer;
begin
try
with Create ( _([aRandomType],anArgs) ) do
try
GetData ( _([aRandomType],anArgs) );
Result := ShowModal;
if ( Result = mrOk ) then
aRandomType := RandomType;
finally
Free;
end;
except on E: Exception do
_raise (['Open',ERR_TPROTODIALOG_OPEN,E],
['{E2281D16-502F-414B-BABF-B6A4F6B27864}']);
end;
end;
вот в этой строчке with Create ( _([aRandomType],anArgs) ) do
компилятор дает internal error C1624
если сделать локалюную переменную:
class function TRandomTestDialog.Open (anArgs: array of const;
var aRandomType: String) : Integer;
var
S : String;
begin
try
S := aRandomType; // internal error C1624 without this
with Create ( _([S],anArgs) ) do
try
GetData ( _([S],anArgs) );
Result := ShowModal;
if ( Result = mrOk ) then
aRandomType := RandomType;
finally
Free;
end;
except on E: Exception do
_raise (['Open',ERR_TPROTODIALOG_OPEN,E],
['{E2281D16-502F-414B-BABF-B6A4F6B27864}']);
end;
end;
ошибка исчезнет.
в чем загвоздка?
Примечание #1 (2 августа 2011, 16:27): p.s.
конструктор и метод GetData объявлены как:
constructor Create (anArgs: array of const); overload; virtual;
procedure GetData (anArgs: array of const); overload; virtual;
 |
Вопрос задал: mirt.steelwater (статус: Посетитель)
Вопрос отправлен: 2 августа 2011, 16:23
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 13; последнее сообщение — 5 августа 2011, 01:17; участников в обсуждении: 5.
|
min@y™ (статус: Доктор наук), 2 августа 2011, 16:39 [#1]:
Сюды смотрел?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 2 августа 2011, 16:42 [#2]:
Поименовать функцию "_" - это мощно! Даже наши старые пердуны себе такого не позволяют.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
mirt.steelwater (статус: Посетитель), 2 августа 2011, 17:04 [#3]:
туда смотрел. собственно, я и последовал рекомендациям QC и создал local variable, но почему это происходит - я не понял.
Поименовать функцию "_" - это мощно!
Да! Первая функция - это псевдоним, обертка. т.е. чтобы можно было присваивать значение массива констант:
var
arr: array_of_const;
begin
arr := _([1,'2',TRUE,TObject]); // собственно для такого случая
end;
вторая функция называется также, т.к. это merge, объединения массивов, но несет все ту же функциональность - псевдонимизацию объединения двух массивов в один.
var
arr: array_of_const;
begin
arr := _([1,'2',TRUE,TObject]);
arr := _(arr,[3,'4']);
end;
Ⓐ свобода сопротивление солидарность
|
|
min@y™ (статус: Доктор наук), 2 августа 2011, 17:35 [#4]:
А имя функции-то почему такое? Фантазии не хватило?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
mirt.steelwater (статус: Посетитель), 2 августа 2011, 17:53 [#5]:
ну что ж не понятно то? это псевдоним. используется посеместно, смысловой нагрузки не несет, должен быть максимально коротким и минимально заметным!
Ⓐ свобода сопротивление солидарность
|
|
mirt.steelwater (статус: Посетитель), 2 августа 2011, 17:57 [#6]:
так все таки - что такое internal error C1624 и почему он вылазит??
Ⓐ свобода сопротивление солидарность
|
|
min@y™ (статус: Доктор наук), 2 августа 2011, 19:32 [#7]:
Цитата (mirt.steelwater):
так все таки - что такое internal error C1624 и почему он вылазит??
Кроме самих разработчиков компилятора тебе про это никто не расскажет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DNK (статус: Студент), 2 августа 2011, 19:44 [#8]:
Одно время тоже столкнулся с внутренней ошибкой. Избавился переписав алгоритм другим способом.
"Digital Networked Knight"
|
|
Вадим К (статус: Академик), 3 августа 2011, 11:04 [#9]:
Часто и разработчики компилятора ничего не скажут. На моей практике такие ошибки возникали. Часто. Обычно это значит, что в коде что то такое, что компилятор/линковщик не может переварить. То есть, компилятор чувствует, что в коде есть бяка, но он не знает как ее назвать. Например в ранних версиях делфи такое было, если попытаться с помощью goto запрыгнуть внутрь цикла.
Поэтому обычно лучше просто переписать код.
P.S. имя в виде _ все таки плохое. Я, например, пытался глазами найти имя и сразу не получалось . Я знаю только одну библиотеку, которая использует такое имя (одна библиотека для локализации).
Галочка "подтверждения прочтения" - вселенское зло.
|
3 августа 2011, 13:53: Статус вопроса изменён на решённый (изменил автор вопроса — mirt.steelwater): ок. как я уже гоорил, метод решения я нашел интуитивно, прочитав другие случаи с этой ошибкой на QC. Обидно, что компилятор тупит и недает вставить var в array of const 
всем спасибо
|
bugmenot (статус: 3-ий класс), 3 августа 2011, 14:34 [#10]:
компилятор как бы говорит нам "этот код - жесть, не хотеть!"
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
bugmenot (статус: 3-ий класс), 3 августа 2011, 16:17 [#11]:
Забери плюс обратно, я не шутил :-D
Одно "подбрасываение" исключения чего стоит, и гуид в строку.
А в проблемном коде var строка непонятно зачем.
Ссылкота на почитать
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
mirt.steelwater (статус: Посетитель), 4 августа 2011, 21:02 [#12]:
подбрасывание???
гуид в строку нужен для того, чтобы затем можно было найти это место в любой версии программы (assert нам такого не даст - номера строк сместятся). var затем, что aRandomType - это резултат выполнения диалога. по умолчанию можно установить любое значение при вызове диалога, потому и var, а не out
Ⓐ свобода сопротивление солидарность
|
|
bugmenot (статус: 3-ий класс), 5 августа 2011, 01:17 [#13]:
Цитата (mirt.steelwater):
подбрасывание?
То, что ты делаешь называется "подбрасывание исключения"
Цитата (mirt.steelwater):
гуид в строку нужен
гуид - структура, не строка, незачем преобразовывать туда-сюда.
Цитата (mirt.steelwater):
assert нам такого не даст - номера строк сместятся Что-что? Куда они сместятся?
И наверняка этот велосипед не едет теряет адрес исключения, по которому *фанфары* можно найти номер строки.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|