디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇㅁㄴㅇㄹ(220.76) 2009.09.21 17:45:05
조회 151 추천 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 - -
AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 45142 65
2869532 나 지금 목표가 이거거든? ㅆㅇㅆ(124.216) 01:56 2 0
2869531 IDA 크랙 구해야하나 [1] 류도그담당(58.239) 01:47 12 0
2869529 비전공자, ㅈ문대, 복학생, 웹개발자 [3] 프갤러(93.152) 01:36 12 0
2869528 읽어도 읽어도 저 많은 천재들과 싸울 자신이 없다. [2] ㅆㅇㅆ(124.216) 01:30 14 0
2869527 프로그래밍 근데 할수록 자신감이 안 생긴다 ㅆㅇㅆ(124.216) 01:27 11 0
2869525 면접볼때마다 [4] 무관갤로그로 이동합니다. 01:07 28 0
2869524 CPP 코드 90%는 C++11 안전 기준 미달 맞음(논문있음) [1] ㅆㅇㅆ(124.216) 01:05 23 0
2869523 도로상태 훌륭 넥도리아(223.38) 01:04 9 0
2869522 동네 도로 환경 순찰 중 어머니폰으로 넥도리아(223.38) 01:01 11 0
2869521 2달 존버하고 받은 금액이 고작 ㅇㅇ(118.235) 00:57 28 0
2869520 내 방 온도 29.3도 발명도둑잡기(118.216) 00:57 10 0
2869519 7월 4일 4시 7월 5일 4시 한국 넥도리아(223.38) 00:55 13 0
2869518 치아교정 때문에 군것질이 약간 줄었다 발명도둑잡기(118.216) 00:55 9 0
2869517 아니, 비야네가 정의한 레거시 코드 기준이랑 다 떠먹여줘도 [1] ㅆㅇㅆ(124.216) 00:50 13 0
2869516 진보적인 외국 정부 부정선거 여론 언론공작은 CIA의 주특기다 발명도둑잡기(118.216) 00:47 12 0
2869515 그냥 차트맨아 내 글을 LLM 아무데나 복사붙여넣기하고 ㅆㅇㅆ(124.216) 00:42 16 0
2869514 가만 보니까 legacy라는 말을 병적으로 해석하는구만 [9] ㅇㅇ갤로그로 이동합니다. 00:40 45 0
2869513 나도 따당이처럼 잘하고 싶노 ㅆㅇㅆ(124.216) 00:39 10 0
2869512 [최우리의 비도 오고 그래서] 기후위기와 범죄의 상관관계 발명도둑잡기(118.216) 00:30 8 0
2869511 차트맨아 농담 아니고, 너 현역에 금융업계 종사 오래한건 알겠는데 ㅆㅇㅆ(124.216) 00:29 17 0
2869510 차트맨아 C++ 책좀 읽어라 왜곡하지말고 그냥 [10] ㅆㅇㅆ(124.216) 00:22 42 1
2869509 Ada, 러스트의 안전성 수준을 동일하게 제약할 때 루비갤로그로 이동합니다. 00:21 9 0
2869508 러스트 극성 지지자들의 '발작' 포인트 요약 루비갤로그로 이동합니다. 00:18 13 0
2869507 Ada vs. Rust: 동일 안전성 수준 코드 비교 루비갤로그로 이동합니다. 00:14 13 0
2869506 나님 흔들고 주무실게양..⭐+ ♥냥덩이♥갤로그로 이동합니다. 00:14 13 0
2869505 오픈소스 PR 날려 본 사람 있음? [1] 익명의따당이갤로그로 이동합니다. 00:13 20 0
2869504 Rust 코드 컴파일 논란: 명백한 허위 주장과 인신공격에 대한 반박 루비갤로그로 이동합니다. 00:10 13 0
2869502 러스트 설치도 못하는 저능아의 마지막 도피처. "llm 환각" 프갤러(110.8) 00:07 14 0
2869501 머리가 너무 복잡하다. 그냥 다 놓고 싶다. ㅇㅇ(223.38) 07.03 19 0
2869500 이력서 20개 찢고옴 [1] 프갤러(221.163) 07.03 25 0
2869499 의뢰인이 자기가 해본 자동 매매 프로그램중 내 것이 제일 [4] ㅆㅇㅆ(124.216) 07.03 41 0
2869498 러스트 중독 분석: 나르시시즘, 에코 챔버, 트라우마 본딩, 매몰 비용 [1] 루비갤로그로 이동합니다. 07.03 19 0
2869496 이런 사람들은 지금 나이 한 50 넘게 먹었으려나 [1] 루도그담당(58.239) 07.03 34 0
2869495 낼 술마셔야좌우징좌우지징 [1] ♥냥덩이♥갤로그로 이동합니다. 07.03 21 0
2869494 요즘 TDD 선구자 캔트백도 바이브 코딩 연구하더라 ㅆㅇㅆ(124.216) 07.03 19 0
2869493 헤일스버그의 파스칼이나 델파이에 관한 최근 생각 발명도둑잡기(118.216) 07.03 15 0
2869492 러까의 유일한 구원자 llm도 맛이 가버린 모양이군 ㅋㅋ 프갤러(110.8) 07.03 15 0
2869491 델파이, 파스칼 안쓰는 이유, 메모리 안전 발명도둑잡기(118.216) 07.03 22 0
2869490 FreePascal 아이디 보니 드는 생각 [1] 발명도둑잡기(118.216) 07.03 19 0
2869489 국산 냥덩❤+ ♥냥덩이♥갤로그로 이동합니다. 07.03 20 0
2869488 퍼프 대디 파티 참석했던 사회 저명인사 명단 [1] 발명도둑잡기(118.216) 07.03 18 0
2869487 러스트에 영혼을 팔은 자의 최후~~~ 루비갤로그로 이동합니다. 07.03 19 3
2869486 내가 몇 년 전 휴대폰 카메라로 동공 크기까지 감시할 거란 글 발명도둑잡기(118.216) 07.03 14 0
2869485 [단독] "이상민 자택서 깜짝 놀랄 거액 발견"…특검, 조사 착수 발명도둑잡기(118.216) 07.03 24 0
2869484 Rust 언어는 예수 믿어야 천국간다고 강요하는 언어입니다 [1] FreePascal갤로그로 이동합니다. 07.03 37 1
2869482 웹백엔드 vs 게임서버 닥전임? ㅇㅇ(211.176) 07.03 12 0
2869480 러빠가 무논리로 내 욕하는 이유~ 루비갤로그로 이동합니다. 07.03 13 0
2869479 땀 닦아주실분? [2] ♥냥덩이♥갤로그로 이동합니다. 07.03 27 0
2869477 동일한 안전성 기준을 볼 때 Ada가 Rust보다 쉽다는... ㅎㅎ 루비갤로그로 이동합니다. 07.03 18 0
뉴스 배우 신구, 부인과 사별…39살 늦깍이로 결혼해 51년간 해로 디시트렌드 07.03
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2