외규장각 도서 환수 모금 캠페인

Search Results for '코딩'

6 POSTS

  1. 2007.08.09 Working Thread 2
  2. 2007.06.11 scanf
  3. 2007.06.11 fgets 와 fscanf
  4. 2007.06.11 fscanf 의 입력 필터링, 선택 기능
  5. 2007.06.11 2차원 배열

Working Thread

Posted 2007. 8. 9. 18:04, Filed under: Study/Computer Science

오늘 열심히 툴을 만들다가 또 쓰레드 때메 지난 번이랑 똑같은 문제로 고생하는 거도 피곤하고-
하나밖에 못넘겨주는 파라미터로 다이얼로그를 넘겨도 UpdateData도 안되고 여기저기 걸리는게 많아서 고생ㅠ
(지난번에 고생해서 알아냈다시피 쓰레드 내에서는 윈도우(UI쪽)를 건드리지 않는 것이 상책이다.)
그래서 이승희 주임님한테 물어봤다 -_-  (창환이 말로는 Windows UI 프로그래밍 쪽으로 일가견이 있으시다고)


[문제점]

UI와 내부 연산을 분리할 것
UI 관련 부분 (윈도우로부터 데이터를 받아오거나 출력하거나, 윈도우 상태를 변경하는 부분) 들이 쓰레드 안에 들어가서 파일을 옮기고 프로세스를 실행하는 등의 실제 연산 중간중간에 박혀있다.
작업 쓰레드 내에서 UI 관련 연산을 하는 건 안좋은 습관.

초기화를 비롯한 실행 조건 처리는 첫부분에서 한꺼번에 할 것
파일을 복사할 경로를 확인하고 파일 복사, V3 경로 확인하고 실행.
이런 식으로 그 때 그 때 확인하는 것보다는 실행하는데 필요한 모든 조건을 확인한 후에 작업을 시작하도록.

예외처리
이 코드에서는 안나타나지만 파일 이동에 대해서 예외처리를 제대로 해주지 않았다.
어떤 이유에서든 연산이 실패할 가능성이 있으면 예외처리 루틴으로 가도록-

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

사실 저 모든게 쓰레드를 제대로 사용할 줄 몰라서 그런거다 -_-
저 연산들이 순차적으로 실행되어야하는 연산이기 때문에 WaitForSingleObject 를 써서 기다려야되는데
Thread의 경우는 WaitForSingleObject의 파라메터로 CThread 포인터를 바로 넘기는게 아니라
CThread->m_hThread를 넘겨줘야 한단다.

전에 한번 WaitForSingleObject 써봤는데 쓰레드만 생성하고 바로 돌아와서 메인쓰레드랑 동시에 실행되는 바람에 순차적 실행이 안됐던 적이 있었는데 핸들값을 잘못 넘겨줬기 때문이었나보다.

여튼 그래서 순차적으로 실행되도록 하려고 쓰레드에 다 밀어넣고 했는데 이러면 안된다고 하시는군.
Cleaner.MoveSample(), V3.Run(), Cleaner.RemoveEmptyFolder() 만 각각 쓰레드를 생성하여 실행하는 것이
좋다고 한다.


Working Thread와 UI Thread를 분리해야한다는 말은 많이 들었지만 어떻게 해야하는지
잘 몰랐는데 대충 이렇게 하는건가;;
조금 깔끔해 진것 같긴 하지만 어설프다. 그래도 그럭저럭 필요한 기능은 전부 구현이 되서 만족 ^^
한가지 아쉬운거라면 저 쓰레드 함수들.. Dialog 밑에 주렁주렁 달려있어서 좀 이상하다는거.
좀 더 깔끔하게 정리된 코드를 짜고 싶다.
디자인 패턴을 공부해야지!

--------------------
굉장히 부끄러운 일이지만 회사에서 코딩을 하다보면 정직원분들이 상식이라고 생각하는 부분을 나는 잘 모르고 있는 경우가 많아서 정직원들이 내 코드를 보면 왜 이런식으로 짰을까- 라고 놀람을 떠나 어이없어하는 경우가 있다 -_- (변수명이라거나 예외처리라거나 하는 기본적인 부분부터 프로그램의 구조같은 것까지 여러가지 면에서)

정말이지 코딩같은건 어디서 체계적으로 배우는게 아니라서 (공이라고 해도 뭔가 체계를 가지고 배운 적은 없다. 이상한 일이긴 하지만) 참 힘들다. 지식도 지식이지만 코딩 습관 또한 중요한 부분을 차지하는 듯하다.





Response : ,

scanf

Posted 2007. 6. 11. 13:45, Filed under: Study/Computer Science

사용자 삽입 이미지



scanf와 관련한 좀 더 자세한 내용.

공백 문자나 변환 할 수 없는 문자를 만나면 입력받기를 중단한다.
seach_set 이나 할당 금지 문자를 지정할 수 있음
Response : ,

fgets 와 fscanf

Posted 2007. 6. 11. 10:40, Filed under: Study/Computer Science
사용자 삽입 이미지


사용자 삽입 이미지


fgets : '\n' 문자를 만날 때까지 문자열을 읽어들이거나 지정된 배열의 크기만큼 분자열을 읽어들인다.
        읽어들인 문자열의 뒤에는  NULL 문자가 삽입되므로 바로 출력에 사용할 수 있다.
Response : ,

fscanf 의 입력 필터링, 선택 기능

Posted 2007. 6. 11. 10:30, Filed under: Study/Computer Science
[질문] fscanf(fd,"%*[^\n]"); 이게 무슨 뜻인지 좀 가르쳐 주세요~~^^;;
원문 링크

Q.  
코드 분석중에 fscanf(fd,"%*[^\n]");

이런 코드를 발견 했습니다..파일로 부터 읽는 것 같은데.. %*[^\n]
이것이 무엇을 의미하는지 모르겠습니다..

아시는 분 부탁드립니다..^^;;;


A. 
*는 입력을 읽기는 읽되 어떤 변수에 저장하지 않고 건너뛰는 것입니다.

예를 들어

int i;
scanf("%*d%d", &i);

에서 "1 2"를 입력하면 1은 건너뛰고 i의 값은 2가 됩니다.

그리고 []로 묶인 포맷 지정자를 scanlist라고 부릅니다. 문자열을 입력랄 때
scanlist에 명시된 글자만을 입력으로 받겠다는 뜻
입니다.

예를 들어


char number[10];
scanf("%[0123456789]", number);

에서 "123abc"를 입력하면 number는 "123"이 됩니다.
scanlist 안의 ^는 scanlist에 명시된 글자를 제외한 것만 입력하겠다는 뜻이고요.
그러니까 "%*[^\n]"은 end-of-line('\n')이 나오기 전까지 읽어서 버리겠다는 뜻입니다.

Submitted by doldori on 목, 2006/08/17 - 5:49pm.
---------------
이런 것도 있었군~
메뉴 선택 같은 부분에서 지정된 값 이외에 쓸데없는 입력이 들어오는 것을 필터링할 때 사용하면 굉장히 유용할 듯..
Response : ,

2차원 배열

Posted 2007. 6. 11. 00:11, Filed under: Study/Computer Science

다차원 배열의 동적할당

사용자 삽입 이미지

먼저 1번처럼 1차원 배열을 가리키는 포인터의 배열을 할당한 후에 2번과 같이 1차원 배열들을 할당해주어야 2차원 배열의 공간을 할당할 수 있다. 그렇지 않을 경우에 접근 제한 에러를 발생시키게 된다.


함수에 다차원 배열 전달하기

char array[100][100] 과 같이 선언된 이차원 배열을 함수로 넘겨줄 때 char** 타입으로 배열의 시작 주소를 넘기면 안됨. 이처럼 넘겨줄 경우에 배열의 주소 연산을 할 수가 없음.
이는 메모리 상에서 1차원으로 저장된 2차원 배열에서 인덱스를 통해 배열 요소에 접근 할 때인덱스가 하나 증가하면 얼마만큼의 메모리 공간을 이동해서 접근해야하는지 알 수 없기 때문이다. 

array[1][2] 와 같이 참조하였을 때 배열의 크기에 따라 해당하는 배열 요소의 메모리 상에서의 위치가 달라진다는 것.

그러므로 함수의 파라메터로 넘겨줄 때 char [][100] 과 같은 형태로 전달해주어야한다.

---------------
이상ㅡ 어제 창희 숙제 도와주다가 삽질한 것들 -_-;
예전에 다 했던 것들이고 굉장히 기본적인 것인데도 잘 까먹는다.
Response : ,


Recent Posts

Recent Comments

Recent Trackbacks

Total hit (Today , Yesterday )

Admin Write Post