|
늦은 시간에 좋은 답변 감사드립니다.
박지훈.임프 님이 쓰신 글 :
: 죄송합니다만... 코드를 컨버트해놓은 게 그 정도로 미봉해서 쓸 수 있는 수준이 아닙니다.
: 대략 보니 코드에 대한 이해 없이 그대로 1:1 컨버팅하신 건데요.
:
: 저도 지금 바쁜 작업중이라 전체를 다 보진 않았습니다만, 일단, PByteArray 자체가 델파이이기 때문에 델파이 식으로 쓴 코드이고, C++이라면 아무 필요가 없습니다. 그냥 Buffer를 그대로 쓰는 게 맞습니다.
:
: 그 라인의 에러만 해결한다고 넘어가실 수 없습니다. 물론 제가 직접 손을 본다면 몇분 걸리지도 않겠지만, 그걸 설명을 드리고 책방전설님이 이해하는 데 드는 시간과 노력은 훨씬 더 큽니다. 이런 상황이니, 그냥 델파이 코드 그대로 C++빌더에서 불러쓰시는 게 정답인 거죠.
:
:
:
: 책방전설 님이 쓰신 글 :
: : 역시 아는게 힘이라고 좋은 정보 감사드립니다.
: :
: : 마지막으로 한가지만 더 여쭙겠습니다.
: :
: : 처음 질문에 "if (buf[i] == "0xFF" && buf[i+1] == "0xD9")" 여기 부분을 ->> "if (buf[i] == 0xFF && buf[i+1] == 0xD9)"
: :
: : 이렇게 변경하였는데 에러메세지가 다음과 같이 나왔습니다.
: :
: : [BCC32 Error] Unit1.cpp(7621): E2094 'operator==' not implemented in type 'Sysutils::TByteArray' for arguments of type 'int'
: :
: : 선언이 잘못된 것일까요???
: :
: : 박지훈.임프 님이 쓰신 글 :
: : : 코드를 델파이에서 C++ 컨버팅하는 것은 충분히 가능하지만, 책방전설님께 필요한 건 그보단 델파이 코드를 C++빌더에서 그대로 쓰는 쪽일 것 같습니다. 저도 일부 불가피할 경우엔 코드 포팅을 합니다만 꼭 C++ 소스가 필요한 경우가 아니라면 불필요한 노력이죠.
: : :
: : : 먼저 프로젝트에 델파이 소스를 추가하세요. 탐색기에서 해당 델파이 pas 파일을 프로젝트 매니저로 드래그&드랍하셔도 되고, 프로젝트 매니저의 프로젝트 이름 부분에서 오른쪽 클릭해서 메뉴에서 Add를 하셔도 됩니다.
: : :
: : : 그런 후에 F9를 눌러 컴파일을 한번 하세요. 그러면 pas 파일이 컴파일되고, 같은 파일 이름의 hpp 파일과 obj 파일이 생성되어 있을 겁니다. 이 두 파일만 생성되면 C++빌더에서 불러쓸 수 있습니다. 불러쓰시려는 것이 클래스든 아니면 독립 함수이든, hpp 파일을 보시면 델파이 코드의 선언 부분이 모두 C++ 코드로 변환되어 있습니다. 이걸 호출하시면 됩니다.
: : :
: : : 델파이와 C++빌더를 활용하는 데 있어서는 아주 기초적인 지식이랍니다.
: : :
: : : 그럼...
: : :
: : :
: : :
: : : 책방전설 님이 쓰신 글 :
: : : : 답변감사합니다.
: : : :
: : : : 우선 말씀하신데로 변경해서 컴파일 하였는데
: : : :
: : : : [BCC32 Error] Unit1.cpp(7621): E2094 'operator==' not implemented in type 'Sysutils::TByteArray' for arguments of type 'int'
: : : : Full parser context
: : : : Unit1.cpp(7610): parsing: int _fastcall TIEJpegAcquireStream::Write(const void *,int)
: : : :
: : : : 이렇게 에러가 발생하였습니다.
: : : :
: : : : 제가 아직 초보라서 말씀하신것 처럼 프로젝트에 포함하여 사용할 수 있다고 하셨는데 그럼 어떻게 해야되는지 방법좀 알려주실수 있으신지요?
: : : :
: : : : 박지훈.임프 님이 쓰신 글 :
: : : : : 말씀하신 라인만 보자면,
: : : : : if (buf[i] == "0xFF" && buf[i+1] == "0xD9")
: : : : :
: : : : : 문자열로 지정해버렸으니 당연히 계산이 안됩니다.
: : : : :
: : : : : if (buf[i] == 0xFF && buf[i+1] == 0xD9)
: : : : : 이렇게 해야 할 거 같구요.
: : : : :
: : : : : 그런데, 델파이 코드를 왜 C++ 코드로 바꾸고 계신지요.
: : : : : 델파이 코드는 99.00% C++빌더에서 그대로 프로젝트에 포함시켜서 컴파일해서 불러 쓸 수 있습니다만.
: : : : : 혹시 꼭 C++로 된 코드로만 만드셔야 할 이유라도 있으신지?
: : : : :
: : : : :
: : : : :
: : : : : 책방전설 님이 쓰신 글 :
: : : : : : 델파이 소스를 C빌더로 변환해서 쓰려고 하는데 좀 막혀버리네요
: : : : : :
: : : : : : 델파이 소스와 변환 소스롤 올려드리니 에러나는 부분좀 해결해 주세요.
: : : : : :
: : : : : : *델파이소스
: : : : : : function TIEJpegAcquireStream.Write(const Buffer; Count: Longint): Longint;
: : : : : : var
: : : : : : buf:pbytearray;
: : : : : : i:integer;
: : : : : : begin
: : : : : : result:=Count;
: : : : : : buf:=pbytearray(@Buffer);
: : : : : : case fStart of
: : : : : : false:
: : : : : : // look for begin of jpeg (FFD8)
: : : : : : for i:=0 to Count-2 do
: : : : : : if (buf[i]=$FF) and (buf[i+1]=$D8) then
: : : : : : begin
: : : : : : fData.Write( buf[i], Count-i);
: : : : : : fStart:=true;
: : : : : : exit;
: : : : : : end;
: : : : : : true:
: : : : : : begin
: : : : : : // look for end of jpeg (FFD9)
: : : : : : for i:=0 to Count-2 do
: : : : : : if (buf[i]=$FF) and (buf[i+1]=$D9) then
: : : : : : begin
: : : : : : fData.Write( buf[0], i);
: : : : : : fStart:=false;
: : : : : :
: : : : : : // acquire bitmap
: : : : : : fData.Position:=0;
: : : : : : Form1.ImageEnView1.IO.LoadFromStreamJpeg(fData);
: : : : : : Application.ProcessMessages;
: : : : : : fData.Clear;
: : : : : :
: : : : : : exit;
: : : : : : end;
: : : : : : // not found, write all
: : : : : : fData.Write( buf[0], Count );
: : : : : : end;
: : : : : : end;
: : : : : : end;
: : : : : :
: : : : : : *변환소스
: : : : : : int __fastcall TIEJpegAcquireStream::Write(const void *Buffer, int Count)
: : : : : : {
: : : : : : PByteArray buf;
: : : : : : int i;
: : : : : :
: : : : : : //long nCount = Count;
: : : : : : buf = PByteArray(Buffer);
: : : : : :
: : : : : : switch (fStart) {
: : : : : : // look for begin of jpeg (FFD8)
: : : : : : case false:
: : : : : : for (i = 0; i < Count-2; i++) {
: : : : : : if (buf[i] == "0xFF" && buf[i+1] == "0xD8") { <--- 이부분과
: : : : : : fData->Write(buf[i], Count-i);
: : : : : : fStart = true;
: : : : : : break;
: : : : : : }
: : : : : : }
: : : : : :
: : : : : : // look for end of jpeg (FFD9)
: : : : : : case true:
: : : : : : for (i = 0; i < Count-2; i++) {
: : : : : : if (buf[i] == "0xFF" && buf[i+1] == "0xD9") { <--- 이부분에서 제대로 IF문을 수행하지 못하네요 ㅠㅠ
: : : : : : fData->Write(buf[0], i);
: : : : : : fStart = false;
: : : : : :
: : : : : : // acquire bitmap
: : : : : : fData->Position = 0;
: : : : : : Form1->ImageEnView1->IO->LoadFromStreamJpeg(fData);
: : : : : : Application->ProcessMessages();
: : : : : : fData->Clear();
: : : : : :
: : : : : : break;
: : : : : : }
: : : : : :
: : : : : : // not found, write all
: : : : : : fData->Write(buf[0], Count);
: : : : : : }
: : : : : : }
: : : : : :
: : : : : : return Count;
: : : : : : }
|