300x250
반응형

비교를 하기 위해서 strlen함수를 호출하였다.

하나하나 읽어 가며 null이 들어가면 빠져나가도록 처리.

 

결과는 다음과 같다.

내가 입력한 만큼 나온다. 첫번째 size는 만든 함수, 두번째 size는 실제 strlen의 값이다.

 

 

728x90
300x250
반응형

오늘은 static변수 및 static 함수에 대해서 공부를 해볼 예정이다.

static변수및 함수. 정적 변수 와 정적 함수라고 표현 한다.

우리는 일반적으로 함수를 정의 하면 여러군대에서 호출 하여 사용 한다.

그러나 static 키워드를 붙이면 해당 소스 파일 내부에서만 사용이 가능 하다.

그럼 예제를 보도록 하자.

 

일반적으로 사용 하는 함수방식의 결과값이다. 

우리가 흔히 아는 방식으로 결과 값이 나온다.

 

만약에 다른 소스코드에 같은 함수명을 사용 한 경우는 어떨까?

test.c라는 파일을 추가 하고 똑같은 func1을 정의 하면 다음과 같은 에러가 발생.

중복으로 func1이 지정되어 있어서 컴파일 에러를 발생 시킨다.

 

이럴 때 static을 사용 하면 해당 에러가 사라진다.

둘중에 하나만 하던지 아니면 둘다 하는게 좋다.

개인적으로는 중복이 되는 네이밍이 있다면 중복되는 네이밍 전부 static을 붙여 주자.

 

static 키워드를 붙이면 해당 에러가 사라 진다.

 

static 변수.

static변수는 값이 계속 유지가 된다.

또한 global변수와 다르게 해당 코드 내에서만 호출이 가능하다.

 

 

728x90
300x250
반응형

이전에 올렸던 자료를 정리겸 포스팅 한다.

 

주제는 달력데이터 입니다. 내가 원하는 년도를 입력 하면 그 해당 년도에 맞게 데이터를 뽑아와서 DB에 저장 합니다.

그리고 토 / 일 은 주말 = 'N' 월~금 은 평일 = 'Y'

또한 윤년 계산 및 해당 년도 국가 지정 공휴일 포함 하였습니다.

 

먼저 날짜 데이터를 뽑아 옵니다.





 

 

뽑아온 데이터를 가지고 주말 평일 구분 지어서 DB에 insert를 합니다. 그리고 같은 데이터를 또 입력 할 경우에는

업데이트를 하도록 하였습니다.

 

 

DB에 접속하는 부분

 

 

국가 지정 공휴일 데이터를 가져오는 부분입니다.

 

지정 데이터는 2013년도의 데이터를 준비 하였으며 그 해당 외 입력시에는 

 

지정 데이터가 적용이 안되야겠지요?

 

또한 필요 하다면 추가 시키면 됩니다.

 

이상합니다. 수고하세요

728x90
300x250
반응형

C언어가 아니여도 되고 그냥 기초 다지기 입니다.

 

실행환경은 리눅스입니다.

위에 그림을 보면 구조 AA, BB가 있는데 엇뜻 보면 두개 다 같을 것입니다.

하지만 각각 결과는 다르죠

밑에 그림을 보시면 결과가 다를 겁니다.

 

 

AA는 16바이트 BB는 20바이트가 나오게됩니다. 이거는 구조체 안에 변수의 위치 따라 달라지게 됩니다.

 

이럴때는 간단한 메모리맵을 그려서 확인하는것도 나쁘진 않습니다.

환경이 32비트환경입니다. 그러면 32비트 = 4바이트,    64비트 = 8바이트가 됩니다.

현재 그림은 32비트 환경의 컴퓨터입니다. 그러므로 4바이트씩 나누어 지게 되는거죠. char a,b는 1바이트입니다. 하지만 4바이트씩 나눈다고 했습니다. 일단 그림으로 봤을 때는 a,b= 2바이트 c=4바이트 d=8바이트 하지만, 4바이트씩 인식이 되므로,

a,b는 4바이트 c는 4바이트 d는 8바이트 이므로 16바이트가 됩니다.

 

그림을 보면 바이트 단위로 나누어져 있습니다. 8바이트 역시 4바이트씩 나누어 지지만 그 크기 자체가 8바이트 이기 때문에 4바이티 + 4바이트 = 8바이트가 되는 겁니다.

 

 

또한 BB구조체  경우에는  a = 1바이트 , b = 4바이트, c = 1바이트, d = 8바이트 입니다. 이 경우에는 출력을 할 경우에 20바이트가 되게 되는데요. 그 이유를 보면

아까 말씀 했듯이 4바이트 단위로 나누어 집니다. a는 1바이트 그럼 3바이트가 남죠 4바이트 - 1바이트 = 3바이트 이런식이니깐요. 그러면 b는 기본 4바이트 이기 때문에 채워질수가 없어서 4바이트를 따로 담습니다. 그러면 총 현재 8바이트가 되죠, 그다음 char형 c는 1바이트 지만 4바이트 기준으로 4바이트에 채워지면서 4바이트 12바이트가 됩니다. 또한 double형은 기본 8바이트죠 4바이트 형식 두번 채워지므로 총 8바이트 입니다. 4  + 4 + 4 + 8바이트 = 20 바이트가 됩니다.. 설명이 너무 난해 할수도 있는데요.. 궁금하시면 답변 따로 드리겠습니다.

배열이 또 들어가면 그 메모리형식은 또 달라지게됩니다.

이 것이 중요한 이유는 기본적으로 우리가 memcpy를 할 때 강제 사이즈를 주는 경우가 있는데 이렇게 되면 32비트 64비트 형식일때 들어가는 사이즈가 달라집니다 이점 유의하시기 바랍니다.

 

 

-------------------------------------------------------------------------------------------

그리고 AA구조체에 배열을 추가 해서 할경우에는 

 

AA구조체는 20바이트가 됩니다. 물론 4바이트 니깐 16바이트에서 20바이트가 되는거겠죠?

하지만. 그림을 그려보면

[a,b0,b1,b2][b3,x,x,x][c,c,c,c][d,d,d,d][d,d,d,d] = 20byte 이런식으로됩니다.

그전에 배열이 빠졌을 경우에는?

[a,b,x,x][c,c,c,c][d,d,d,d][d,d,d,d] = 16byte가 되는겁니다. 내부구조를 알면 더 손쉽게 이해하기가 쉽니다. 

 

728x90
300x250
반응형

간단한 성적 관리 프로그램을 만들어 보았습니다.

내 학점을 계산하기  귀찮거나 그럴경우 이용하시면 괜찮을 것 같습니다.

 

grade.h

 

#include<stdio.h>
#include<stdlib.h>

#define A_PLUS 4.5
#define A   4
#define B_PLUS 3.5
#define B   3
#define C_PLUS 2.5
#define C   2
#define D_PLUS 1.5
#define D      1
#define F   0

#define MAX 10

typedef struct Grade
{
 double num;
 double total;

}GRADE;

void calc(int,int,GRADE *ga);

 

 

calc.c

 


void calc(int in1,int in2, GRADE *ga)

 
 switch(in2)  //성적번호입력
 {  
 case 1:
  ga[in1].num = A_PLUS;  //for문 안의 i값을 넘겨준다.
  break;
 case 2:
  ga[in1].num = A;
  break;
 case 3:
  ga[in1].num = B_PLUS;
  break;
 case 4:
  ga[in1].num = B;
  break;
 case 5:
  ga[in1].num = C_PLUS;
  break;
 case 6:
  ga[in1].num = C;
  break;
 case 7:
  ga[in1].num = D_PLUS;
  break; 
 case 8:
  ga[in1].num = D;
  break;
 case 9:
  ga[in1].num = F;
  break;
 }

  
}

 

main.c

 


void main()
{
 GRADE ga[MAX];

 int in;   //수강 학점입력
 int in_2;  //성적입력
 int in_3;  //해당 학점입력
 int in_4;  //총 수강 학점 입력
 int i;
 double result = 0;

 printf("----학점 계산 프로그램----\n");
 printf("총 몇과목 수강 하셧습니까? ");
 scanf("%d",&in);

 for(i=0;i<in;i++)
 {
  printf("성적 입력 하세요\n");
  printf("1.A+ 2.A 3.B+ 4.B 5.C+ 6.C 7.D+ 8.D 9.F\n");
  scanf("%d",&in_2);

  printf("몇학점 입니까 : ");
  scanf("%d",&in_3);
  calc( i, in_2, ga); 
 }

 printf("총 수강 학점을 입력 하세요 : ");
 scanf("%d",&in_4);

 for(i=0;i<in;i++)
 {
  ga[i].total = ga[i].num * in_3;
  result += ga[i].total;
 }
 
 printf("총점 : %0.2lf",result/in_4);

 printf("\n");
}

728x90
300x250
반응형

오랜만에 복습 할겸.

리눅스에서 라이브러리를 만들어 보려고 합니다.

함수를 라이브러리화 시켜서 공류를 해서 각각에서 쓸수 있도록 하려고 합니다.

나중에 Makefile 이 더 익숙해지면 아마 더 편해 지겠지만

일단 하드하게 직접 만들어 보도록 하겠습니다.~

 


머 이순서는 크게 중요치 않는데요, 저는 일단 헤더파일은 하나 생성 해주었습니다.

func_test.h 파일을 생성해서 내가 정의할 함수를 헤더에서 선언을 해주었습니다.

 


자 그리고, func_test.c 파일을 만들어서

내가 헤더에서 선언한 함수를 정의 하도록 하겠습니다.

이렇게 간단하게 덧셈과 뺄셈으로 정의를 해서

메인 소스에서 func1 func2함수를 사용하도록 할겁니다.

그리고 오브젝트 파일을 먼저 만듭니다.

 


자 사용하기에 앞서 이제 라이브러리를 만들겁니다. 위에  정의한대로 라이브러리를 만들건데요,

위에 보이는 명령어대로 정적 라이브러리를 만듭니다.

옵션에 대해서는 man ar 를 해보시면 더욱 자세히 알 수 있습니다.

그리고, 여기서 중요한것 라이브러리 명이니다. 저는

libfunc.a 라고 했는데요, 내가 만들 라이브러리 명에서 lib 이거는 무조건 해주셔야

만들수가 있습니다. 자 그러면 libfunc.a 라는 라이브러리가 생성이 되었습니다.

 

 

 

그러면 이제 func_main.c 소스를 만들어서 내가 직접 제작한

라이브러리를 사용하도록 하겠습니다.

func_test.c 에 정의된 함수를 사용할건데요, 보시면 func1 func2라는 함수를 사용합니다.

만약에 라이브러리화를 시키지 않았다면 오류가 발생하겠죠??

func_test.c가 선언된 헤더파일을 추가해주시고 프로그래밍 하시면 되겠습니다.

 


자 그리고 실행파일을 만들도록 하겠습니다. 위에 보이는 명령어 되로 실행하시면되겠고,

-L./ -lfunc :현재 경로에서 라이브러리를 추가한다는 것입니다.

만들때는 libfunc.a 라고 했지요? 명령어를 사용하여 최종 만들때는 lib -> l로 변경하여 이렇게 추가 해주시면 됩니다.

 

그리고 실행을 해보시면 결과값이 출력이 됩니다.

 

이상 포스팅을 마치겠습니다^^

728x90

+ Recent posts