개발

65개의 글

[C] 가변 인수 (2) : 가변 인수 함수를 꼭 써야 가변인수를 사용할수 있는걸까?

일반 함수 매개변수의 주소값과 가변인수함수의 주소값을 살펴보았습니다. 그 두가지의 주소값 할당은 비슷한점이 많았습니다. 그럼 아래와 같이 가변인수함수를 사용하지 않아도 가변인수의 값을 가져올 수 있지 않을까요? #include int sum(int i, ...); void main() { printf("\n%d\n", sum(3, 1, 2, 3)); } int sum(int i, ...) { int sum = 0, j; int *p = &i + 1; for (j = 0; j

[C] 가변 인수 (1) : 가변 인수 함수의 주소는 어떻게 될까

일반적으로 가변인수를 사용하는 방법은 아래와 같습니다. #include #include //가변 인수를 사용하기 위한 헤더파일 int sum(int i, ...); void main() { printf("\n%d\n", sum(3, 1, 2, 3)); } int sum(int i, ...) { int j, t, sum = 0; va_list sp; //가변 인수들의 주소를 저장할 지역변수 va_list. Type은 char* va_start(sp, i); //가변 인수 바로 앞에있는 고정매개변수를 받는다. 이 함수의 매개변수에서 가변인수(...) 앞에는 int i 이므로 i를 넘긴다. for (j = 0; j < i; j++) { t = va_arg(sp, int); //int형으로 참조하여 값을 가져온..

[C] 선언한 배열의 index 이상을 접근하면 어떻게 될까?

길이가 10인 1차원 배열이 있다고 하겠습니다. 그럼 index의 범위는 0 - 9 입니다. 만약 이를 초과한 10에 접근하면 어떻게 될까요? 우리의 컴파일러는 친절하게도 문제가 있다는것을 밑줄로 알려줍니다. (Debug Mode에서는 프로그램을 실행하면 메모리 접근 에러가 납니다. 정말 친절해서 너무나 고마운나머지 Test는 Release Mode에서 진행했습니다. ) 그런데 에러가 아닌 경고가 메시지가 발생합니다. 컴파일도 아주 잘 되죠. 동작시키면 쓰레기 값이 나오지만요 ^^ 그럼 배열범위를 벗어난 메모리 값을 초기화를 해버리면 어떻게 될까요?? 결과는 에러없이 아주 잘 동작합니다. 경고는 존재하지만요. 이를통해 알 수 있는것! 1. 배열의 크기를 10으로 지정한다고 해서 10만 쓸수 있는것은 아니..

[C] Typedef 손쉽게 이해하기.

C언어에서 Typedef 는 자료형을 재정의 할 수 있도록 하는 아주 유용한 키워드입니다. typedef (자료형이름) (재정의할 자료형 이름) 로 되어있는 아주 쉬운 구조이죠. 사용방법을 간략하게 예를들면 아래와 같습니다. typedef int INT32; //int를 INT32로 재정의해서 사용할거에요! INT32 a = 1000; // int a = 1000 이랑 같은 뜻! 사실 위와같은 케이스에 대해 이해하는건 정말 쉽습니다. 그런데 이에 대하여 처음 접하거나 익숙하지 않은 경우 간혹 헷갈리는것들이 있습니다. typedef void (*fun)(int,int); //함수포인터 자료형! typedef int (*arr)[10]; //포인터 배열 자료형! 위 두개는 함수포인터의 자료형과 포인터 배열의..

개발/Android2022.10.27

[Native C++] 4. Java클래스 생성과 C소스 연결하기

1. java에서 호출할 패키지와 class를 생성합니다. 샘플프로젝트에서는 sample 패키지 아래에 Sample 클래스를 추가하였습니다. 2. MainActivity에 있는 native 관련 매소드들을 sample.class에 잘라 넣습니다. 그리고 소스를 일부 수정합니다. 바로 native로 연결해도 되지만 굳이 2번 거치도록 한 이유는 java에서 소스를 고쳐야 할 경우 여기서 고치도록 하려고 했습니다. 여기는 개인 성향에 따라 다른 부분이라 따라하지 않아도 무관합니다. 3. 빨간색으로 되어있는 jni_stringFromJNI()에 마우스를 좌클릭하면 왼쪽 위에 빨간 느낌표가 뜹니다. 느낌표를 클릭하고 Create JNI function for jni_stringFromJNI를 클릭합니다. 클릭하..

개발/Android2022.10.27

[Native C++] 3. 기본 헤더파일 경로 추가하기.

이 챕터는 굳이 할 필요 없는 챕터인데 설명을 위해 넣은 챕터입니다. 기존에 가진 소스를 활용할 경우 헤더파일 경로를 로 되어 있는것을 ""으로 수정하고 싶을 수도 있습니다. ​ 그래서 샘플프로젝트를 이용하여 기본 헤더파일 경로를 추가해보도록 하겠습니다. ​ 1. CmakeList.txt에 디렉토리 경로 추가인 include_dierctories를 입력하고 안에 경로를 넣습니다. 예제에서는 src 폴더입니다. 2. 그리고 sample.cpp에 #include "src/src.h"를 include 로 변경하고 동기화 후 빌드하면 됩니다.

[C] 가변 인수 (2) : 가변 인수 함수를 꼭 써야 가변인수를 사용할수 있는걸까?

일반 함수 매개변수의 주소값과 가변인수함수의 주소값을 살펴보았습니다. 그 두가지의 주소값 할당은 비슷한점이 많았습니다. 그럼 아래와 같이 가변인수함수를 사용하지 않아도 가변인수의 값을 가져올 수 있지 않을까요? #include int sum(int i, ...); void main() { printf("\n%d\n", sum(3, 1, 2, 3)); } int sum(int i, ...) { int sum = 0, j; int *p = &i + 1; for (j = 0; j

[C] 가변 인수 (1) : 가변 인수 함수의 주소는 어떻게 될까

일반적으로 가변인수를 사용하는 방법은 아래와 같습니다. #include #include //가변 인수를 사용하기 위한 헤더파일 int sum(int i, ...); void main() { printf("\n%d\n", sum(3, 1, 2, 3)); } int sum(int i, ...) { int j, t, sum = 0; va_list sp; //가변 인수들의 주소를 저장할 지역변수 va_list. Type은 char* va_start(sp, i); //가변 인수 바로 앞에있는 고정매개변수를 받는다. 이 함수의 매개변수에서 가변인수(...) 앞에는 int i 이므로 i를 넘긴다. for (j = 0; j < i; j++) { t = va_arg(sp, int); //int형으로 참조하여 값을 가져온..

[C] 선언한 배열의 index 이상을 접근하면 어떻게 될까?

길이가 10인 1차원 배열이 있다고 하겠습니다. 그럼 index의 범위는 0 - 9 입니다. 만약 이를 초과한 10에 접근하면 어떻게 될까요? 우리의 컴파일러는 친절하게도 문제가 있다는것을 밑줄로 알려줍니다. (Debug Mode에서는 프로그램을 실행하면 메모리 접근 에러가 납니다. 정말 친절해서 너무나 고마운나머지 Test는 Release Mode에서 진행했습니다. ) 그런데 에러가 아닌 경고가 메시지가 발생합니다. 컴파일도 아주 잘 되죠. 동작시키면 쓰레기 값이 나오지만요 ^^ 그럼 배열범위를 벗어난 메모리 값을 초기화를 해버리면 어떻게 될까요?? 결과는 에러없이 아주 잘 동작합니다. 경고는 존재하지만요. 이를통해 알 수 있는것! 1. 배열의 크기를 10으로 지정한다고 해서 10만 쓸수 있는것은 아니..

[C] Typedef 손쉽게 이해하기.

C언어에서 Typedef 는 자료형을 재정의 할 수 있도록 하는 아주 유용한 키워드입니다. typedef (자료형이름) (재정의할 자료형 이름) 로 되어있는 아주 쉬운 구조이죠. 사용방법을 간략하게 예를들면 아래와 같습니다. typedef int INT32; //int를 INT32로 재정의해서 사용할거에요! INT32 a = 1000; // int a = 1000 이랑 같은 뜻! 사실 위와같은 케이스에 대해 이해하는건 정말 쉽습니다. 그런데 이에 대하여 처음 접하거나 익숙하지 않은 경우 간혹 헷갈리는것들이 있습니다. typedef void (*fun)(int,int); //함수포인터 자료형! typedef int (*arr)[10]; //포인터 배열 자료형! 위 두개는 함수포인터의 자료형과 포인터 배열의..

개발/Android2022. 10. 27.

[Native C++] 4. Java클래스 생성과 C소스 연결하기

1. java에서 호출할 패키지와 class를 생성합니다. 샘플프로젝트에서는 sample 패키지 아래에 Sample 클래스를 추가하였습니다. 2. MainActivity에 있는 native 관련 매소드들을 sample.class에 잘라 넣습니다. 그리고 소스를 일부 수정합니다. 바로 native로 연결해도 되지만 굳이 2번 거치도록 한 이유는 java에서 소스를 고쳐야 할 경우 여기서 고치도록 하려고 했습니다. 여기는 개인 성향에 따라 다른 부분이라 따라하지 않아도 무관합니다. 3. 빨간색으로 되어있는 jni_stringFromJNI()에 마우스를 좌클릭하면 왼쪽 위에 빨간 느낌표가 뜹니다. 느낌표를 클릭하고 Create JNI function for jni_stringFromJNI를 클릭합니다. 클릭하..

개발/Android2022. 10. 27.

[Native C++] 3. 기본 헤더파일 경로 추가하기.

이 챕터는 굳이 할 필요 없는 챕터인데 설명을 위해 넣은 챕터입니다. 기존에 가진 소스를 활용할 경우 헤더파일 경로를 로 되어 있는것을 ""으로 수정하고 싶을 수도 있습니다. ​ 그래서 샘플프로젝트를 이용하여 기본 헤더파일 경로를 추가해보도록 하겠습니다. ​ 1. CmakeList.txt에 디렉토리 경로 추가인 include_dierctories를 입력하고 안에 경로를 넣습니다. 예제에서는 src 폴더입니다. 2. 그리고 sample.cpp에 #include "src/src.h"를 include 로 변경하고 동기화 후 빌드하면 됩니다.

반응형