| 
| 
 | Вопрос # 3 414/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Нужно создать 2 динамических двумерных массива string и real. При выполнении определённых условий с помощью setlength устонавливаю им размерности: см. приложение/
 Так вот. В основной программе  новая размерность устонавливается, а если всё отправить в подпрограмму, то при попытке установить 3-ю строку - программа выдаёт ошибку.
 В чем может быть дело?
 (Массивы объявленны глобально в главной форме)
 Спасибо.
 Приложение:Переключить в обычный режим varresult0: array of array of real;strz: array of array string;...if (...) then beginsetlength(result0, length(result0)+1, 30);setlength(strz, length(strz)+1, 30);...
|  |   Вопрос задала: Тамара (статус: Посетитель)Вопрос отправлен: 17 ноября 2009, 19:33
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Паровоз Здравствуйте, Тамара!Оператор setlength(result0, length(result0)+1, 30) устанавливает массив размером 1x30 так как  первоначально length(result0)=0. Поэтому Вы получаете одну строку и 30 колонок.
 
|  | Ответ отправил: Паровоз (статус: 10-ый класс)Время отправки: 17 ноября 2009, 20:11
 Оценка за ответ: 4
 |  Ответ #2. Отвечает эксперт: Вадим К Здравствуйте, Тамара!ошибка тут
 strz: array of array string;
 должно быть
 strz: array of array of string;
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 17 ноября 2009, 20:12
 Оценка за ответ: 4
 |  
 Мини-форум вопросаВсего сообщений: 15; последнее сообщение — 19 ноября 2009, 18:40; участников в обсуждении: 4. 
|   | Паровоз (статус: 10-ый класс), 17 ноября 2009, 20:14 [#1]:P.S. Для подробного анализа нужно подробный код. |  
|   | min@y™ (статус: Доктор наук), 17 ноября 2009, 21:20 [#2]: Цитата: программа выдаёт ошибку
 
 
 Как же надоели такие вопросы!
 Мы должны угадать, что за ошибка?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 17 ноября 2009, 22:28 [#3]:ну  в данном случае ошибка видна невооруженным глазом - просто забыт of. хотя... Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Паровоз (статус: 10-ый класс), 17 ноября 2009, 22:46 [#4]:"забыт of" Похоже, что ошибка не в этом, ибо автор вопроса пишет "В основной программе новая размерность устонавливается", стало быть это не ошибка, а опечатка при посылке вопроса.
 |  
|   | Вадим К (статус: Академик), 18 ноября 2009, 11:08 [#5]:я не вижу никаких предпосылок, что бы размерность не могла установиться. Плюс автор указывает, что ошибка возникает в третьей строке приведённого кода. Хотя может я не правильно понял выражение "установить третью строку". Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Паровоз (статус: 10-ый класс), 18 ноября 2009, 16:25 [#6]:Ну, да "третья строка" может быть и в двумерном массиве. Кроме того, автор пишет "Массивы объявленны глобально в главной форме". Что бы это могло значить? Я понял это так, что это следующий текст: var
 result0: .......
 strz: ......
 и поэтому компилятор съел это (потому, что ошибка у нее в подпрограмме).
 
 Однако, теперь уже я все больше сомневаюсь в в этом.
 |  
|   | Вадим К (статус: Академик), 18 ноября 2009, 16:34 [#7]: Цитата (Паровоз):  "Массивы объявленны глобально в главной форме" это два варианта.
 либо сразу после строк
 var
 Form1:TForm1;
 либо в разделе private/public формы. а тут уже есть несколько засад
  если процедура/функция не метод класса, то получить доступ к полю, объявленному в private/public формы так просто не получиться... Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Паровоз (статус: 10-ый класс), 18 ноября 2009, 17:16 [#8]:Вот если бы еще понять что такое "в главной форме". Может на самом деле это просто "в главном модуле". Тогда и вариантов будет больше. |  
|   | Вадим К (статус: Академик), 18 ноября 2009, 17:44 [#9]:Да вот дело в том, что такое понятие как "главная форма" есть (MainForm), а вот "главный модуль"... это уже не совсем корректное дело. Я могу в один модуль две формы запхать, как  же тогда быть? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Тамара (статус: Посетитель), 18 ноября 2009, 19:17 [#10]:Всем спасибо и извините. Действительно некорректно сформулировала описание вопроса. 1."of" - я пропустила при печати вопроса...
 2.массивы я объявила в модуле с главной формой (её закрытие ведёт к закрытию программы) перед type после uses.
 3.присвоение очередной строки происходит в цикле. программа0 вызывает подпрограмму1 (она на отдельном модуле). в ней проверяются разные условия и при их выполнении вызывается подпрограмма2 (тоже на отдельном модуле), где и нужно добавить очередную строку массивам.
 4.получается получить массив из 2-х строк (0 и 1) а при попытке получить третью строку (2) программа вылетает молча, если запущена через exe-файл.
 5.если разместить оператор setlength в программе0, то всё работает.
 6.всё пихать в одну программу0 не хочется, она у меня и так огромная..
 |  
|   | Паровоз (статус: 10-ый класс), 18 ноября 2009, 19:42 [#11]:"of" - я пропустила при печати вопроса массивы я объявила в модуле с главной формой
 
 Мы с Тамарой ходим парой...
 |  
|   | Вадим К (статус: Академик), 18 ноября 2009, 22:04 [#12]:А код привести слабо? вообще то размешать после uses перед type  - плохая затея. Подозреваю, что в втором юните (как его называете модуль) в списке uses есть ссылка на первый юнит с главной формой, не так ли?
 
 Если закрывается втихую - подозреваю, что происходит выход за границы массива и "расстрел памяти". И самое интересное, что собственно плохой код может быть в другом месте.
 
 И ещё, может быть одно - выделяете слишком много памяти.
 
 Лично мне такие фокусы с перевыделением памяти не нравятся - я лучше заведу класс, в котором будет TList, а внутри его - TStringList.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Тамара (статус: Посетитель), 19 ноября 2009, 18:23 [#13]:всё ясно.. |  
|   | Вадим К (статус: Академик), 19 ноября 2009, 18:34 [#14]:Значит кода не будет и вопросов больше нет? Если код сверхсекретный... тогда прийдется самому изучать. Можно на почту отправить
   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Тамара (статус: Посетитель), 19 ноября 2009, 18:40 [#15]:код на работе, а я дома.. а из вашего последнего ответа мне кое-что прояснилось. я что-то подобное и предполагала. буду дальше смотреть сама. Спасибо!! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |