Internal error C1091

c1091

Цитата
[Fatal Error] Unit1.pas(82):

Я не можу зрозуміти в чому проблема. Ось вихідник

error

error

Якщо не допомагає чищення проекту (dcu і т.д.), то починаю шукати цю помилку методом половинного поділу спочатку юнітів, а потім процедур у "неправильних" юнітах. І т. д., доки знаходжу рядок. Перенабираю її наново. Якщо не допомогло – то уважно її вивчаю.

c1091

Це відповідальна заява? :)

Я ось до чого питаю: Мій проект (Delphi 2006) не компілювався в іншої людини під Delphi 2009, а сипав найрізноманітнішими Internal error-ми Сидела, виправляла їх вручну. З гріхом потрапила вдалося скомпілювати. Найчастіше зустрічалася помилка, приблизно, такого плану (писала по пам'яті, можуть бути неточності):

Що мені казати йому: "Вибачте, у мене ще немає достатнього досвіду для вирішення Ваших завдань" або "пацан, у тя глюкова дельфя. і не малюйся тут поки не перезавантажишся"? (С) (в одній з Пітерських контор) :)

error

c1091

а сипав найрізноманітнішими Internal error-ми

error

Потрібно просто перемішати код або використовувати іншу версію Delphi. У вас, до речі, якась версія? Спробуйте 6-7, 2007-2009. Під перемішуванням розуміється перестановка рядків, виділення коду в процедури або заміна інструкцій на їх аналоги (наприклад, for на while).

Угу, це сам CodeGear каже - подивися довідку щодо Internal Error:

Цитата
Error message, Internal Error: X1234 вказує на те, що комп'ютер має вказати на умову, інші не мають syntax error, що він не може бути успішним процесом.

Toвирішити внутрішню помилку

Якщо помилка виникає відразу після того, як ви змінили код у редакторі, поверніться до місця, де ви внесли зміни, і запишіть, що було змінено.

Якщо ви можете скасувати або закоментувати зміну, а потім успішно повторно скомпілювати свою програму, можливо, конструкція програмування, яку ви представили, виявила проблему з компілятором. Якщо так, виконайте наведену нижче процедуру перегляду коду.

Якщо проблема все ще існує

Видаліть усі файли .dcuil, пов’язані з вашим проектом.

Повністю закрийте проект за допомогою FileClose All.

Повторно відкрийте свій проект. Це очистить кеш модуля, що зберігається в IDE. Крім того, ви можете закрити IDE та перезапустити його.

Іншим варіантом є спроба перекомпілювати вашу програму за допомогою опції ProjectBuild, щоб компілятор повторно згенерував усі ваші dcuils.

Якщо помилка все ще присутня, вийдіть із IDE та спробуйте скомпілювати свою програму за допомогою версії компілятора з командного рядка (dccil.exe) із командного рядка. Це видалить кешування модуля IDE із зображення та може допомогти вирішити проблему.

Перегляньте свій код під час останньої зміни

Якщо проблема все ще існує, поверніться до місця, де ви востаннє вносили зміни у свій файл, і перегляньте код. Як правило, більшість внутрішніх помилок можна відтворити лише кількома рядками коду, і часто код містить досить незвичайний або несподіваний синтаксис або конструкції. Якщо це так, спробуйте змінити код, щоб зробити те саме іншим способом. Наприклад, якщо ви виконуєте приведення значення, спробуйте оголосити змінну типу приведення та спочатку виконайте призначення.

починати якщо Integer(b) = 100 тоді.

почати a := b; якщо a = 100, то.

Ось приклад неочікуваного коду, який можна виправити, щоб усунути помилку:

Коли ви визначите проблему, ми просимо вас створити найменший можливий тестовий приклад, який усе ще відтворює помилку, і надіслати його до Borland.

Інші методи вирішення внутрішніх помилок

Якщо здається, що помилка в коді міститься протягом деякого часу. зробити цикл спробуйте використати for. зробити цикл замість цього або навпаки.

Якщо він використовує вкладену функцію або процедуру (процедуру/функцію, що міститься в процедурі/функції), спробуйте видалити їх вкладення.

Якщо це відбувається під час приведення типу, шукайте альтернативи приведення типу, наприклад використання локальної змінної потрібного вам типу.

Якщо проблема виникає в операторі with, спробуйте взагалі видалити оператор with.

Спробуйте вимкнути оптимізацію компілятора в Project OptionsCompiler.

Коли все інше не допомагає

Якщо ви спробували свій код на останній версії компілятора, і він усе ще відтворюється, створіть найменший можливий тестовий приклад, який все одно відтворить помилку, і надішліть його до CodeGear. Якщо його не можна відтворити в останній версії, імовірно, проблему вже вирішено.

Налаштування IDE для уникнення внутрішніх помилок

Створіть єдиний каталог, де будуть розміщені всі ваші файли .dcpil (попередньо скомпільовані файли пакетів). Наприклад, створіть каталог під назвою C:\DCPIL і в розділі «Параметри середовища інструментів» виберіть вкладку «Бібліотека» та встановіть вихідний каталог DCPIL на C:\DCPIL. Цей параметр допоможе гарантувати, що файли .dcpil, які створює компілятор, завжди оновлені. Це корисно, коли ви переміщуєте пакет з одного каталогу до іншого. Ви можете створити каталог .dcuil для кожного окремого проекту за допомогоюProjectOptionsDirectories/ConditionalsUnit output directory.

Для тих, у кого туго з англ.:

Цитата
Повідомлення про помилку Internal Error: X1234 вказує на те, що компілятор зіткнувся з деякою ситуацією, яка відрізняється від синтаксичної помилки, і він не може продовжити компіляцію.

Підказка: у коді помилки Internal error зашифровано файл та рядок у вихідниках компілятора, де виникла помилка. Ця інформація може допомогти технічній підтримці виявити проблему. Не забудьте записати цю інформацію та прикріпити її до звіту про помилку.

Як позбудеться Internal error

Якщо помилка виникла відразу після внесення вами будь-яких змін до проекту - відкотіться назад, до того моменту, як ви почали змінювати код. Зауважте, що ви при цьому змінювали.

Якщо проблема ще існує

Видаліть усі файли .dcu(il), пов'язані з вашим проектом.

Повністю закрийте ваш проект (File/Close all).

Наново відкрийте свій проект. Це очистить кеш модулів у IDE. Як варіант – ви можете перезапустити IDE.

Ще варіант - спробувати перекомпілювати програми використовуючи команду Build (а не Compile) - при цьому компілятор перестворить всі файли dcu(il).

Якщо помилка не йде, закрийте IDE і спробуйте перекомпілювати програму, використовуючи компілятор командного рядка (dcc(il).exe). Це виключить із розгляду кешування юнітів у IDE.

Проаналізуйте свій код від останньої зміни

А ось приклад несподіваного коду, який ви можете виправити для позбавлення помилки:

Якщо проблема пов'язана із циклом while. do - спробуйте замінити його на for. do. Хоча ці зміни не виправляють глюк компілятора, вони можуть допомогти вам.продовжувати працювати над своїм додатком. Якщо ваші зміни позбавляють вас помилки, це не означає, що всі while або for цикли глючать - швидше ви використовуєте їх дещо незвичайним чином.

Як тільки ви змогли ізолювати проблему – було б непогано зробити мінімально можливий тестовий приклад-проект, який демонструє виникнення вашої помилки та вислати його на Quality Central (qc.codegear.com).

Інші техніки для позбавлення від помилок internal error

- Якщо проблема пов'язана з циклами - спробуйте змінити for на while/repeat або навпаки.

- Якщо проблема виникає у вкладених функціях – спробуйте зробити їх глобальними.

- Якщо проблема виникає у приведенні типів - спробуйте скористатися іншим, аналогічним за змістом наведенням або використовуйте тимчасові змінні.

- Якщо проблема виникає в операторі with - спробуйте його усунути і розписати явно.

- Спробуйте вимкнути оптимізацію (Project/Options/Compiler).

Коли нічого не вийшло

Зазвичай є безліч різних шматків коду, які можуть досягти потрібної вам мети. Ви можете спробувати позбавитися помилки, змінюючи код. Можливо, обране рішення не буде оптимальним, але принаймні ви зможете продовжувати роботу над своїм додатком.

Якщо у вас є остання версія компілятора – перевірте свій код у ній. Якщо проблема відтворюється - відправте, як і раніше, Quality Central мінімальну демку проблеми. Якщо ж проблеми немає - значить цей глюк компілятора вже був виправлений.

Конфігурація IDE для мінімізації шансу виникнення internal error

Створіть один каталог, де будуть лежати всі файли .dcp(il). Наприклад, створіть каталог C:\DCPIL і ToolsEnvironment/Options/Library встановіть DCP(IL) output directory у C:\DCPIL. Ця настройка гарантує, що всі .dcp(il) файли, що генеруються компілятором, підуть в одну папку і, таким чином, будуть найсвіжішими. Це корисна опція, якщо ви переміщаєте пакет із одного каталогу до іншого. Ви можете створити каталог і для .dcu(il) файлів, використовуючи Project/Options/Directories/Conditionals/Unit output directory.

Сенс цих змін у тому, щоб завжди використовувати найсвіжіші версії ваших .dcu(il) та .dcp(il). В іншому випадку ви можете зустрітися з помилками internal error.

Додано пізніше:ClickCLK, у тебе якраз, схоже варіант із циклами. Подивися уважніше - на мою думку, у тебе немає begin до end-ам у циклів for.