Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: mirt.steelwater (статус: Посетитель)
Вопрос отправлен: 2 августа 2011, 16:23
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 13; последнее сообщение — 5 августа 2011, 01:17; участников в обсуждении: 5.
min@y™

min@y™ (статус: Доктор наук), 2 августа 2011, 16:39 [#1]:

Сюды смотрел?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 2 августа 2011, 16:42 [#2]:

Поименовать функцию "_" - это мощно! Даже наши старые пердуны себе такого не позволяют.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
mirt.steelwater

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™

min@y™ (статус: Доктор наук), 2 августа 2011, 17:35 [#4]:

А имя функции-то почему такое? Фантазии не хватило?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
mirt.steelwater

mirt.steelwater (статус: Посетитель), 2 августа 2011, 17:53 [#5]:

ну что ж не понятно то? это псевдоним. используется посеместно, смысловой нагрузки не несет, должен быть максимально коротким и минимально заметным!
Ⓐ свобода сопротивление солидарность
mirt.steelwater

mirt.steelwater (статус: Посетитель), 2 августа 2011, 17:57 [#6]:

так все таки - что такое internal error C1624 и почему он вылазит??
Ⓐ свобода сопротивление солидарность
min@y™

min@y™ (статус: Доктор наук), 2 августа 2011, 19:32 [#7]:

Цитата (mirt.steelwater):

так все таки - что такое internal error C1624 и почему он вылазит??

Кроме самих разработчиков компилятора тебе про это никто не расскажет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

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

bugmenot (статус: 3-ий класс), 3 августа 2011, 14:34 [#10]:

компилятор как бы говорит нам "этот код - жесть, не хотеть!"
виконання програми розпочинається з того самого мiсця, де призупинилося.

bugmenot

bugmenot (статус: 3-ий класс), 3 августа 2011, 16:17 [#11]:

Забери плюс обратно, я не шутил :­-­D
Одно "подбрасываение" исключения чего стоит, и гуид в строку.
А в проблемном коде var строка непонятно зачем.

Ссылкота на почитать
виконання програми розпочинається з того самого мiсця, де призупинилося.

mirt.steelwater

mirt.steelwater (статус: Посетитель), 4 августа 2011, 21:02 [#12]:

подбрасывание???
гуид в строку нужен для того, чтобы затем можно было найти это место в любой версии программы (assert нам такого не даст - номера строк сместятся). var затем, что aRandomType - это резултат выполнения диалога. по умолчанию можно установить любое значение при вызове диалога, потому и var, а не out
Ⓐ свобода сопротивление солидарность
bugmenot

bugmenot (статус: 3-ий класс), 5 августа 2011, 01:17 [#13]:

Цитата (mirt.steelwater):

подбрасывание?

То, что ты делаешь называется "подбрасывание исключения"

Цитата (mirt.steelwater):

гуид в строку нужен

гуид - структура, не строка, незачем преобразовывать туда-сюда.

Цитата (mirt.steelwater):

assert нам такого не даст - номера строк сместятся
Что-что? Куда они сместятся?

И наверняка этот велосипед не едет теряет адрес исключения, по которому *фанфары* можно найти номер строки.
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:00
Выполнено за 0.06 сек.