FireMonkey Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FireMonkey 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FireMonkey Q&A
[189] Re:Delphi Sort 를 C++Builder FMX로바꾸고 싶습니다. 도와 주세요.
빌더(TWx) [builder] 1468 읽음    2017-07-12 23:40
그 아이 님이 쓰신 글 :
: 델파이 코드는 아래와 같습니다.
:
: int __fastcall TF1::CompareLowerStr(String _a, String _b)
: {
:     return CompareStr(AnsiLowerCase(_a), AnsiLowerCase(_b));
: }
: //---------------------------------------------------------------------------
: System::TStringDynArray myData;//
:
:
: 아래 부분을 어떻게 C++Builder code로 변환해야 하는지 통 모르겠습니다.
:
: TArray::Sort<String>(myData, TComparer<String>(CompareLowerStr));



답변:


사람들 잘 보지도 않는 게시판에 글을 남기면... 이제서야 봤네요...

델파이 generic으로 구현되어 있는 Sort는 아래와 같이

class procedure Sort<T>(var Values: array of T); 로 선언되어있는데...

델파이 랭귀지 신텍스에서 저 구문이 의미하는 것은

템플릿 인자인 T 타입의 다이나믹 어레이 포인터를 파라미터로 받는 static 매소드를 의미 합니다.
앞 부분의 class의 의미는 C++에서 static 메소드 역할이죠.
따라서 클래스 인스턴스 없이 메소드를 사용할 수 있고.


델파이에서...
array of string은 string 타입의 다이나믹 배열을 의미 합니다.

예를 들어서... 아래와 같은 델파이 구문이 있을 때...

procedure Foo(arr: array of string);
begin
    ....
end;

C++ 에서 저 메소드를 호출하려면....

Foo(OPENARRAY(String, ("hello", "2222", "4444")));

와 같은 식으로 지져분한 매크로를 사용해야 합니다.



델파이 컴파일러는...

procedure Foo(arr: array of string);

를... 실제적으로는 아래와 같은 식으로 코드 제네레이션을 하도록 구현되어 있습니다.

void Foo(void *, int value_high);

여기서 value_high는 다이나믹 어레이의 element 갯수에서 1을 뺀 값을 의미 합니다.
컴파일러를 만들 때, 저런 식으로 만든 거죠.


따라서 C++에서 델파이 다이나믹 어레이 호출구조를 사용하려면...
지져분하게 OPENARRAY 매크로를 사용해야 합니다.

OPENARRAY 매크로는 어레이의 element 갯수 - 1을 구해서
(void *, int value_high); 식으로 파라미터를 만들어 줘요.

지져분한 OPENARRAY 매크로를 사용하지 않고 코드를 작성하려면...

#include <System.Generics.Collections.hpp>
#include <System.Generics.Defaults.hpp>
void Foo::Foo()
{
    String strs[] = {"222","333","111"};
    TArray::Sort<String>((String*)&strs, 2);
}

위와 같이 작성하면 됩니다.
String 타입의 comparator는 디폴트로 구현되어 있기때문에 <System.Generics.Defaults.hpp>를 include 하기만 하면 됩니다.


그러나...

C++을 사용하는 이상, 델파이 generic은 사용하지 마세요.
파스칼 유닛에 정의되어있는 generic을 사용할 때 코드가 형편 없어 집니다.
파스칼 유닛에서 T가 정해져 generic 인스턴스가 결정되어 있을 경우, C++ 쪽에서 정해진 T만
사용할 수 밖에 없고, 변환된 델파이 오브젝트를 같이 링크해야 하거든요.

STL C++ template 을 손에 익혀 버릇하세요. 릴리즈로 빌드시. 더 효율적인 코드들을 생성하니까요.
일반적인 경우엔 vector, 삽입/삭제가 빈번하면 list, look-up 퍼포먼스가 필요하면 hash map.
이 3가지 유형만이라도 손에 익혀 보세요.
델파이에서 제공되는 TStringList, TList 같은 것들은 쓰잘데기 없는 것들에 불과합니다.

한가지 더...
C++ 을 사용할 거라면 델파이 interface도 사용하지 마세요.
C++ ComPtr template 래퍼 클래스를 만들어서 사용하는 게 더 낫습니다.

+ -

관련 글 리스트
188 Delphi Sort 를 C++Builder FMX로바꾸고 싶습니다. 도와 주세요. 그 아이 1167 2017/05/30
189     Re:Delphi Sort 를 C++Builder FMX로바꾸고 싶습니다. 도와 주세요. 빌더(TWx) 1468 2017/07/12
193         빌더님 답변이 있나없나 Observer 939 2018/05/11
190         Re:Re:Delphi Sort 를 C++Builder FMX로바꾸고 싶습니다. 도와 주세요. 그 아이 1078 2017/07/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.