디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇㅁㄴㅇㄹ(220.76) 2009.09.21 17:45:05
조회 150 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
276991 프갤형들 진지하게답변좀 [9] AnonyMous갤로그로 이동합니다. 11.09.30 117 0
276990 블리자드에 지원할땐 아이디/길드활동 내용까지 씀 전간디갤로그로 이동합니다. 11.09.30 120 0
276988 굿모닝 가이들~ [5] Kanon갤로그로 이동합니다. 11.09.30 82 0
276986 진지하게 묻는데, 매킨토시에서 [2] GlennGould갤로그로 이동합니다. 11.09.30 66 0
276983 난 몇일째 4~5시에 자러간다..ㅡ.,ㅡ [2] 이문동쮸쮸바갤로그로 이동합니다. 11.09.30 94 0
276981 넥슨 자소서 쓰는데 가장 즐겨했던 게임에 다른회사 게임 쓰면 좇망임?? [7] 넥슨(110.11) 11.09.30 372 0
276980 형들 개미친질문같은거해서미안한데 [3] ㄱㅇ갤로그로 이동합니다. 11.09.30 112 0
276979 아 횽들 델리게이트 좀 감이 올려고 하는것 같아 [3] hd2갤로그로 이동합니다. 11.09.30 88 0
276974 아니 이런씨발 [1] 이힝(121.177) 11.09.30 58 0
276973 걍 공부 목적이면 안드로이드 1(175.195) 11.09.30 101 0
276969 횽들 델리게이트 왜쓰는지 질문 하나만 해도되? [3] hd2갤로그로 이동합니다. 11.09.30 95 0
276967 형들 자바스크립트 한개만 물어보자 진짜급해 [2] 4(203.90) 11.09.30 71 0
276964 한글파일 비번 풀 수 있는사람한테 5만원드려요. [7] dksdudgh(117.110) 11.09.30 830 0
276963 술쳐먹고 왓느데 왜이리 기분이 안좋을까 [3] 일광면(119.198) 11.09.30 108 0
276962 수발 곧 자바다 오마이갓넬갤로그로 이동합니다. 11.09.30 58 0
276960 아나 학원 개꿀 오마이갓넬갤로그로 이동합니다. 11.09.30 51 0
276959 복습중 ㅅㅅ 오마이갓넬갤로그로 이동합니다. 11.09.30 20 0
276958 프로그래머라고 자부하는사람중에 알바가능한사람없어? [11] 하이(211.230) 11.09.30 229 0
276955 어? 이게 뭐지? [7] elwlwlwk갤로그로 이동합니다. 11.09.29 127 0
276954 형들 C++에서 변수선언을 자동으로 할려면 어케해? [4] ㅇㅇ(112.149) 11.09.29 80 0
276953 아옼 determinant 계산할때마다 결과가 달랔ㅋㅋㅋㅋㅋㅋㅋ [1] SODMaster갤로그로 이동합니다. 11.09.29 34 0
276952 c 제어문 부분에서 [2] 더래갤로그로 이동합니다. 11.09.29 59 0
276951 염치없이 이런거 물어봐도 되는건가요 [5] 모르겠다(124.111) 11.09.29 71 0
276948 형들 C# 배열 질문좀 할게 ㅜㅜ; 이해가 안되서.. 방아깨비갤로그로 이동합니다. 11.09.29 57 0
276947 가을모기 전간디갤로그로 이동합니다. 11.09.29 66 0
276945 아오 4X4 determinant 구하기 ㅡㅡ... [6] SODMaster갤로그로 이동합니다. 11.09.29 634 0
276944 자바프로그래밍 테스트클래스 만들기? [5] 전방수류탄*갤로그로 이동합니다. 11.09.29 82 0
276943 형들 유닉스 하나 더 질문할께요 hongkongball(61.254) 11.09.29 33 0
276942 [짤有] 이 사진 보면 프갤러들도 흠짓 할껄? [3] 숙신갤로그로 이동합니다. 11.09.29 117 0
276941 C++ 제발 답변좀 형들 급해 ㅠㅠ [17] ㅇㅇㅇ(183.106) 11.09.29 167 0
276940 바디밀크// 이거말하는거 아녀? [2] laoshanlong갤로그로 이동합니다. 11.09.29 46 0
276939 접근제한자 떡밥 [2] 1(121.182) 11.09.29 38 0
276938 옥택연 등교사진 떴는데. 걔 어디학교냐 2(220.117) 11.09.29 46 0
276937 . [2] 이힝(121.177) 11.09.29 41 0
276936 여기는 고장난 컴터 물러보는곳 아닙니다. 라고 써있지만 [5] 2(220.117) 11.09.29 87 0
276935 야들아 역경매방식으로 흥할 아이템이 모있겠냐? [2] 우하하항(219.251) 11.09.29 38 0
276934 오늘 운동장 달린 이야기 [5] 개쉛기갤로그로 이동합니다. 11.09.29 94 0
276932 형들아 이문제가 말이되는문제에요 지근? [6] 바디밀크(112.186) 11.09.29 53 0
276931 private.. 예전 내가 처음에 프갤에 올린글 [1] 쿄스케갤로그로 이동합니다. 11.09.29 50 0
276929 형들 유닉스에 관해서 질문 있어요 [8] hongkongball(61.254) 11.09.29 155 0
276927 윤성우 자바책 보고 있는데... [9] constructor(163.152) 11.09.29 216 0
276926 버스다 야 기분좋다 막장갤신학생갤로그로 이동합니다. 11.09.29 28 0
276925 프갤에서 나는노래좀한다 하는사람 손! [3] Light search갤로그로 이동합니다. 11.09.29 69 0
276923 blackd 횽아 봅니다 [5] 분당살람갤로그로 이동합니다. 11.09.29 56 0
276922 나도 생일이라능 [1] ㅋㄱ(183.96) 11.09.29 33 0
276921 윈됴유 프로그램을 만들려는데요 [5] ㅎㅎㅎ(221.160) 11.09.29 51 0
276920 JAVA랑 C#이랑 뭐가 대센가요? [3] 금고래갤로그로 이동합니다. 11.09.29 133 0
276919 10월 9일이 내 생일인데? [5] 좋은아버지갤로그로 이동합니다. 11.09.29 57 0
276918 웹 프랙탈 테스틍 (크롬, 오페라) [3] [성대아싸]갤로그로 이동합니다. 11.09.29 81 0
276917 저 영재도 아닌데 ... [3] 코마만세갤로그로 이동합니다. 11.09.29 59 0
뉴스 블랙아이드필승 라도, KIA 홈경기 시구 출격! 고향팀 KIA 타이거즈 승리 기원 디시트렌드 07.01
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2