'Programming'에 해당되는 글 1747건

  1. 2013.02.09 C++ 첫걸음 *-_-*
  2. 2013.02.04 unsigned char -> int 변환 주의사항
  3. 2013.01.30 lisp 반복문 dolist, dotimes, do
  4. 2013.01.28 lisp cond
  5. 2013.01.28 lisp when/unless macro 2
  6. 2013.01.28 lisp 명령어 if progn
  7. 2013.01.22 lisp eval & apply
  8. 2013.01.19 xlisp에서 incf 오류
  9. 2013.01.19 lisp backquote / 유사인용
  10. 2013.01.17 lisp rem, mod
Programming/C++ STL2013. 2. 9. 19:19
학교에서 C++ 안하고
win32api랑 Java만 하고 졸업하고 MFC를 다뤄는 봤지만 C++을 생으로 해본적이 없어
저번달에는 Lisp 조금 해보고 이제 이번달에는 C++!ㅋㅋ

참조한 책은 Essential C++ (스탠리 B.립먼)

1. 책을 보다보니.. int a(0); 으로도 초기화가 된다고?!
#include <stdio.h>

void main()
{
        int a(0);
}

컴파일을 해보면 다른 소스라서 일단 제대로 되지 않으니 일단은 50%는 실패?
특이하게도 g++은 무조건 int main()으로 강제한다.

gcc test.c
test.c: In function ‘main’:
test.c:5:8: error: expected declaration specifiers or ‘...’ before numeric constant

g++ test.c
test.c:3:11: error: ‘::main’ must return ‘int’   
 
아래가 제대로 만든 c++ 소스. int a(0) 로도 초기화가 되는 신비함!!
(일단 a가 int형 객체일 경우 컨스트럭터로 인자를 하나 받아 초기화 해준다고 생각하면 간단하려나?)
#include <iostream>

int main()
{
        int a(0);

        return 0;
} 
 

2. cout 을 써봅시다 + long double 형?
c++에서는 .h를 제외하고 하는데 stdio 를 대체 하는 녀석은 바로 iostream!
#include <iostream>
//using namespace std;

int main()
{
        int a = 0;
        long double ld_t;

        cout << sizeof(ld_t) << '\n';

        return 0;
}

근데 cout이 안돼!!! 난 햄보칼수가 없엉 ㅠ.ㅠ

$ g++ test.c
test.c: In function ‘int main()’:
test.c:8:2: error: ‘cout’ was not declared in this scope
test.c:8:2: note: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: note:   ‘std::cout’ 

cout의 경우에는 std::cout 으로 std에 포함된 cout 이기 때문에
굳이 저 소스로 하려면 std::cout << sizeof(ld_t) << '\n'; 으로 해야 한다.
그게 아니라면 간편하게 using namespace 를 이용해서 std를 기본으로 쓰도록 설정해준다. 

그리고 gcc 에서도 long double을 지원하기는 하는데.. 12byte 짜리(96bit ?!) 녀석이다. 

'Programming > C++ STL' 카테고리의 다른 글

Essential C++  (0) 2013.02.14
참조에 의한 전달(pass by reference)  (0) 2013.02.09
unsigned char -> int 변환 주의사항  (0) 2013.02.04
템플릿 메타프로그래밍  (0) 2013.01.06
c++ template  (0) 2012.05.12
Posted by 구차니
Programming/C++ STL2013. 2. 4. 23:31
원인은 대충 알고 있지만 해결책을 찾다 안되서 고민고민 -_-
아무튼 실험을 해보면, unsigned char 형에서 int로 암시적으로 형변환을 하면
결과쪽으로 형변환을 한것과 같아서 unsigned 형일 경우 의도하지 않은 형태로 값이 변형이 될 수 있다.

결론만 말하자면, unsigned 를 더 큰 크기의 signed로 저장할때 부호를 제대로 살리기 위해서는
작은 크기의 signed 형으로 변환하고(여기서는 unsigned char를 char 로) 넣어 주어야 한다 라는 점.

#include "stdio.h"

void main()
{
	unsigned char t1 = -1;
	char t2 = -1;
	int t3;

	t3 = t1;
	printf("%d\n",t3);

	t3 = (int)t1;
	printf("%d\n",t3);

	t3 = (char)t1;
	printf("%d\n",t3);

	t3 = t2;
	printf("%d\n",t3);

}

$ ./a.out
255
255
-1
-1 



---
원리적으로야
-1은 0x0FF에서 0x0000 00FF 으로 int로 확장시 앞에 채워지는 식으로 늘어 나는 바람에
의도한 값인 0xFFFF FFFF 가 되지 않아 부호가 상실하게 된다.

'Programming > C++ STL' 카테고리의 다른 글

참조에 의한 전달(pass by reference)  (0) 2013.02.09
C++ 첫걸음 *-_-*  (0) 2013.02.09
템플릿 메타프로그래밍  (0) 2013.01.06
c++ template  (0) 2012.05.12
리눅스에서 c++ 컴파일시 strcpy / strcat 오류  (0) 2011.10.13
Posted by 구차니
Programming/lisp2013. 1. 30. 23:33
dolist는 list의 숫자대로 반복한다.
증가하는 숫자로 리스트를 만들면 for문 처럼 사용이 가능하지만 노가다가 되니 그닥 추천할 만한 방법은 아니다.
물론 단순 반복이 아닌 eval 등을 통한 문장의 반복적인 해석이라면 쓸만할 듯.
> (dolist (a '(1 2 3)) (print a))

1
2
3
NIL 

dolist와 유사한 문법으로, for문을 간단하게 사용할수 있는 녀석으로
0부터 증가하여 숫자까지 C언어의 for문처럼 작동한다.
> (dotimes (i 4) (print i))

0
1
2
3
NIL

심심해서 작성해본 return(c언어로 치면 break) 예제
> (dotimes (i 4) (if (= i 3) (return T) (print i)))

0
1
2
T 

물론 중첩으로도 사용이 가능하다. format은 printf 같은 건데 좀 복잡해서 아직 공부를 안해서 ㅠ.ㅠ
> (dotimes (x 20)
  (dotimes (y 20)
    (format t "~3d " (* (1+ x) (1+ y))))
  (format t "~%"))
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20
  2   4   6   8  10  12  14  16  18  20  22  24  26  28  30  32  34  36  38  40
  3   6   9  12  15  18  21  24  27  30  33  36  39  42  45  48  51  54  57  60
  4   8  12  16  20  24  28  32  36  40  44  48  52  56  60  64  68  72  76  80
  5  10  15  20  25  30  35  40  45  50  55  60  65  70  75  80  85  90  95 100
  6  12  18  24  30  36  42  48  54  60  66  72  78  84  90  96 102 108 114 120
  7  14  21  28  35  42  49  56  63  70  77  84  91  98 105 112 119 126 133 140
  8  16  24  32  40  48  56  64  72  80  88  96 104 112 120 128 136 144 152 160
  9  18  27  36  45  54  63  72  81  90  99 108 117 126 135 144 153 162 171 180
 10  20  30  40  50  60  70  80  90 100 110 120 130 140 150 160 170 180 190 200
 11  22  33  44  55  66  77  88  99 110 121 132 143 154 165 176 187 198 209 220
 12  24  36  48  60  72  84  96 108 120 132 144 156 168 180 192 204 216 228 240
 13  26  39  52  65  78  91 104 117 130 143 156 169 182 195 208 221 234 247 260
 14  28  42  56  70  84  98 112 126 140 154 168 182 196 210 224 238 252 266 280
 15  30  45  60  75  90 105 120 135 150 165 180 195 210 225 240 255 270 285 300
 16  32  48  64  80  96 112 128 144 160 176 192 208 224 240 256 272 288 304 320
 17  34  51  68  85 102 119 136 153 170 187 204 221 238 255 272 289 306 323 340
 18  36  54  72  90 108 126 144 162 180 198 216 234 252 270 288 306 324 342 360
 19  38  57  76  95 114 133 152 171 190 209 228 247 266 285 304 323 342 361 380
 20  40  60  80 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400
NIL  

do는 초기값 및 증가값과
비교문을 설정할 수 있다.
> (do ((i 0 (1+ i)))
    ((>= i 4))
  (print i))

0
1
2
3
NIL
 
 

'Programming > lisp' 카테고리의 다른 글

lisp 키 입력  (0) 2015.07.19
lisp 예제  (0) 2014.04.05
lisp cond  (0) 2013.01.28
lisp when/unless macro  (2) 2013.01.28
lisp 명령어 if progn  (0) 2013.01.28
Posted by 구차니
Programming/lisp2013. 1. 28. 14:22
cond는 if의 확장 같은 느낌인데..

(cond ((조건문) 참일경우 실행)
((조건문) 참일경우 실행)
...
((조건문) 참일경우 실행)) 

형태는 이렇게 되어있고, 위에서 부터 아래로 실행이 되기 때문에
switch-case문과 같이 순서를 섞어놓아서는 안된다 -_-

> (setq a 5)
> (cond ((eq a 'hack) 'foo)
(t "default"))
"default"

> (cond ((eq a 5) 'foo)
(t "test"))
FOO

> (cond
((eq a 0) 'foo)
((eq a 5) 'bar)
(t "test"))
BAR


> (cond
(t "test")
((eq a 0) 'foo)
((eq a 5) 'bar))
"test" 

[링크 : http://www.delorie.com/gnu/docs/elisp-manual-21/elisp_126.html]

'Programming > lisp' 카테고리의 다른 글

lisp 예제  (0) 2014.04.05
lisp 반복문 dolist, dotimes, do  (0) 2013.01.30
lisp when/unless macro  (2) 2013.01.28
lisp 명령어 if progn  (0) 2013.01.28
lisp eval & apply  (0) 2013.01.22
Posted by 구차니
Programming/lisp2013. 1. 28. 11:32
when 은 표준 clisp에는 없는 명령으로 if - progn 의 매크로라고 한다.

when 은 if가 참일경우에 대한
unless는 if가 거짓일에 대한 확장이다.

[링크 : http://gigamonkeys.com/book/macros-standard-control-constructs.html]
2013/01/28 - [Programming/lisp] - lisp 명령어 if progn 

'Programming > lisp' 카테고리의 다른 글

lisp 반복문 dolist, dotimes, do  (0) 2013.01.30
lisp cond  (0) 2013.01.28
lisp 명령어 if progn  (0) 2013.01.28
lisp eval & apply  (0) 2013.01.22
xlisp에서 incf 오류  (0) 2013.01.19
Posted by 구차니
Programming/lisp2013. 1. 28. 10:22
if문 예제
> (if (< 1 2) 'A 'B)
A
> (if (< 1 2) (if (< 1 2) 'C 'D) 'B)

생각해보니 lisp의 if는 if then-else 이지 if - else if - else 가 아닌것 같다.
물론 불편하지만 else if 대신 else 에 if를 중첩해서 쓰면 되긴 하지만
언어 컨셉이 다르니 c언어와 다르다고 해서 안좋아! 라고 하긴 그렇겠....지?

[링크 : http://gigamonkeys.com/book/macros-standard-control-constructs.html]


그리고 if문에서 lisp 안에 하나의 문장만 해결하기에는 2% 부족하니
sequence로 여러개의 실행을 할 수 있도록 하는 progn이 필요하다.
progn은 마지막 것을
progn1 은 처음 것
progn2 는 두번째 것을 return 한다.

[10]> (progn (print "The first form")
       (print "The second form")
       (print "The third form"))

"The first form"
"The second form"
"The third form"
"The third form"
 
[11]> (prog1 (print "The first form")
       (print "The second form")
       (print "The third form"))

"The first form"
"The second form"
"The third form"
"The first form"
 
[12]> (prog2 (print "The first form")
       (print "The second form")
       (print "The third form"))

"The first form"
"The second form"
"The third form"
"The second form" 

[링크 : http://www.delorie.com/gnu/docs/elisp-manual-21/elisp_125.html]



+++
두개를 조합하면?
> (if (> 2 3)
(progn (print "i am a boy") (print "you are a girl"))
(progn (print "tt") (print"aa")))

"tt"
"aa"
"aa" 

 

'Programming > lisp' 카테고리의 다른 글

lisp cond  (0) 2013.01.28
lisp when/unless macro  (2) 2013.01.28
lisp eval & apply  (0) 2013.01.22
xlisp에서 incf 오류  (0) 2013.01.19
lisp backquote / 유사인용  (0) 2013.01.19
Posted by 구차니
Programming/lisp2013. 1. 22. 22:39
"만들면서 배우는 리스프 프로그래밍" 123p

스스로 변화하는 코드를 짜고 싶은가? eval은 좋은 벗이 될 것이다. 사실, 과거 인공지능 연구가가 리스프를 그토록 사랑했던 이유가 여기에 있다.


eval은 데이터를 코드로 처리하는 기능을 한다.
위에 말 처럼 스스로 변화하는 코드라는 말까지 와닫지는 않지만
데이터가 코드가 되는 살아움직이는 느낌 정도는 받는다고 해야 하려나?

eval은 리스트로 된 문장을 evaluate 한다.(재귀적인가?)
'(+ 1 2)는 단순한 데이터로 실행되지 않지만 eval에 넣으면 수행을 하게 된다.
> (eval (+ 1 2)) 
3                
> (eval '(+ 1 2))
3                
>                 

그에 반해 apply는 머하는데 쓰는건지 조금 의아한 녀석..
> (apply (function +) '(1 2))
3
> (apply + '(1 2))                                     
error: bad function - (apply (function +) (quote (1 2)))                              
매크로를 사용하면 #'+ 가 되겠지만 명시적으로  (function)을 사용해보면 위와 같이
함수에 대한 포인터(?)를 이용하여 eval에서 연산자를 제외한 동일한 형상을 띄게 된다


evaluate an xlisp expression
(eval <expr>)

<expr> the expression to be evaluated
returns the result of evaluating the expression

apply a function to a list of arguments
(apply <fun> <arg>...<args>)

<fun> the function to apply (or function symbol). May not be macro or fsubr.
<arg> initial arguments, which are consed to...
<args> the argument list
returns the result of applying the function to the arguments  

'Programming > lisp' 카테고리의 다른 글

lisp when/unless macro  (2) 2013.01.28
lisp 명령어 if progn  (0) 2013.01.28
xlisp에서 incf 오류  (0) 2013.01.19
lisp backquote / 유사인용  (0) 2013.01.19
lisp rem, mod  (0) 2013.01.17
Posted by 구차니
Programming/lisp2013. 1. 19. 23:36
xlisp에서 제대로 지원을 안해서 생기는 문제인가?

xlisp 도움말에도 존재는 하지만
increment a field
(incf <place> [<value>])
decrement a field
(decf <place> [<value>])

defined as macro in common.lsp.  Only evaluates place form arguments one time.  It is recommended that *displace-macros* be non-nil for best performance.

<place> field specifier being modified (see setf)
<value> Numeric value (default 1)
returns the new value which is (+ <place> <value>) or (- <place> <value>) 

xlisp에서 이상하게 unbound function 이라고 뜬다.
> (setq a 1)                              
1                                         
> (incf a)                                
error: unbound function - incf            
if continued: try evaluating symbol again 

clisp에서 실행 이상없음
[9]> (setq a 1)
1
[10]> (incf a)
2
[11]> a
2 

윈도우에서 편해서 이걸 쓰지만.,.
slime for windows나 cygwin으로 해야하려나? ㅠ.ㅠ 

'Programming > lisp' 카테고리의 다른 글

lisp 명령어 if progn  (0) 2013.01.28
lisp eval & apply  (0) 2013.01.22
lisp backquote / 유사인용  (0) 2013.01.19
lisp rem, mod  (0) 2013.01.17
lisp i/o  (0) 2013.01.17
Posted by 구차니
Programming/lisp2013. 1. 19. 23:19
어떻게 보면.. printf()의 기분?

> (defun tt-path (edge)                                               
'(there is a ,(caddr edge) going, (cadr edge) from here.))            
tt-path                                                               
> (tt-path '(garden west door))                                       
(there is a (comma (caddr edge)) going (comma (cadr edge)) from here.) 

> (defun t2-path (edge)                                   
`(there is a ,(caddr edge) going, (cadr edge) from here.))
t2-path                                                   
> (t2-path '(garden west door))                           
(there is a door going west from here.)                   

'Programming > lisp' 카테고리의 다른 글

lisp eval & apply  (0) 2013.01.22
xlisp에서 incf 오류  (0) 2013.01.19
lisp rem, mod  (0) 2013.01.17
lisp i/o  (0) 2013.01.17
lisp file i/o  (0) 2013.01.17
Posted by 구차니
Programming/lisp2013. 1. 17. 19:26
reminder 나 modulo 나 둘다 나머지 연산인데
왜 굳이 두개의 이름으로 별도로 존재하나 했더니

양수에서는 차이가 없으나, 음수에서 차이가 발생한다.
2> (mod  5 2) 
1             
2> (mod  5 -2)
-1            
2> (rem  5 2) 
1             
2> (rem  5 -2)
1              


    Rem(x, 5):

                       5+         o         o
                        |       /         /
                        |     /         /
                        |   /         /
                        | /         /
    *---------*---------*---------*---------*
   -10      / -5      / 0         5        10
          /         /   |
        /         /     |
      /         /       |
    o         o       -5+

    Mod(x, 5):

              o        5o         o         o
            /         / |       /         /
          /         /   |     /         /
        /         /     |   /         /
      /         /       | /         /
    *---------*---------*---------*---------*
   -10        -5        0         5        10

    Rem(x, -5):

                       5+         o         o
                        |       /         /
                        |     /         /
                        |   /         /
                        | /         /
    *---------*---------*---------*---------*
   -10      / -5      / 0         5        10
          /         /   |
        /         /     |
      /         /       |
    o         o       -5+

    Mod(x, -5):

    *---------*---------*---------*---------*
   -10      / -5      / 0       / 5       /10
          /         /   |     /         /
        /         /     |   /         /
      /         /       | /         /
    o         o       -5o         o
 
[링크 : http://mathforum.org/library/drmath/view/54377.html

'Programming > lisp' 카테고리의 다른 글

xlisp에서 incf 오류  (0) 2013.01.19
lisp backquote / 유사인용  (0) 2013.01.19
lisp i/o  (0) 2013.01.17
lisp file i/o  (0) 2013.01.17
lisp savefun / load  (0) 2013.01.16
Posted by 구차니