'devel/man & example'에 해당되는 글 19건

  1. 2012.01.28 strstr
  2. 2011.12.24 arm inline assembly
  3. 2011.12.09 thread starvation
  4. 2011.11.27 scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기 2
  5. 2009.11.24 function pointer
  6. 2009.11.08 sprintf int to ascii
  7. 2008.12.02 C++ , C File OUTPUT e.g.
  8. 2008.05.25 String Parsing
  9. 2007.05.01 bit shift e.g. , 2dim matrix, Defed Func

2012. 1. 28. 13:13 devel/man & example

strstr

const char DELIM[2] = {'$', '%'};
char* temp = strsrt("1234$%ABCD", DELIM);


vs

char* temp = strstr("1234$%ABCD", "$%");



같은 코드 같지만 다르다
전자는 틀린 코드이고 후자가 맞는 코드이다
이것 때문에 6시간을 날려먹었다


const char DELIM[3] = {'$', '%', 0}
이렇게 null로 terminate되는 문자열을 delimiter로 지정해야 한다OTL

'devel > man & example' 카테고리의 다른 글

#define function macro  (0) 2012.07.15
#define 문자열 치환 및 합치기  (0) 2012.07.15
arm inline assembly  (0) 2011.12.24
thread starvation  (0) 2011.12.09
scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
Posted by 쵸코케키

http://richard.giliam.net/?p=20
가장 쉬운 예시

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3540.html
그 다음 쉬운 예시

http://www.ethernut.de/en/documents/arm-inline-asm.html
위랑 비슷하긴 한데 조금 다른 예시


http://vada.skku.ac.kr/ClassInfo/comp-arch/SoC-arch/%B8%F0%B5%E205_%C7%C1%B7%CE%BC%BC%BC%AD_%BC%B3%B0%E8_%BD%C7%BD%C0_I.pdf
그 외에 추가로 반드시 알아야 할 내용들 (문법들이나 기타 등등)
아 한글이다... 그래서 좋음


기타 x86 예제

kernel vdso에 있는 파일

vdso_test.c

104 asm (
105     "".text"\n"
106     "".global _start"\n"
107         "".type _start,@function"\n"
108         ""_start:"\n\t"
109         ""mov %rsp,%rdi"\n\t"
110         ""jmp c_main""
111     );
112 

'devel > man & example' 카테고리의 다른 글

#define 문자열 치환 및 합치기  (0) 2012.07.15
strstr  (0) 2012.01.28
thread starvation  (0) 2011.12.09
scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
function pointer  (0) 2009.11.24
Posted by 쵸코케키
~/Desktop/starvation.c.html
#include <stdio.h>
#include <string.h>
#include <pthread.h>

void* thread_main1(void*);
void* thread_main2(void*);

pthread_mutex_t MUTEX = PTHREAD_MUTEX_INITIALIZER;

char buf[255];
int length;

int main()
{

	pthread_t id[5];
	pthread_create(&id[0],NULL,thread_main1,NULL);
	pthread_create(&id[1], NULL, thread_main2, NULL);


	pthread_join(id[1], NULL);
	pthread_join(id[0], NULL);




return 0;

}

void* thread_main1(void* arg)
{
int i;
for(i=10; i>0 ; i--)
{
	pthread_mutex_lock(&MUTEX);
	printf("thread#1 Locked %d  %s\n",i, buf);
	pthread_mutex_unlock(&MUTEX);
	sleep(1);
}
}

void* thread_main2(void* arg)
{

int j;
for(j=10; j>0; j--)
{
	pthread_mutex_lock(&MUTEX);
	printf("thread#2 Lock %d\n",j);
	length = scanf("%[^\n]%*c",buf);
	pthread_mutex_unlock(&MUTEX);
	sleep(1);
}
}
배운거랑 다르게 막상 플그램을 만들다보면 전혀 눈치를 못 챈다

일부로 buf 변수라는 critical section을 만들고 출력과 입력이 동일한 변수를 사용하게 만들었다
그리고 서로 자원을 가지고 경쟁하도록 했으며 자원을 사용할 때는 lock을 걸어서 이상이 없도록 했다
상식적으로 scanf를 통해서 입력 받는 i/o타임이 buf에서 읽어서 출력하는 부분보다 클테니까
thread_main2는 한 두번 정도 실행되고 thread_main1이 주욱 실행 되거나
너한번 나한번, 기타 등등 뭐 그런 형식으로 진행 될 것 같았다
여기 까지는 아무런 문제가 없어보인다
그런데 실제로 프로그램을 돌려보니 예상 했던 것과는 결과가 다르게 나왔다

thread_main2만 줄창 실행되더라
즉 thread_main2가 락을 풀자마자 다시 락을 또 걸고 자원을 독점해버리는 것이었다
으...스케쥴 정책이 도대체 어떻게 되어있길래 이런 결과가 나오는건지

그런데 더 웃긴건 집에서 해보니 정상적으로 퐁당퐁당으로 되더라
애초에 race condition을 가정하고 만들긴 했는데 컴퓨터에 따라서 독점이냐 아니면 적당히냐가 완전히 달랐다

진짜 큰 교훈이 되었다 테스트 환경 c2d 5x00 vmplayer ubuntu 10.04 LTS, i3 2100 ubuntu 11.10


'devel > man & example' 카테고리의 다른 글

strstr  (0) 2012.01.28
arm inline assembly  (0) 2011.12.24
scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
function pointer  (0) 2009.11.24
sprintf int to ascii  (0) 2009.11.08
Posted by 쵸코케키

http://stackoverflow.com/questions/6083045/scanf-n-skips-the-2nd-input-but-n-does-not-why
http://in.answers.yahoo.com/question/index?qid=20110318044732AAaBz8P

위 두 링크에서 배웠습니다


scanf로 입력 받을 때 매번 \n을 fflush(stdin)으로 빼버리는 것도 뭔가 좀 걸리적 거리기도 하고
성능상 불 이익이 있을 것 같은 느낌이 들어서 좀 찾아봤습니다

재미있는 좋은 팁을 얻었네요

1. scanf의 포맷팅을 미리 char*형으로 선언해놓기
2. *지시자
3. [^]xor 용법


char* fmt = "%[^\n]%*c";

char str1, str2;
scanf(fmt, &str1);
scanf(fmt, &str2);


해설
1. 키보드로 입력한다
2. stdin이라는 일종의 버퍼(메모리)로 값이 들어간다
3. scanf 함수가 이제 그녀석을 차례로 순서대로 읽기 시작한다
쉽게 이해를 해보자면 stdin은 일종의 배열로 scanf는 pointer로 루프문 탐색을 시작한다고 보면 된다

4. []는 그 안에 있는 것만 받고 싶습니다 하는 그런거라 보면 된다

5. ^는 xor연산이다
다르면 1이고 같으면 무조건 0이다
그런고로 \n과 같은 값이면(\n도 일종의 숫자값이다) 0을 넘기고
다르면 1을 넘긴다 즉 2진 연산을 통해서 \n만 걸러낸다고 보면 된다

즉 %[^\n] 는 scanf가 stdin에 입력된 글자 한자 한자를 살펴보면서 \n인가 체크 하고
\n이 아닌놈만 읽어낸다는 의미이다


6. \n을 제외한 나머지 글자들은 모두 읽히고 \n은 그대로 stdin에 남아있게 된다

7. *는 걍 포인터 버려라는 의미이다
즉 scanf는 stdin에 혼자 남아있는 \n을 읽긴 읽는데 *때문에 걍 버린다
8. 끝
그런고로 fflush(stdin)을 사용할 필요 없이 그냥 *제한자로 간단히 처리가 되어버렸다

'devel > man & example' 카테고리의 다른 글

arm inline assembly  (0) 2011.12.24
thread starvation  (0) 2011.12.09
function pointer  (0) 2009.11.24
sprintf int to ascii  (0) 2009.11.08
C++ , C File OUTPUT e.g.  (0) 2008.12.02
Posted by 쵸코케키

Function Pointer
system programming 과목 시간에 thread programming을 했음에도 불구하고
function pointer가 필수적인 부분이 거의 없었다 덕분에 참 익숙치가 못하다


Def
void (*pfunc)(void*)
()연산자의 사용이 가능함 덕분에 함수를 변수처럼 사용이 가능함


e.g.
int t1(char* str){
strcat(str,"temp");
return (strlen(str));
}

 

int (*pFunc)(const char* str); //Declare function pointer variable

int main(){
char buf[500];
strcpy(buf,"xxxx");
pFunc = t1;
printf("%d",pFunc(buf));
}

응용으로 pFunc만 실행해도 다른 함수 실행이 가능

typedef int (*pFunc)(void*, void*);
이렇게 선언을 하면 pFunc variable은 이제 하나의 독립된 변수형으로 동작하게 되는 것임

이를테면 pFunc newFuncPtrVariable;
int temp = newFuncPtrVariable("void* argument1", "void* argument2");
이런 구현이 가능

- 참고 redwiki 


위의 별 볼일 없는 내용보다 훨씬 좋은 정보가 있는 링크

http://www.newty.de/fpt/fpt.html

'devel > man & example' 카테고리의 다른 글

thread starvation  (0) 2011.12.09
scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
sprintf int to ascii  (0) 2009.11.08
C++ , C File OUTPUT e.g.  (0) 2008.12.02
String Parsing  (0) 2008.05.25
Posted by 쵸코케키
int 형을 char 형으로 변환하는 가장 쉬운 방법

**단 buf가 적절한 크기어야함
sprintf(buf,"%d",i);

아..sprintf 님 만세..
그 외에도 sprintf는 형식 지정 문자열 만들때 디게 편함 ㅋ

'devel > man & example' 카테고리의 다른 글

scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
function pointer  (0) 2009.11.24
C++ , C File OUTPUT e.g.  (0) 2008.12.02
String Parsing  (0) 2008.05.25
bit shift e.g. , 2dim matrix, Defed Func  (0) 2007.05.01
Posted by 쵸코케키


///////////
★★★C method 1
///////////
#include <stdio.h>
#include <stdlib.h>

#define INPUT_FILE_1 "hw1_in1"
#define OUTPUT_FILE_1 "hw1_out1"

void ReadFile();
void WriteFile();
void ParseLine(char * pLineBuf);

int main()
{

 printf("\n\n");
 printf("%s : file read\n", INPUT_FILE_1);
 printf("====================================\n");
 
 ReadFile();
 
 printf("\n\n");
 printf("%s : file write\n", OUTPUT_FILE_1);
 printf("====================================\n");
 
 WriteFile();

 printf("\n\n");
 return 0;
}

void ReadFile()
{
 char buf[256];
 FILE * fp;

 fp = fopen(INPUT_FILE_1, "r");
 
 if (fp == NULL)
 {
  printf("%s file open error\n", INPUT_FILE_1);
  exit(0);
 }

 while(!feof(fp))
 {
  fgets(buf, sizeof(buf), fp);

  ParseLine(buf);
 }
 
 fclose(fp);
}

void WriteFile()
{
 int i;
 float f;
 char buf[256];
 FILE * fp;

 fp = fopen(OUTPUT_FILE_1, "w");
 
 if (fp == NULL)
 {
  printf("%s file open error\n", INPUT_FILE_1);
  exit(0);
 }

 fprintf(fp, "---------------------------------\n");
 fprintf(fp, " %s file write test\n", OUTPUT_FILE_1);
 fprintf(fp, "---------------------------------\n");
 
 f = 0.0;
 
 for (i = 0; i < 5; i++)
 {
  fprintf(fp, " %.2f\t%.2f\t%.2f\n", f + 1, f + 1, f + 1);
  f++;
 }
 
 fclose(fp);
}


// 이 함수에서 파싱을 합니다
void ParseLine(char * pLineBuf)
{
 printf("%s", pLineBuf);

}


C++
http://www.cplusplus.com/reference/iostream/ifstream/open.html

this is reference and easy to use

#include

ofstream output;
output.open("filename" ios::out | ios::trunc);


if(output.is_open())
output << "anything if you wanna";

 

'devel > man & example' 카테고리의 다른 글

scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
function pointer  (0) 2009.11.24
sprintf int to ascii  (0) 2009.11.08
String Parsing  (0) 2008.05.25
bit shift e.g. , 2dim matrix, Defed Func  (0) 2007.05.01
Posted by 쵸코케키

2008. 5. 25. 16:50 devel/man & example

String Parsing

1

string tmp; string str("Test string");

size_t found = str.find('i');
tmp.assign(str,0,found);


끝~
i 이후 부분은

tmp.assign(str,found,str.length()) 하면 됨미..


i를 제거 하고 싶으면 found + 1하면 되고





2
string에서 parsing 하기 ,  istringstream 에 관한 간단한 예시( 공백 파싱_ )

'string.h'에 정의된 strtok() 함수가 있습니다.

예제를 보자면

char string[] = "words separated by spaces -- and, punctuation!";
const char delimiters[] = " .,;:!-";
char *token;

token = strtok (string, delimiters); /* token => "words" */
token = strtok (NULL, delimiters); /* token => "separated" */
token = strtok (NULL, delimiters); /* token => "by" */
token = strtok (NULL, delimiters); /* token => "spaces" */
token = strtok (NULL, delimiters); /* token => "and" */
token = strtok (NULL, delimiters); /* token => "punctuation" */
token = strtok (NULL, delimiters); /* token => NULL */


위의 예제에서 delimiters[] 에 설정된 문자들이 구분자로 사용됨을 알수 있습니다.

공백문자마다 쪼개고 싶다면 delimiters[] = " " 라고 사용하시면 됩니다.








#include <iostream>
#include <sstream>
#include <string>
using namespace std;
//istringstream::str

int main () {

  int val,n;

  istringstream iss;
  string strvalues = "32 240 2 1450";

  iss.str (strvalues);

  for (n=0; n<4; n++)
  {
    iss >> val;
    cout << val+1 << endl;
  }

  return 0;
}

'devel > man & example' 카테고리의 다른 글

scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
function pointer  (0) 2009.11.24
sprintf int to ascii  (0) 2009.11.08
C++ , C File OUTPUT e.g.  (0) 2008.12.02
bit shift e.g. , 2dim matrix, Defed Func  (0) 2007.05.01
Posted by 쵸코케키

1
#
include <stdio.h>

int main(void)
{
 printf("\nsigned  int  min: %d",1<<(sizeof(int)*8-1));
 printf("\nsigned  int  max: %d",~(1<<(sizeof(int)*8-1)));
 printf("\nunsigned int max: %u",~0);
 return 0;
}


2
크기가 m*n인 2차원 배열을 만들 때,

int** aArray=new int*[m];
for(int i=0;i<n;++i) aArray[i]=new int[n];

이렇게 하면 전체초기화를 위해 memset을 하려고 할때 곤란하다. 나중에 delete할때도 또 루프를 돌아야 해서 귀찮다. 하지만 아래 코드처럼 하는건 어떨까? 아! 래! 코! 드!


int** aArray=new int*[m];
aArray[0]=new int[m*n];
for(int i=1;i<m;++i) aArray[i]=aArray[i-1]+n;

이렇게 하면 전체 초기화할때도 memset(aArray[0],0,sizeof(int)*m*n) 하면 되고, 사용이 끝났을 때는 delete[] aArray[0]; delete[] aArray; 이렇게 하면 되니까 말이다.

뒷북이면 Zaphok




3
#define exch(x,y) {int tmp; tmp = x; x=y; t=tmp;}
main() exch(a,b); !!!!!!

'devel > man & example' 카테고리의 다른 글

scanf에서 fflush(stdin) 사용 안하고 \n 파싱해서 없애기  (2) 2011.11.27
function pointer  (0) 2009.11.24
sprintf int to ascii  (0) 2009.11.08
C++ , C File OUTPUT e.g.  (0) 2008.12.02
String Parsing  (0) 2008.05.25
Posted by 쵸코케키
이전버튼 1 2 이전버튼

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함