2014년 12월 23일 화요일

매개변수에서 const 위치

1. const 가 * 의 왼쪽에 위치 시 포인터가 가르키는 대상이 상수.. char  const * a
  a[0]='a' 불가
2. const 가 * 의 오른쪽에 위치 시 포인터 변수가 상수 char * const  a
    a = "abcd " 불가

타입명과 const 위치는 바뀌어도 뜻은  똑같다.
void fun (const char *a)
void fun (char const *a)

2014년 12월 18일 목요일

포인터

포인터는 변수의 타입이며 무엇이든 그 컴퓨터의 주소를 담을수 있다.

포인터 형을 일반 지역변수에서 선언하던, 전역에서 선언하던 함수의 인자에서 선언하던 해당 컴퓨터/컴파일러의 주소범위 내의 사이즈 타입의 변수에 그 포인터 원형의 주소가 담기게 된다.

애초에 int a char b 처럼 변수의 이름은 컴파일시 심볼테이블에 의해 실 주소로 치환이 된다.
이것을 이해하면 포인터의 주소개념을 더 명확히 할수 있다.

거기서 오프셋 연산이나 역참조를 통한 직접접근이 가능하게 되는것이다. 포인터가 담기게되는 스택형 변수와 힙 포인터를 착각하게 되는것을 주의하자.

char * pc  -> char 타입이 담겨있는 주소. 즉 pc의 실제 메모리 주소를 가르킨다.

char ** ppc -> char * 타입이 담겨있는 주소. 역시 ppc 주소를 가르키며 그 안에는 당연히 char* 타입의 데이터가 담겨있어야 한다.



2014년 12월 9일 화요일

C 에서의 extern

사용되고 있는 변수가 다른 파일에서 정의(기억장소가 할당되도록 함) 되었다면
그 외부변수를 사용하기 위해 extern 으로 '선언' 하고 사용하여야 한다
보통 한 파일에서  아래와 같은 방식으로 사용한다

file1.c
int gInt = 1; //정의와 선언

file1.h
extern int gInt;

file2.c
#include "file1.h"
gInt = 2;
단 배열의 extern 은 그 크기를 명사하여야 하나
extern 에서는 생략이 가능하다
즉 아래의 표현은 동일하다

extern int array[10];
extern int array[]; 

2014년 12월 7일 일요일

콜렉션 FIND predicate 함수를 사용하는 3가지 방법

콜렉션 개체

public class person
{
    public int Anni { get; set; }
    public string Nome { get; set; }
    public person(int anni, string nome)
    {
        this.Anni = anni;
        this.Nome = nome;
    }
}
무명 메소드 (델리게이트 사용)

//I assume I have a non-empty list List agenda = new List();
/* .. load objects from DataBase .. */

//I create a simple search criteria string personToBeSearched = "mario";
person mario = agenda.Find(delegate(person p) { return p.Nome == personToBeSearched; });
람다 식 사용

//I assume I have a non-empty list List agenda = new List();
/* .. load objects from DataBase .. */

//I create a simple search criteria string personToBeSearched = "mario";
person mario = agenda.Find(p => p.Nome == personToBeSearched;);
델리게이트 사용

private static bool findTeen(person p)
{
    if (p.Anni < 18)
        return true;
    return false;
}

List BlockBuster_GameOnly = agenda.findAll(findTeen);

C# 에서 (C,C++ dll) 로드시 hresult 0x8007007e Exception from HRESULT: 0x8007000B

개발한 PC에있는 dll이 실행하는 PC에 없는 경우이다..
http://www.dependencywalker.com/  를 통해 내가 만든 dll 의존성 검사를 한후
존재하지 않는 dll을 추가시켜주면 된다.

그러나 의존하는 dll이 많은 경우?
해당 DLL 컴파일시 옵션을 아래와 같이 수정해도 된다

 /MT switch instead of /MD—(it's found in the UI under "Configuration Properties" -> "C/C++" -> "Code Generation" -> "Runtime Library").

설정 -> c/++ 코드 생성 -> 런타임 라이브러리에서 /md로 되어있는것을 /mt로 변경한다