Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2013, 11:21   #1
KORT
Вот я и
Форумчанин
 
Аватар для KORT
 
Регистрация: 07.04.2007
Сообщений: 501
По умолчанию Функция, возвращающая массив

Доброе время суток!
Есть пример работы функции, которая возвращает массив.
Функция сортирует цифры внутри массива...
kol1 - всего вопросов в базe
kol2 - задать количество вопросов

PHP код:
type
  MassResponce 
= array of integer;
......
function 
RandomNumberQuestions(kol1,kol2integer): MassResponce;
  var
    
i,j,z,tmpinteger;
    
mas: array[1..100of integer;
    
sstring;
  
begin
    
for i:=0 to kol1-do
      
begin
        Randomize
;
        
j:=Random(kol1)+1;
        
z:=Random(kol1)+1;
        
tmp:=mas[z];
        
mas[z]:=mas[j];
        
mas[j]:=tmp;
      
end;
    
s:='';
    for 
i:=1 to kol2 do
      
result[i]:=mas[i];
  
end
вызываю ее
PHP код:
procedure TForm1.ComboBox5Change(SenderTObject);
    
masssMassResponce;
  
begin
...
    
masss:=RandomNumberQuestions(GroupElSec[GroupEl2],GroupEl1);
  
end
вот такую каhтинку выдает...
Исходники программ - http:\\www.kort.3dn.ru

Последний раз редактировалось KORT; 04.02.2013 в 11:24.
KORT вне форума Ответить с цитированием
Старый 04.02.2013, 11:32   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
MassResponce = array of integer;
Это динамический массив.
По сути - указатель на область памяти.
чтобы работать с этим массивом ОБЯЗАТЕЛЬНО нужно выделить требуемую память с помощью процедуры SetLength( ИМяДинамическогоМассива, размер );

Вы это не делаете. Вот и получаете ошибку access violation...


p.s. Огласите условие задачи, которую Вы решаете, может быть, Вам динамические массивы и не нужны совсем!
А если они нужны, то нужно выделять под них память и выкинуть ваш статический массив mas...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.02.2013, 11:34   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

1. Перед работой с динамическим массивом его нужно инициализировать:
2. Нумерация динамических массивов с 0
Код:
 ...
 SetLength (result, kol2);
 for i:=1 to kol2 do
      result[i-1]:=mas[i];
 ...
------------------------------------------------------------------------------
Цитата:
Код:
        j:=Random(kol1)+1;
        z:=Random(kol1)+1;
        tmp:=mas[z];
        mas[z]:=mas[j];
        mas[j]:=tmp;
Что вы хотели этим сказать?

------------------------------------------------------------------------------
Цитата:
Код:
 mas: array[1..100] of integer;
Уверены, что kol1 < 100?

___________________________________ ___________________________________ ____________________
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Коллега, Вы пишете правильно, а код даёте с ошибкой
Упс. Забыл подправить. Теперь исправил

Последний раз редактировалось Sibedir; 04.02.2013 в 11:40.
Sibedir вне форума Ответить с цитированием
Старый 04.02.2013, 11:36   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

А если вот это

Код:
for i:=1 to kol2 do
      result[i]:=mas[i];
заменить на это:

Код:
result:=mas;
Правда, массивы должны совпадать по типам...

А на кой Вам динамический массив, если внутри функции все-равно ограничение в сто элементов?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 04.02.2013, 11:37   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Siberdir
Нумерация динамических массивов с 0
Коллега, Вы пишете правильно, а код даёте с ошибкой

Цитата:
Код:
 SetLength (result, kol2);
 for i:=1 to kol2 do
      result[i]:=mas[i];
очевидно, что нужно:
Код:
 for i:=0 to kol2-1 do
      result[i]:=mas[i+1];
Цитата:
Сообщение от Sciv
А если вот это ...
заменить на это:
Код:
result:=mas;
Да щас!! Никто Вам так записывать не позволит - result и mas РАЗНОГО типа!

Да и я сомневаюсь, что mas вообще нужен!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.02.2013, 11:40   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Код:
setlength(result,kol2+1);
+1 потому что индексация с нуля, а у mas с единицы
Или
Код:
result[i-1]:=mas[i]
Serge_Bliznykov опередил
eoln вне форума Ответить с цитированием
Старый 04.02.2013, 11:42   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Да щас!! Никто Вам так записывать не позволит - result и mas РАЗНОГО типа!
Сергей, читай внимательно, я прямо под кодом поправку на это указал...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 04.02.2013, 11:54   #8
KORT
Вот я и
Форумчанин
 
Аватар для KORT
 
Регистрация: 07.04.2007
Сообщений: 501
По умолчанию

Заработало! Сделав вот так:
PHP код:
    setlength(result,kol2+1);
    ...
    for 
i:=1 to kol2 do
      
result[i-1]:=mas[i]; 
Код:
j:=Random(kol1)+1;
        z:=Random(kol1)+1;
        tmp:=mas[z];
        mas[z]:=mas[j];
        mas[j]:=tmp;
Это "сортировка" внутри массива
Код:
было так: 1 2 3 4 5 6 7 8 9 10
станет так: 3 1 4 10 6 2 8 5 9
[QUOTE=Sibedir;1177669]Уверены, что kol1 < 100?/QUOTE]
Да!! там максимум 50

P.S. Спасибо всем за ответы
Исходники программ - http:\\www.kort.3dn.ru
KORT вне форума Ответить с цитированием
Старый 04.02.2013, 12:11   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Написал зря. Удалил.

Последний раз редактировалось Sibedir; 04.02.2013 в 12:15.
Sibedir вне форума Ответить с цитированием
Старый 04.02.2013, 12:15   #10
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Да!! там максимум 50
Ну и опять же возвращаемся к вопросу - на кой ляд Вам динамический массив?

Задали бы тогда:

Код:
type
  MassResponce = array [1..50] of integer;
и потом избавились от одного цикла в процедуре:

Код:
mas: MassResponce;

...

result:=mas; 
...

Не настаиваю на этом варианте, однако имхо он чуть оптимальней исходного.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция, возвращающая массив (С++) Alendorff Помощь студентам 14 09.03.2012 17:23
Пользовательская функция,возвращающая массив savraska Microsoft Office Excel 2 20.04.2010 03:12
Функция возвращающая массив babaj Общие вопросы Delphi 8 04.07.2009 17:40
Создание надстроек. Функция, возвращающая массив значений Jarik Microsoft Office Excel 6 13.01.2009 23:11
Функция возвращающая строку(си++). necky Помощь студентам 1 18.10.2008 18:32