반응형

Software Version Control을 위해 연구실에서 사용중인 Svn을 Visual Studio와 함께 사용하기 위하여


다음과 같이 플러그인을 깔아 설정하여 사용했다.


아래의 링크에 들어가 Plug-in 최신버젼을 받는다. 현재 VS 2012까지 지원하는 모양이다.


http://www.visualsvn.com/visualsvn/download/


모든 기능을 사용하기 위해서는 tortoisesvn도 깔려있어야 한다 같이 깔아주자


http://www.visualsvn.com/visualsvn/download/tortoisesvn/


Visual Studio가 켜있다면 끈 상태로 설치를 진행하자

설치는 큰 문제없이 진행할 수 있다.


1. Subversion URL 설정하기


(1) VisualSVN>Get Solution from Subversion 을 클릭한다



(2) URL과 이름 다운받고자하는 위치를 지정한다.




(3) OK를 누르면 자동으로 Check Out이 진행된다.



2. 사용하기


Check Out하여 사용하다보면 위와같이 노란색으로 수정되어 Commit될 부분이 표시된다


Commit을 원하는 폴더 혹은 파일을 우클릭 Commit하게 되면 다음과 같은 창과 함께 Commit할 수있다



Update및 Log보기도 위와 같은 방법으로 폴더 파일별로 우클릭후 사용하면된다.


전체 Solution별로 Commit및 Update가 가능하므로 그대로 사용하면 전체 프로젝트를 관리할 수 있다.






반응형
반응형

연구실에서 MultiProcessor로 구성되어있는 Processor를 Full로 돌려서,  사용할 일이 있는데
처음에는 Bash shell의 &를 통한, 간단한 구현으로 여러 Process를 돌렸다. 하지만
시간이 약간씩 Loss가 되는(여러작업을 Continuous하게 돌리기 때문에) 일이 발생하였다.
그래서
fork()함수와 execl()함수를 이용한, 여러 Process를 Countinous하게 구동하는 예제를 작성하였다.

TOTAL_PS 는 전체 Process의 개수
NUM_PARA_PS는 동시에 진행할 Process의 개수를 의미한다.

fork()함수는 동일한 child process를 하나더 return하며, Pid가 0인것으로 child와 그렇지 않은 process를 구분한다.

exelc()는 다른 프로그램을 실행해 주는 것으로, exelc(경로, 이름, args, NULL)과 같은 형태로 사용한다.

예제
###c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define TOTAL_PS 9
#define NUM_PARA_PS 4


int main(int argc, char** argv)
{
  pid_t pids[TOTAL_PS];
    char num[10] = "123456789";
    char * args;
  int i;
  int n = NUM_PARA_PS; 

  for(i = 0; i < n ; i++)
    {
            if((pids[i] = fork()) < 0 ){
                perror("fork");
                return -1;
            }
            else if(pids[i] == 0) {
                args = (char*)malloc(sizeof(char));
                args[0] = num[i];
                execl("./clock", "clock", args, NULL);
                printf("%c\n", num[i]);
                exit(0);
            }
    }

    int status;
    pid_t pid;
    int num_run_ps = NUM_PARA_PS;

    while( (num_run_ps) != TOTAL_PS ) {
        pid = wait(&status);
        printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
        if((pids[num_run_ps] = fork()) < 0) {
            perror("fork");
            return -1;
        }
        else if(pids[num_run_ps] == 0) {
            args = (char*)malloc(sizeof(char));
            args[0] = num[num_run_ps];
            execl("./clock", "clock", args, NULL);
            printf("%c\n", num[i]);
            exit(0);
        }
        num_run_ps++;
    }

    for(i = 0; i < NUM_PARA_PS; i++)
        {
            pid = wait(&status);
            printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
        }
}








반응형
반응형
Dialog를 사용하였을때, 우리는 위의 표시줄을 없앤채로 사용할 수 있다.
그 경우에는 다이얼로그의 위치를 옮기게 만드는데 상당히 문제가 있다.
따라서, 다음과 같은 작업으로 테두리 드래그를 통해 다이얼로그를 옮길 수 있다.

클레스 마법사에서 메세지중, ON_NCHITTEST에 해당하는 것을 추가하고 다음과 같은 내용을 해주면 된다.

아래코드는
Board의 윗부분을 클릭했을 때,
System 함수를 클릭한것과 같은 Return값을 보여주게 된다.

LRESULT SizeWindowDlg::OnNcHitTest(CPoint point)
{
    // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
    UINT nHitTest = CDialog::OnNcHitTest( point );

    return ( nHitTest == HTTOP  ) ? HTCAPTION : nHitTest;
}

MSDN에서 HTTOP과 HTCAPTION을 검색하면, 다른 Dialog위치들에 대한 수정도 가능하다.
반응형
반응형
Dialog 에 OnInitDialog()함수내에 다음과 같은 구문을 추가하면 된다.

BOOL SizeWindowDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    typedef BOOL(WINAPI *SLWA)(HWND,COLORREF,BYTE,DWORD);
    SLWA pSetLayeredWindowAttributes = NULL;
    HINSTANCE hmodUSER32 = LoadLibrary(_T("USER32.DLL"));
   
    pSetLayeredWindowAttributes =    (SLWA)GetProcAddress(hmodUSER32,"SetLayeredWindowAttributes");

    HWND hwnd = this->m_hWnd;
    SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE) | WS_EX_LAYERED);
    BYTE byAlpha = 70; //투명도 설정
    COLORREF cr = GetSysColor(COLOR_BTNFACE);
    SetLayeredWindowAttributes( cr, byAlpha, LWA_COLORKEY );

return TRUE;
}


마지막의 LWA_COLORKEY 옵션의 변경을 통하여 여러 형태의 Dialog가 가능하다.

나머지는 MSDN을 참고하여 수정가능함
반응형
반응형
1. Fseek
Fopen으로 얻은 파일포인터 내에서 위치를 이동한다.
int fseek ( FILE * stream, long int offset, int origin );

stream - 작업을 수행할 스트림의 FILE 객체를 가리키는 포인터
offset - orgin 으로 부터 얼마나 떨어진 곳에 설정할 지에 대한 값
origin -

<stdio.h> 에 정의된 다음과 같은 상수들을 이용한다.
SEEK_SET 파일의 시작
SEEK_CUR 현재 파일 포인터의 위치
SEEK_END 파일의 끝

예제)
#include "stdio.h"
FILE *fp = fopen("test.txt","r");
fseek(fp, 0, SEEK_SET);


2. Feof
파일포인터 내에서 파일의 끝까지, 탐색하는 함수

Return
인자로 전달된 스트림의 파일 끝 지시자가 설정되어 있다면 0 이 아닌 값을 리턴한다.
그렇지 않을 경우 0 이 리턴된다.

int feof ( FILE * stream );

while(!feof(fp)){
    fscanf(fp,"%c",&temp);
}

반응형
반응형
아래 예제는 대문자에서 소문자로 변화해주는 예제 입니다.

ASCII Code표의 대문사 소문자 값의 차이를 이용해 구현하는 것으로

대문자는 ASCII 코드 65에서 90번 사이의 값을 갖습니다.

아스키코드표
http://ko.wikipedia.org/wiki/Ascii

char *small_letter(char *input){
  char *temp = (char*)malloc(sizeof(char)*256);
  for(unsigned int i = 0 ;; i++){
      if((input[i]>=65) && (input[i] <= 90)){
          temp[i] = (input[i] + 32);
      }
      else {
          temp[i] = input[i];
      }
      if(input[i] == '\0') break;
      if(input[i] == '\n') break;
  }
  return temp;
}

반응형
반응형
scandir을 이용하여, 파일리스트와 폴더리스트를 불러오는 방법이다

필수적으로,

참고 Link
fstat : http://codewiki.wikidot.com/c:system-calls:fstat
s_islnk: http://www.freepascal.org/docs-html/rtl/oldlinux/s_islnk.html

요구 include Files
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>

long_t getFileList(const str_t dir, str_t*& list)
{
     /* Scan directory */
     struct dirent** pp_item;
     struct stat fstat;

// scandir 함수를 이요해서 파일과 디렉토리 내용을 가져온다
     long_t item_cnt = scandir(".", &pp_item, NULL, alphasort);

     /* Count files */
     long_t file_cnt = 0;
//파일 개수만큼 loop를 돌린다.
     for(long_t i = 0; i < item_cnt; i++) {

//현재 폴더와 이전폴더는 무시하고
         if(!strcmp(pp_item[i]->d_name, ".") || !strcmp(pp_item[i]->d_name, "..")) continue;

         lstat(pp_item[i]->d_name, &fstat);
//Regular file과 Simbolic Link file일 경우
         if(S_ISREG(fstat.st_mode) || S_ISLNK(fstat.st_mode)) file_cnt++;
     }

     /* Allocate memory */
     str_t* pp_list;
     pp_list = new str_t [file_cnt];

     /* Copy the filenames to list */
     long_t index = 0;
     for(long_t i = 0; i < item_cnt; i++) {
         if(!strcmp(pp_item[i]->d_name, ".") || !strcmp(pp_item[i]->d_name, "..")) {
             free(pp_item[i]);
             continue;
         }

         lstat(pp_item[i]->d_name, &fstat);
         if(S_ISREG(fstat.st_mode) || S_ISLNK(fstat.st_mode)) {
             pp_list[index] = new char_t [strlen(pp_item[i]->d_name) + 1];
             strcpy(pp_list[index], pp_item[i]->d_name);

             index++;
         }
         free(pp_item[i]);
     }
     free(pp_item);

     list = pp_list;

     return file_cnt;
}
반응형
반응형
리눅스상에서 우리는 쉽게
-o, -i, -p, -a, -l 등 옵션을 적용할 수 있는 프로그램을 볼 수 있다.
위와같은 프로그램은 getopt로 간단하게 구현할 수 있다.

필요 Include 파일
#include "stdio.h"
#include "stdlib.h"
#include <unistd.h>

사용하는 함수
int getopt(int argc, char ** argv, const char *options)   

사용되는 변수
int opterr : 이변수값에 0이아닌 숫자를 넣으면, 알지 못하는 옵션이 들어오면 표준 에러 메세지를 출력해 준다

int optopt :  알지 못하는 옵션의 문자를 이 변수에 저장한다.

int optind : 다음 옵션의 index값을 지정해 준다. 이를 활용하여 옵션이 있는경우 없는경우 구분 할 수 있다. 초기값은 1.

cahr * optarg : 인수를 받아들이는 옵션들의 argment를 저장해 준다.

소스코드

    int oc;
    ci_name = init;
    int num_sfr_in=0, num_sfr_out=0;
    int num_con=0;
    if(argc == 1){
        printf ( "./citemgen <optinons> \n        -n    :    Custon Instruction Name\n        -i    :    Number of input SFR\n        -o    :    Number of output SFR\n        -c    :    Number of Control bit\n\n");
        return 1;
    } else {
//Get opt를 통하여 현재 존재하는 모든 option을 받아온다.
// " " 안에 들어가는 내용은, 어떠한 옵션들을 적용할 수 있는지 나타내 준다
// 뒤에: 가 붙을 경우 -o test 와 같이 추가 인자를 필요로 한다는 뜻이다.
        while ((oc=getopt(argc,argv,":n:i:o:c:")) != -1 )
        {
            switch(oc)
            {
                case 'n':
                    //fprintf(stdout,"option : n\n");
                    ci_name=optarg;
                    break;
                case 'i':
                    //fprintf(stdout,"option : si\n");
                    num_sfr_in=atoi(optarg);
                    break;
                case 'o':
                  //  fprintf(stdout,"option : si\n");
                    num_sfr_out=atoi(optarg);
                     break;
                case 'c':
                    //fprintf(stdout,"option : si\n");
                    num_con=atoi(optarg);
                    break;
//추가 인자가 필요한 Function인데, 추가 인자가 오지 않았을 경우
                case ':':
                    fprintf(stderr,"%s : option '-%c' requires an argument\n",argv[0],optopt);
                    break;
//모르는 인자가 옵션으로 나타났을 경우
                case '?':
                default:
                    fprintf(stderr,"%s : option '-%c' is invalid : ignored\n",argv[0],optopt);
                    break;
            }
        }
옵션이 없는경우의 처리

   for(int i = optind; i < argc ; i++){
         ...
   }
반응형

+ Recent posts