| 
| 
 | Вопрос # 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сця, де призупинилося.
 
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |