2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Помогите с массивом неизвестной структуры в Delphi
Сообщение03.06.2010, 20:19 


02/01/09
57
Процедура получает в качестве параметра массив неизвестной структуры, функцию сравнения двух элементов и процедуру обмена двух элементов.
Функция сравнения получает два номера и выдает
-1 если элемент с первым номером меньше эл-та со вторым номером
0 если элементы равны
1 если эл-т с первым номером больше эл-та со вторым
Процедура перестановки получает два номера и перестанавливает эл-ты с этими номерами

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение04.06.2010, 01:39 
Заслуженный участник


26/07/09
1559
Алматы
Ну шаблоны в delphi появились совсем недавно... Или вам достаточно типа Variant?

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение04.06.2010, 10:50 


02/01/09
57
Тип Variant будет достаточно

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение04.06.2010, 14:25 
Заслуженный участник
Аватара пользователя


01/08/06
3131
Уфа

(Оффтоп)

Ого! У нас на форуме завелись телепаты :D

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение04.06.2010, 15:44 
Заслуженный участник


27/04/09
28128
Что значит "массив неизвестной структуры"?

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение04.06.2010, 15:56 


02/01/09
57
arseniiv в сообщении #327629 писал(а):
Что значит "массив неизвестной структуры"?


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

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение04.06.2010, 16:10 
Заслуженный участник


27/04/09
28128
Используйте бестиповые указатели.

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение04.06.2010, 16:14 


02/01/09
57
А можно поподробнее?

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение04.06.2010, 16:33 
Заслуженный участник


27/04/09
28128
Куда уж подробнее.

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение06.06.2010, 01:16 
Заслуженный участник


26/07/09
1559
Алматы
2Еленочка
Цитата:
Тип Variant будет достаточно

Так вы оказывается сами все знаете. :) Вместо конкретного типа, например String или Integer, необходимо указать Variant, вот и все.

Вот как бы вы реализовали процедуру обмена значений двух целочисленных переменных? Наверное, так:
Используется синтаксис Delphi
procedure Swap(var First, Second: Integer);
var Temporary: integer;
begin
    Temporary:=First;
    First:=Second;
    Second:=Temporary;
end;
 


Но можно сделать её типонезависимой:
Используется синтаксис Delphi
procedure Swap(var First, Second: Variant);
var Temporary: Variant;
begin
    Temporary:=First;
    First:=Second;
    Second:=Temporary;
end;
 


Допустим у вас есть массив; вы теперь можете менять в нем элементы местами. Сам массив тоже может быть независим от типов, например можно использовать обычный массив над вариантным типом или специальный вариантный (создаваемый функцией VarArrayCreate(...)) массив (в последнем случае, кажется, неизбежно копирование массива, поэтому такую возможность я обойду стороной).

Итак, пример с массивом над вариантным типом:
Используется синтаксис Delphi
var MyArray: array of Variant;
    ...
Swap(Myarray[i], MyArray[j]);
 


Когда вам говорили о возможности использования безтиповых указателей, то имели ввиду, что для обмена элементов массива местами, знать природу хранимых в них данных вовсе не нужно и достаточно скопировать память на низком уровне. Правда, для этого все-равно необходимо знать размер каждого элемента... В общем, в некоторых ситуациях так делать можно, но это не очень красиво да и не безопасно...

Здесь проще хранить указатели в связанном списке, что позволит менять элементы местами максимально эффективно. А ещё лучше использовать полиморфизм, т.е. писать логику над TObject, хотя это все-равно не избавит от необходимости организовывать дипетчеризацию для выбора конкретного способа обработки различных типов данных. В любом случае, эти вопросы относятся уже к классическому паскалю, а не к object pascal aka delphi... :)

Фактически, и указатели вместе с дополнительной информацией о размере элементов и Variant-переменные и другие подобные динамические подходы --- все это работает в run-time и может быть ужасно неэффективным, тормознутым (хотя не все с этим согласны, см. статейку Ускоренная обработка данных типа Variant в Delphi). В более цивилизованных языках, вроде C++, эта проблема решается с применением т.н. шаблонов. В delphi такая возможность, как я уже говорил, недавно все-таки появилась, под именем delphi generics. А ведь раньше (до 2009 версии delphi 4w32 или до v2007 codegear rad studio 4.net) delphi-программистам приходилось в случае необходимости эмулировать поддержку шаблонов, например через директивы препроцессора. Причем препроцессор delphi тоже очень хилый и мало на что годится, поэтому обходились директивой {$include ...} (историческое любопытство можно удовлетворить статейкой Шаблоны в Object Pascal).

Примерчик же с использованием современных generics можно привести такой (опять обмен значений двух переменных):
Используется синтаксис Delphi
type
    TSwapper=class
        class procedure Swap<T>(var First, Second: T)
    end;

    ...

class procedure TSwapper.Swap<T>(var First, Second: T);
    ...
begin
    ...
end;
 


Использование:
Используется синтаксис Delphi
var Variable1, Variable2: Integer;
    ...
TSwapper.Swap<Integer>(Variable1, Variable2);
 


В общем, примерно так... Неплохо бы было, если бы сюда зашел кто-нибудь разбирающийся в delphi, а то я уже все забыл. :)

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение16.06.2010, 14:02 


02/01/09
57
Задача, решенная с использованием типа Variant его не устроила :-( Сказал, что нужно через Pointer делать

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение16.06.2010, 18:55 
Заслуженный участник


26/07/09
1559
Алматы
Цитата:
нужно через Pointer делать

Ну это же элементарно. Пишите что-то вроде:
Используется синтаксис Delphi
procedure Swap(var X: array of Pointer; i, j: Integer);
var T: Pointer;
begin
    T:=X[i];
    X[i]:=X[j];
    X[j]:=T;
end;
 


Создаете массив безтиповых указателей, выделяете память для каждого элемента (я использовал GetMem), заполняете этот массив, меняете некоторые элементы местами и печатаете результат в строку (S):
код: [ скачать ] [ спрятать ]
Используется синтаксис Delphi
var
    X: array of Pointer;
    i: Integer;
    S: String;

    ...

    SetLength(X, 14);

    for i:=0 to High(X) do
    begin
        GetMem(X[i], SizeOf(Integer));
        Integer(X[i]^):=i;
    end;

    Swap(X, 2, 6);

    S:='';
    for i:=0 to High(X) do
        S:=S+' '+IntToStr(Integer(X[i]^));
 

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение17.06.2010, 20:14 
Заслуженный участник


27/04/09
28128

(Оффтоп)

Процедуру сравнения забыли!

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение21.06.2010, 19:15 
Заслуженный участник


26/07/09
1559
Алматы

(Оффтоп)

2arseniiv
Цитата:
Процедуру сравнения забыли!

Ну дык подопытная и сама её написать может. Надеюсь... Ага, точно, есть же правила о неоказании прямой помощи на этом форуме. Вот, придерживаюсь. :)

 Профиль  
                  
 
 Re: Помогите с массивом неизвестной структуры в Delphi
Сообщение21.06.2010, 20:22 
Заслуженный участник


27/04/09
28128

(Оффтоп)

А, ну да. Думаю, она ещё вернётся! :-)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group