디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

아!!!동적배열이 도데체 뭐야..!!!알려주실분

ㅇㅇㅁㄴㅇㄹ(220.76) 2009.09.21 17:45:05
조회 146 추천 0 댓글 18

#include <Windows.h>
#include "resource.h"

//함수원형 및 전역변수 선언
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
DWORD RecvData(LPVOID);// 수신 전용 스레드
HWND hWndMain;
HANDLE hFile;
int  nSwitch;
int  Baud=0;
DCB  dcb;
TCHAR *items[]={"1200","2400","4800","9600","19200","38400","57600","115200"};

//이름과 메시지를 함께 보낼 구조체
struct FULL

 char szId[100];//아이디 입력받을 배열

 char szBuffer[100]; //내용 저장 받을 배열 
 
};


//대화상자 생성
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrechInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), hWndMain, (DLGPROC)DlgProc);
 return TRUE;
}

//대화상자의 메시지를 처리할 프로시저
BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

 char szFull[500];//아이디와 내용을 연결하기 위한 배열
 char szResult[200];//현재 dcb상태 저장할 배열
 int i;//콤보박스에 항목 넣기 위해 쓰이는 변수
 switch(msg)
 {
 case WM_INITDIALOG:
  hWndMain = hWnd;
  
  //콤보박스에 items배열에 저장된 BaudRate 값들을 넣는다
  for(i=0;i<8;i++)
  {
   SendDlgItemMessage(hWndMain,ID_COMBO_BAUD,CB_ADDSTRING,0,(LPARAM)items[i]);
  }
  return TRUE;

 case WM_COMMAND:
  switch(LOWORD(wParam))
  {
  //콤보박스에서 이벤트가 발생할 경우
  case ID_COMBO_BAUD:
   switch(HIWORD(wParam))
   {
   //콤보박스에서 BaudRate를 선택하면 리턴되는 인덱스가 Baud에 저장된다.
   case CBN_SELCHANGE:
    Baud=SendDlgItemMessage(hWndMain,ID_COMBO_BAUD,CB_GETCURSEL,0,0);
    
    break;
   }
   break;
   
  //OPEN버튼에서 이벤트가 발생할 경우
  case ID_BUTTON_OPEN:
   //수신 스레드 생성
   DWORD nThreadId;
   CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvData, NULL, 0, &nThreadId);
   
   char SelectCom[10];//컴포트를 입력받는 에디트박스에 문자열을 저장할 배열
   
   GetDlgItemText(hWndMain , ID_EDIT_COMSET ,SelectCom,sizeof(SelectCom));//에디트박스에 입력된 문자열을 SelectCom배열로 전송
   
   //SelectCom의 문자열과 "COM3, COM4"와 비교하여 같으면 배열에 입력된 이름을 가진 포트를 연다
   //만약 실패하여 리턴값이 INVALID_HANDLE_VALUE가 나온 경우 포트를 열수없다는 메시지 박스를 연다
   if(strcmp(SelectCom,"COM3")==0||strcmp(SelectCom,"COM4")==0)
   {
     hFile = CreateFile(SelectCom,GENERIC_READ | GENERIC_WRITE,0,0, OPEN_EXISTING,0, 0 );
     
     SetDlgItemText(hWnd,ID_STATIC_STATUS, "Connected");

     if(hFile == INVALID_HANDLE_VALUE)
     {
      MessageBox(0, "Can\'t Open Port", "ERROR", MB_OK);
      SetDlgItemText(hWnd,ID_STATIC_STATUS, "DisConnected");
     }
     SetWindowText(hWndMain, SelectCom);
   }
   else
   {   
   MessageBox(hWnd , "Select COM3 or COM4" , "Error",MB_OK);
   }
   
   
   nSwitch = 1;//스레드 오픈

   //현재 설정된 dcb를 가져온뒤
   //콤보박스의 아이템을 선택할 경우 발생하는 인덱스를 비교하여
   //각각의 경우에 맞는 속도를 설정한뒤
   //포트의 핸들에 dcb정보를 보낸다
   GetCommState(hFile , &dcb);
   switch(Baud)
   {
   case 0:
    dcb.BaudRate = CBR_1200;
    break;
   case 1:
    dcb.BaudRate = CBR_2400;
    break;
   case 2:
    dcb.BaudRate = CBR_4800;
    break;
   case 3:
    dcb.BaudRate = CBR_9600;
    break;
   case 4:
    dcb.BaudRate = CBR_19200;
    break;
   case 5:
    dcb.BaudRate = CBR_38400;
    break;
   case 6:
    dcb.BaudRate = CBR_57600;
    break;
   case 7:
    dcb.BaudRate = CBR_115200;
    break;
   }

   dcb.ByteSize = 8;
   dcb.StopBits = 1;

   SetCommState(hFile , &dcb);
 
   COMMTIMEOUTS Timeout;
   GetCommTimeouts(hFile, &Timeout); 
   Timeout.ReadIntervalTimeout      = MAXDWORD;
   Timeout.ReadTotalTimeoutMultiplier  = 0;
   Timeout.ReadTotalTimeoutConstant    = 0;
   Timeout.WriteTotalTimeoutMultiplier  = 0;
   Timeout.WriteTotalTimeoutConstant    = 0;

   SetCommTimeouts(hFile, & Timeout);


   //szResult배열에 현재 설정된 dcb값들을 저장한뒤
   //화면에 출력한다
   wsprintf(szResult, "BaudRate : %d  ByteSize : %d Parity : %d StopBits : %d ",
       dcb.BaudRate, dcb.ByteSize, dcb.Parity,dcb.StopBits);
   SetDlgItemText(hWnd,ID_STATIC_RESULT, szResult);

   

   
   
   break;

   
  //SEND버튼에서 메시지가 발생한 경우
  case ID_BUTTON_SEND:
   DWORD dwByte;
   FULL full;
   //메시지를 저장한 배열, 아이디를 저장한 배열을 초기화 한다
   memset(szFull,0,sizeof(szFull));
   memset(full.szBuffer,0,sizeof(full.szBuffer));
   memset(full.szId,0,sizeof(full.szId));

   
   //메시지를 입력한 Send에디트와 아이디를 입력한Idfull에 저장된 문자열을
   //구조체의 멤버인 szBuffer와 szId에 저장한다
   GetDlgItemText(hWndMain, ID_EDIT_SEND, full.szBuffer, sizeof(full.szBuffer)); 
   GetDlgItemText(hWndMain, ID_EDIT_ID, full.szId, sizeof(full.szId));

   //szId와 szBuffer을 연결하여 szFull에 저장한다
   strcat(szFull,full.szId);
   strcat(szFull," : ");
   strcat(szFull,full.szBuffer);
   
   //szFull을 리스트박스에 나타낸다
   SendDlgItemMessage(hWndMain, ID_LIST_RECV, LB_ADDSTRING,0 ,(LPARAM)szFull);
   
   //메시지와 아이디가 입력된 값들이 저장되어있는 구조체를 송신한다
   Sleep(20);
   WriteFile(hFile, &full, sizeof(full), &dwByte,0);

   //메시지입력 에디트 박스를 초기화한다
   SetDlgItemText(hWnd,ID_EDIT_SEND, "");

   break;
  
  //CLOSE버튼에서 이벤트가 발생할 경우
  case ID_BUTTON_CLOSE:
   nSwitch = 0;//스레드 종료
   CloseHandle(hFile);//컴포트 닫기
   SetDlgItemText(hWnd,ID_STATIC_STATUS, "DisConnected");
   wsprintf(szResult, "");
   SetDlgItemText(hWnd,ID_STATIC_RESULT, szResult);
   return TRUE;

  //대화상자를 종료할 경우 
  case IDCANCEL:
   nSwitch = 0;//스레드 종료
   CloseHandle(hFile);//컴포트 닫기
   EndDialog(hWnd, 0);//대화상자 종료
   return TRUE;
  }
 }

 return FALSE;
}
//수신전용 스레드
DWORD RecvData( VOID * dummy )     
{
 
 char szFull[500];

 FULL Sendfull;


 while(1)
 {
  int  Written=0;
  DWORD nByte=0;
  Sleep(20);
  memset(szFull,0,sizeof(szFull));
  memset(Sendfull.szId,0,sizeof(Sendfull.szId));
  memset(Sendfull.szBuffer,0,sizeof(Sendfull.szBuffer));

  if(nSwitch)
  {
   ReadFile(hFile,&Sendfull,sizeof(Sendfull),&nByte,0);

   if(nByte<sizeof(Sendfull) && nByte!=0 && nByte!=sizeof(Sendfull))
   {
    Written = nByte;
    while(Written < sizeof(Sendfull))
    {   
     ReadFile(hFile,((char*)&Sendfull)+Written,sizeof(Sendfull)-Written,&nByte,0);
     Written = Written+nByte; 
    }
   }

   if(0!=nByte)
   {
    strcat(szFull,Sendfull.szId);
    strcat(szFull," : ");
    strcat(szFull,Sendfull.szBuffer);

    SendDlgItemMessage(hWndMain, ID_LIST_RECV, LB_ADDSTRING, 0,(LPARAM)szFull);
   }
  }
 }

 return 0;
}

 

-----------------------------------------------------------------------------------

 

여기까지가 소스 전문이고요

RS-232로 시리얼 통신 하는 프로그램을 만들고 있습니다

 

노란색으로 표시한 부분에서

배열을 100,100으로 잡아서 쓰고있는데

메시지를 주고 받을 때 마다 200씩 왓다갔다하니깐 효율적이지 못한것 같습니다

 

이때,

100,100이 아닌 동적배열을 이용하여

에디트 박스에 입력된 문자열 크기 만큼만 배열로 할당해서

주고 받을수 있게했으면 좋겠습니다.

 

빨간색부분이 메시지를 send하고 메시지를 recv하는 건데

이부분에서 어떻게 고쳐야하나요..?

 

malloc을 사용하여 배열의 크기를 자유자재로 움직일 수 있게 하는게 질문입니다..

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 비난 여론에도 뻔뻔하게 잘 살 것 같은 스타는? 운영자 24/06/03 - -
159681 퇴갤한다더니 다시 한번 갑툭튀하고 퇴갤 [1] algo갤로그로 이동합니다. 09.11.29 56 0
159680 횽들 C 질문!!! [5] 홀홀(218.238) 09.11.29 99 0
159679 오늘은 뭘 먹을까? [6] DMW(125.138) 09.11.29 117 0
159678 G스타 다녀왔음 아주아슬갤로그로 이동합니다. 09.11.29 91 0
159677 아 기분 좋아.(저녁 식사 중 클릭 금지) [2] 아주아슬갤로그로 이동합니다. 09.11.29 104 0
159676 크리스마스 전용 바탕화면 [3] 물속의다이아갤로그로 이동합니다. 09.11.29 130 0
159675 블레이드 엔 소울 [8] JuEUS-U갤로그로 이동합니다. 09.11.29 154 0
159674 추버~~~ [4] 이모군(121.124) 09.11.29 54 0
159672 ㅋㅋㅋㅋ [3] 유리한갤로그로 이동합니다. 09.11.29 63 0
159671 구조체요... [10] frog(221.138) 09.11.29 136 0
159670 오늘 고백하러 간다. [7] 숙신갤로그로 이동합니다. 09.11.29 214 0
159668 프로그래머횽들 후배 진로좀 도와줭 ~~! [10] 새내기(121.175) 09.11.29 176 0
159667 문서화 [4] prismatic갤로그로 이동합니다. 09.11.29 87 0
159666 아이폰 인증 <부제 : 예언> [3] AL갤로그로 이동합니다. 09.11.29 171 0
159664 아이폰 인증 [3] New포콜갤로그로 이동합니다. 09.11.29 174 0
159662 그림판 구현해본 횽 계십니까 [9] 어쩌라는갤로그로 이동합니다. 09.11.29 150 0
159661 홀홀횽은 봅니다 [2] 어쩌라는갤로그로 이동합니다. 09.11.29 58 0
159660 DJ DMW 음악 감상 인증 [1] algo갤로그로 이동합니다. 09.11.29 88 0
159659 COM 개초보가 고수형들에게 질문.plz [1] ㄷㄱ(222.120) 09.11.29 68 0
159658 횽들 c하나만 질문좀 ㅠㅠ [17] 홀홀(218.238) 09.11.29 78 0
159657 그냥 해보는 음악방송 [7] DMW(125.138) 09.11.29 109 0
159656 오늘 받은 아이폰 [6] fguy(114.204) 09.11.29 159 0
159655 아싸갤 고전 [5] 유리한갤로그로 이동합니다. 09.11.29 205 0
159654 횽들 나 중국os쓰고있는데 레지스트리 건드려서 바꿀수 있음? [2] ㅈㅈ(113.128) 09.11.29 91 0
159653 훌륭하구나 Chromium [2] algo갤로그로 이동합니다. 09.11.29 112 0
159652 아 ㅅㅂ 모던워페어2 여친도 뺏을 기세 [4] 빕뱟뱟갤로그로 이동합니다. 09.11.29 163 0
159651 C프로그래밍 코딩 조금만 도와주실분.. [4] 찌지리(59.25) 09.11.29 122 0
159650 can't wait!!! [1] 켁큇갤로그로 이동합니다. 09.11.29 73 0
159648 횽들, 질문 하나 합니다. [1] 유휴호갤로그로 이동합니다. 09.11.29 163 0
159647 오사카횽 다이나리눅스 들어있는 PC 아직도 팔어? [1] 양희철갤로그로 이동합니다. 09.11.29 110 0
159645 나는 대체 언제 여친생기냐 -_-;;; [6] DMW(125.138) 09.11.29 202 0
159643 free() 안쓰고 realloc으로 free같은 효과를 낼 수 있나? [31] URA!갤로그로 이동합니다. 09.11.29 161 0
159642 치이 4시간 전엔 말짱하던게 [2] ∫ 2t dt=t²+c갤로그로 이동합니다. 09.11.29 112 0
159641 c->c++->그다음은 시샵???뭘 배우는게 효율적임?? [8] 노소프소갤로그로 이동합니다. 09.11.29 206 0
159640 액션 스크립트 질문여 [1] ㅇㅇ(211.202) 09.11.29 76 0
159638 전자키보드의 미디 신호 알아내는법 가르쳐줘요~ [3] 미디(210.221) 09.11.29 150 0
159637 뇌자알 우선순위큐 C코드를 C++로 바꿔보았다. [5] URA!갤로그로 이동합니다. 09.11.29 206 0
159636 한국갈 짐을 싸는데 JuEUS-U갤로그로 이동합니다. 09.11.29 59 0
159635 횽들 쌍권총 차는게 부모에게 불효하는거 겠죠??? [3] 노소프소갤로그로 이동합니다. 09.11.29 123 0
159633 농면허로 어제 무지하게 싸돌아 다녔다. [1] Pupustory갤로그로 이동합니다. 09.11.29 71 0
159632 잼있네 [2] DMW(125.138) 09.11.29 88 0
159630 그렇게 모두 후로게이가 되어가는 거죠 [1] algo갤로그로 이동합니다. 09.11.29 77 0
159629 재밌다 [4] algo갤로그로 이동합니다. 09.11.29 77 0
159628 형들 뭐좀 물어볼께요 윈도우 복구시디요~ [2] (211.117) 09.11.29 98 0
159627 KT “패킷 장벽 모두 허물겠다” [7] Vita500갤로그로 이동합니다. 09.11.29 190 0
159625 기상!!!! DMW(125.138) 09.11.29 35 0
159624 아 하루하루가 왜이러냐 연어갤로그로 이동합니다. 09.11.29 80 0
159622 php 질문 하나 할께.. [5] 유휴호갤로그로 이동합니다. 09.11.29 86 0
159620 형들~질문하나만 할께요~ CCMON갤로그로 이동합니다. 09.11.29 31 0
159619 님들 잠좀자여 [2] 푸바(118.34) 09.11.29 71 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2