지금 까지 PC에 깔린 plugin은 편집 중인 버퍼 전환을 위해 minibufexpl이 고작이었고, 별 불편함이 없었는데, 며칠전 괜찮은 plugin을 찾았다.
- 소스파일과 헤더파일 전환을 도와주는 a.vim
- Doxygen 형태의 주석을 달아주는 DoxygenToolkit.vim
int A[] = {1,2,3};이렇게 하고 나면 A에는 {1,3,2}가 저장되는데, {1,2,3}으로 만들수 있는 조합 중 다음번 조합을 구하는 함수이다.
int N = sizeof(A) / sizeof(int);
next_permutaion(a, N)
#include
#include
#include "cgreen/cgreen.h"
#define FALSE 0
#define TRUE 1
void PrintArray(int *start, int *end)
{
while(start != end) {
printf("%d ", *start);
start++;
}
printf("\n");
}
/**
* [start, end]에 num이 있는지 검사.
* 있으면 TRUE, 없으면 FALSE를 return한다.
*/
int is_exist(int *start, int *end, int num)
{
while(start <= end) {
if(num == *start) return TRUE;
start++;
}
return FALSE;
}
/**
* [start, end]를 검색해서 중복되지 않고 end에 사용할수 있는
* 숫자를 return한다.
*
* 예를 들어 [0,1,2]면 *num은 3을 가진다.
*/
int guess_number(int *start, int *end, int *num)
{
int i = 0;
int try = *end;
for(i = *end; i < 10; i++) {
if(is_exist(start, end, i) == FALSE) {
*num = i;
return TRUE;
}
}
return FALSE;
}
/**
* [start, end)에 저장되어 있는 조합 다음의 조합을 구한다.
* 가능한 조합이 있으면 TRUE, 없으면 FALSE를 return하고
* 결과는 [start, end)에 저장된다.
*
* Ex)
* int A[4] = {1,2,4,6};
* next_perm(A, A+4)
* ==>
* A는 {1,2,4,7}이 저장된다.
*/
int next_perm(int *start, int *end)
{
int *adj_ptr = end-1;
int num = 0;
while(adj_ptr >= start && adj_ptr < end) {
/*
* start ~ adj_ptr까지 검색결과 마지막 자리에 넣을 숫자가
* 있는지 검사.
* 있으면 adj_ptr에 그 숫자를 넣고,
* 없으면 adj_ptr을 앞으로 이동하여 다시 검사한다.
*/
if(guess_number(start, adj_ptr, &num) == TRUE) {
*adj_ptr = num;
adj_ptr++;
if(adj_ptr == end) {
return TRUE;
}
}
else {
*adj_ptr = -1;
adj_ptr--;
}
}
return FALSE;
}
void test_is_exist()
{
int A[4] = {1,2,3,4};
assert_equal(is_exist(A, A+4, 4), 1);
assert_equal(is_exist(A, A+4, 3), 1);
assert_equal(is_exist(A, A+4, 1), 1);
assert_equal(is_exist(A, A+4, 0), 0);
}
void test_guess_number()
{
{
int A[4] = {1,2,0,4};
int result;
assert_equal(guess_number(A, A+3, &result), 1);
assert_equal(result, 5);
}
{
int B[4] = {1,2,3,9};
int result = 0;
assert_equal(guess_number(B, B+3, &result), 0);
assert_equal(result, 0);
}
}
void test_perm()
{
int A[4] = {1, 2, 3, 4};
assert_true(next_perm(A, A+4));
}
int main(int argc, char *argv[])
{
if(argc == 2 && strcmp(argv[1], "-test") == 0) {
TestSuite *suite = create_test_suite();
add_test(suite, test_is_exist);
add_test(suite, test_guess_number);
add_test(suite, test_perm);
run_test_suite(suite, create_text_reporter());
return 0;
}
int A[] = {0, 9, 8};
int N = sizeof(A) / sizeof(int);
printf("inital value...\n");
PrintArray(A, A+N);
printf("next permutation is...\n");
next_perm(A, A+N);
PrintArray(A, A+N);
/*
while(next_perm(A, A+N)) {
PrintArray(A, A+N);
}
*/
}
Mutex로 Lock(semTask)했을 경우 Lock한 thread에서만 Release(SemGive) 할수 있고... Lock한 thread가 다시 진입할때는 Ownership Count를 증가시키고 진입이 가능하다.
mplayer -vo null -ao pcm 동영상파일powered by performancing firefox
powered by performancing firefox
powered by performancing firefox