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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 3 414

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Нужно создать 2 динамических двумерных массива string и real. При выполнении определённых условий с помощью setlength устонавливаю им размерности: см. приложение/
Так вот. В основной программе новая размерность устонавливается, а если всё отправить в подпрограмму, то при попытке установить 3-ю строку - программа выдаёт ошибку.
В чем может быть дело?
(Массивы объявленны глобально в главной форме)
Спасибо.

Приложение:
  1. var
  2. result0: array of array of real;
  3. strz: array of array string;
  4. ...
  5. if (...) then
  6. begin
  7. setlength(result0, length(result0)+1, 30);
  8. setlength(strz, length(strz)+1, 30);
  9. ...


Тамара Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Тамара (статус: Посетитель)
Вопрос отправлен: 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™

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]:

код на работе, а я дома.. а из вашего последнего ответа мне кое-что прояснилось. я что-то подобное и предполагала. буду дальше смотреть сама. Спасибо!!

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

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