|
Вопрос # 3 414/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Нужно создать 2 динамических двумерных массива string и real. При выполнении определённых условий с помощью setlength устонавливаю им размерности: см. приложение/
Так вот. В основной программе новая размерность устонавливается, а если всё отправить в подпрограмму, то при попытке установить 3-ю строку - программа выдаёт ошибку.
В чем может быть дело?
(Массивы объявленны глобально в главной форме)
Спасибо.
Приложение: Переключить в обычный режим- var
- result0: array of array of real;
- strz: array of array string;
- ...
- if (...) then
- begin
- setlength(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]:
код на работе, а я дома.. а из вашего последнего ответа мне кое-что прояснилось. я что-то подобное и предполагала. буду дальше смотреть сама. Спасибо!!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|