Q&A

  • 구조체 안의 구조체를 함수 인자로 넘기는 방법??

안녕하세요. 이번에 신입사원으로 입사해서 처음으로 델파이를 배우는 중입니다.


궁금한 사항이 있어 질문 드립니다.


1. 델파이에서 비주얼 어시스트와 같이 필요한 변수명이나 구조체 명 같은게 자동으로 나오는게 없는지...


2. 구조체 안에 구조체를 함수 인자로 넘기는 방법이 궁금합니다.


para1, para2 : 구조체1

- func(para1, var para2 : 구조체1 )       ->   func(para1, papra2)       para2에는 반환값을 받으려고...   원래는 이렇게 쓰는데



구조체2 

begin para1, para2  구조체1 end;   


para3  : 구조체2           이렇게 구조체 안에 구조체변수를 등록한경우

- func(para1,  var para2  :  구조체1)    -> func(para3.2para1, para3.para2)   하니 쓰레기 값이 넘어값니다


어떻게 처리해야 하는지 궁금합니다. 

10  COMMENTS
  • Profile
    백록화 2014.03.25 03:34
    1. 코딩중 단축키 Ctrl+Space , Ctrl+Shift+Space 로 코드컴플레이션, 툴팁 심볼 인싸이트 같은 코드 인싸이트 를 사용하실수 있습니다. 에디터옵션중에서 코드 인싸이트에서 각종옵션을 설정하여 사용할수 잇습니다. 딜레이 시간 설정에 따라서 자동으로 실행될수도 있습니다.

    2. 질문하신 내용으로는 안될것은 없어보입니다만... 의사코드가 아닌 실제 코드를 올려보심이 어떨런지요...
    그리고 para3 에 para1, para2 가 담겨져 있다면 굿이 따로 따로 넘길 필요가 있을런지....
  • Profile
    gandus 2014.03.25 06:52

    호출하는 함수에서 para3의  para2 구조체에 반환값을 줘서요

  • Profile
    gandus 2014.03.25 06:56

    C로 제작된 dll을 쓰는데, 소스로 확인해보니 c로 쓰레기값이 넘어가서...

  • Profile
    이정욱 2014.03.25 08:14

    dll 을 호출하기 위해 선언한 부분을 알려주셔야 할 듯 합니다. cdecl 인지 stdcall 인지...

  • Profile
    gandus 2014.03.25 18:14
    Function 함수4(m_Align_Data : T_Align_Data ; var m_Align_Result : T_Align_Result) : Integer  cdecl; external'.dll';

    구조체

      T_Calibration_XY_Data     = record
          m_View_X              : Array [1..25] of Double;
          m_View_Y              : Array [1..25] of Double;
          m_Stage_U_Position    : Array [1..25] of Double;
          m_Stage_V_Position    : Array [1..25] of Double;
          m_Stage_W_Position    : Array [1..25] of Double;
      End;

      T_Calibration_Theta_Data  = Record
          m_Current_Degree      : Array [1..31] of Double;
          m_Stage_U_Position    : Array [1..31] of Double;
          m_Stage_V_Position    : Array [1..31] of Double;
          m_Stage_W_Position    : Array [1..31] of Double;
      End;

      T_Align_Data              = Record
          m_View_L_X_Data       : Double;
          m_View_L_Y_Data       : Double;
          m_View_R_X_Data       : Double;
          m_View_R_Y_Data       : Double;
      End;

      T_Align_Result            = Record
          m_Stage_U_Position    : Double;
          m_Stage_V_Position    : Double;
          m_Stage_W_Position    : Double;
      End;

      // 함수 체크 bool 변수 선언
      T_Function_Return_Check                   = Record
          m_b_UVW_Calibration_Setting_Data      : Integer;
          m_b_Calibration_Stage_XY              : Integer;
          m_b_Calibration_Stage_Theta           : Integer;
          m_b_ReadAlignPos                      : Integer;
          m_b_Init                              : Integer;
      End;

      // Cal_Set_Data를 입력받기 위한 변수
      T_Cal_Set_Data                            = Record
          m_UVW_Radius                          : Integer;
          m_UVW_U_Position_Degree               : Double;
          m_UVW_V_Position_Degree               : Double;
          m_UVW_W_Position_Degree               : Double;
      End;

      // Set Degree
      T_Set_Degree                              = Record
          m_Start_Degree                        : Integer;
          m_End_Degree                          : Integer;
          m_Gap_Degree                          : Integer;
      End;


      // 구조체 변수 정의
      T_Structure_Var                           = Record
          m_Calibration_XY_Data_View_L          : T_Calibration_XY_Data;
          m_Calibration_XY_Data_View_R          : T_Calibration_XY_Data;
          m_Calibration_Theta_Data_View_L       : T_Calibration_Theta_Data;
          m_Calibration_Theta_Data_View_R       : T_Calibration_Theta_Data;
          m_Align_Data                          : T_Align_Data;
          m_Align_Result                        : T_Align_Result;
          m_Function_Return_Check               : T_Function_Return_Check;
          m_Cal_Set_Data                        : T_Cal_Set_Data;
          m_Set_Degree                          : T_Set_Degree;
      End;


    Var

      // 구조체의 변수들의 종합해놓은 구조체 변수
      m_Structure_Var : T_Structure_Var;


    m_Structure_Var.m_Function_Return_Check.m_b_ReadAlignPos := 함수4(m_Structure_Var.m_Align_Data, m_Structure_Var.m_Align_Result );

    이렇게 입니다.
  • Profile
    이정욱 2014.03.26 02:37

    그 DLL의 헤더 부분 및 구조체도 알려주셔야 합니다~

    그리고 Record 를 Packed Record 로 변경해서 해보세요~

  • Profile
    gandus 2014.03.28 19:30
    LDC_ReadCalUVWPosition(LD_CAL_UVW *pStageCalUVW)

    LDC_WriteCalXY(LD_CAL_XY ViewL, LD_CAL_XY ViewR)

    LDC_ReadAlignPosition(LD_ALN_PARS AlignData, LD_STG_PARS *pStageData)


    struct stCalUVWPosition {
     double m_StgUPos[34];
     double m_StgVPos[34];
     double m_StgWPos[34];
    } LD_CAL_UVW;


    struct stCalXY {
     double m_VwX[34];
     double m_VwY[34];
    } LD_CAL_XY;


    struct stAlignData {
      double m_VwLX;      // 화면 좌측 X 좌표       
      double m_VwLY;       // 화면 좌측 Y 좌표
      double m_VwRX;      // 화면 우측 X 좌표
      double m_VwRY;      // 화면 우측 Y 좌표
    } LD_ALN_PARS;

    struct stStageData {
     double m_StgUPos;   // Calibration된 Stage U 보정 값
     double m_StgVPos;   // Calibration된 Stage V 보정 값
     double m_StgWPos;  // Calibration된 Stage W 보정 값
    } LD_STG_PARS;

    dll 프로그램 입니다.
  • Profile
    이정욱 2014.03.30 20:40

    델파이의 구현 부분과 DLL 헤더파일의 내용이 전혀 다르게 보입니다...

    같은 부분을 올려주신 것이 맞나요..?


  • Profile
    gandus 2014.04.01 01:33

    함수 4가 , 헤더에 LDC_ReadAlignPosition 입니다.

  • Profile
    이정욱 2014.04.01 02:26
    그렇다면 

    Type
    T_Align_Data = Packed Record
      m_VwLX : Double;      // 화면 좌측 X 좌표       
      m_VwLY : Double;       // 화면 좌측 Y 좌표
      m_VwRX : Double;      // 화면 우측 X 좌표
      m_VwRY : Double;     // 화면 우측 Y 좌표
    end;

    P_Align_Result = ^T_Align_Result;
    T_Align_Result = Packed Record
     m_StgUPos : Double;   // Calibration된 Stage U 보정 값
     m_StgVPos : Double;   // Calibration된 Stage V 보정 값
     m_StgWPos : Double;  // Calibration된 Stage W 보정 값
    end;


    Function LDC_ReadAlignPosition(m_Align_Data : T_Align_Data ; m_Align_Result : P_Align_Result) : Integer 

    위처럼 정의 하면 될 것 같은데요... 

    올려주시지는 않으셨지만 물론 LDC_ReadAlignPosition함수의 리턴값이 Integer일 경우 입니다.

    • 민환민준빠
      2015.07.02 18:44
      자체 해결 Panel 이 문제네여 .. -_-;;;
    • 바람순이
      2015.06.10 23:38
      Mozilla Firefox(35.0.1)에서 글 및 댓글을 달았습니다.
    • JangHeeJin
    • 2015.06.03 03:48
    • 7 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.06.03 12:01
      http://codeverge.com/embarcadero.delphi.general/better-code-for-writing-reading-th/1067762 를 참고해...
    • JangHeeJin
      2015.06.04 01:21
      답변감사합니다 저기 나오는 함수들중 아무거나 사용해도 무관한건가요? 비슷한 함수 들이 많은거같...
    • 이정욱
      2015.06.04 03:45
      시도해보시는것이 기술을 가장 빨리 습득하는 방법입니다.
    • JangHeeJin
      2015.06.05 02:50
      485방식으로 읽으니 이런식으로 데이터가 올라오는데 왜 그런건가요?
    • 이정욱
      2015.06.06 01:16
      소스를 봐야 알 수 있을 듯 합니다. 참고로 시리얼 통신에서는 맞춰줘야할 것들이 있습니다. 컴포넌트로 ...
    • 바람순이
      2015.06.10 23:52
      리더기에서 순수하게 RF-Card 데이터만 넘어오는것이 아니고 Header도 같이 넘어옵니다. 그리고 데이터는 ...
    • 바람순이
      2015.06.10 23:59
      procedure Tform1.VaCommRxChar(Sender: TObject; Count: Integer);var rChr: Char;    Cnt: integer;    s...
    • 이정욱
      2015.05.29 10:20
      Delphi 2010 이 최신 업데이트까지 다 입혀진 상태여야 합니다. 한번 확인해 보세요~
    • 이정욱
      2015.05.26 18:08
      LinePen.Width 속성을 이용해 보세요~
    • 난이화
      2015.05.27 15:06
      답변 감사 합니다. 그러나 Chart1.Series[30].LinePan.width 나 Chart1.SeriesList[1].LinePan.Width ...
    • 이정욱
      2015.05.27 21:38
      (Chart1[0] as TLineSeries).LinePen.Width := 4;  이런식으로 한번 사용해 보세요~
    • 난이화
      2016.10.20 02:20
      답변이 아주 늦어 죄송합니다.  감사 합니다.
    • 이정욱
      2015.05.23 09:16
      http://www.devtools.co.kr/m_mall_detail.php?ps_goid=125&ps_goid=125 을 이용하시면 되실 듯 ...
    • ULP
    • 2015.05.05 22:49
    • 2 COMMENTS
    • /
    • 0 LIKES
    • ULP
      2015.05.05 23:07
      var  F : TFileStream;  buf : Array of Char;begin  F := TFileStream.Create('파일 명',fmOpenRead);  tr...
    • 이정욱
      2015.05.06 08:52
      아.. 몰아서 넣으셨다는 뜻이 여러개의 동적배열의 크기를 미리 메모리를 확보해 놓으셔서 그러셨던것 같습...
    • 김미경
    • 2015.05.05 00:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.05.05 10:19
      TAdvStringGrid라면 TMS사의 컴포넌트인데, 꽤 전통있고 유명한 컴포넌트 죠. 특히 바로 이 그리드 때문에...
    • 이정욱
      2015.04.22 09:05
      OnResize 이벤트에서 크기에 맞게 다시 그려주세요..
    • 이정욱
      2015.04.22 09:35
      Option에서 라이브러리의 Search Path 에 해당 경로를 추가해보십시오.
    • 횬이
    • 2015.03.27 02:38
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.03.27 09:40
      일단 DataSource 라는 개념을 이해 하시면 됩니다. TTable 이나 TQuery는 Dataset 이라는 것을 알아두시...
    • 횬이
      2015.03.27 17:42
      안녕하세요~ 설명해주셔서 감사합니다... 근데 DataSource Dataset에 TQuery로 설정을하게되면 "datasourc...
    • 이정욱
      2015.03.25 06:00
      http://blog.dummzeuch.de/2013/11/10/delphi-20052006-on-windows-8-1/  위 사이트를 참고 하시면...
    • 동키호테
      2015.03.25 18:10
      답변 감사합니다. 저도 그 링크는 보고 따라서 해봤는데, 안 되더라구요. 그래서, embarcadero 에 문의를...
    • jin
    • 2015.03.17 18:54
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.03.19 08:44
      값을 할 당 하시는 부분이 어느 부분이신지요...? 그냥 따옴표로 묶어서 하시는것인지, 아니면 변수를 넣...
    • jin
      2015.03.19 18:06
      소스는 아래와 같습니다. 스레드를 사용하지 않으면 잘되는데 스레드를 사용하면 변수 값이 변경됩니다.pro...
    • 이정욱
      2015.03.20 03:15
      음... 이상하네요. 저는 델파이 2007을 사용하는데 변수값이 변경되지 않고 잘 넘어 옵니다... 언어적으로...
    • 쿠로로
    • 2015.03.14 03:09
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.03.19 08:45
      그냥 Uses 절에 넣으시면 됩니다... 물론 해당 PAS파일이 버전에 맞게 잘 작성되어있다면 말이죠...
    • 쿠로로
      2015.03.23 05:07
      .pass파일의 경로는 어떻게 해야 하나요? uses절에 넣는다고 모든 경로를 검색할꺼 같지는 않습니다...
    • 이정욱
      2015.03.24 04:50
      프로젝트와 같은 경로에 있던지, 아니면 그 유닛이 있는 경로를 Option 에서 Library Search Path 에 추가...
    • 이정욱
      2015.03.04 07:11
      한글 데이터들을 유니코드로 변환해 놓으시던지, 아니면 조회 전에 한글을 안시코드로 변환 후 쿼리를 해야...
    • phono
      2015.03.03 08:09
      gdb파일이 쉽게 깨지는 파일이 아닙니다. 제 추측으론.. db를 핸들링 하실때..  db쪽에 커밋이 바로 작동...
    • 카카오톡
      2015.03.13 18:56
      감사합니다. 결국 엑셀에 있는데이터 다시 올리는  프로그램 만들어서 올렸네요 ㅎㅎ 감사해요
    • 이정욱
      2015.01.30 06:20
      Main 폼에 사용하신 ApplicationEvent 컴포넌트 라는것에서 다 먼저 가져가는것 같네요. 모달폼을 띄우기 ...
    • 윤박사
    • 2014.04.01 03:31
    • 0 COMMENTS
    • /
    • 0 LIKES
    • gandus
    • 2014.03.25 02:50
    • 10 COMMENTS
    • /
    • 0 LIKES
    • 백록화
      2014.03.25 03:34
      1. 코딩중 단축키 Ctrl+Space , Ctrl+Shift+Space 로 코드컴플레이션, 툴팁 심볼 인싸이트 같은 코드 인싸...
    • gandus
      2014.03.25 06:52
      호출하는 함수에서 para3의  para2 구조체에 반환값을 줘서요
    • gandus
      2014.03.25 06:56
      C로 제작된 dll을 쓰는데, 소스로 확인해보니 c로 쓰레기값이 넘어가서...
    • 이정욱
      2014.03.25 08:14
      dll 을 호출하기 위해 선언한 부분을 알려주셔야 할 듯 합니다. cdecl 인지 stdcall 인지...
    • gandus
      2014.03.25 18:14
      Function 함수4(m_Align_Data : T_Align_Data ; var m_Align_Result : T_Align_Result) : Integer  cdecl; ...
    • 이정욱
      2014.03.26 02:37
      그 DLL의 헤더 부분 및 구조체도 알려주셔야 합니다~ 그리고 Record 를 Packed Record 로 변경해서 해보세요~
    • gandus
      2014.03.28 19:30
      LDC_ReadCalUVWPosition(LD_CAL_UVW *pStageCalUVW)LDC_WriteCalXY(LD_CAL_XY ViewL, LD_CAL_XY ViewR)LDC_...
    • • • •