struct smart1
{
  int A;    //4
  int B;    //8
  char C;    //12
  char D;    //12
  char E;    //12
  short F;  //16
  char G;    //16
  int H;    //20
  char I;    //24
  short J;  //24
  char K;    //28
};

int main()
{
  printf("%d \n"sizeof(struct smart));

  return 0;

}

이렇게 선언하면 28byte가 나온다. 이러한 아래의 메모리 구조 때문에


-              4바이트                     -

변수 선언을 지맘대로 했을때

 A(int)

 B(int)

 C(char)

 D(char) 

 E(char) 

 

 F(short)

G(char)

 

 H(int)

I (char)

 

J(short) 

 K(char)

 

 

 

 

 

 

 

(초록색은 메모리가 빈공간이다.)



변수선언을 메모리 공간에 맞춰서 했을때

 A(int)

 B(int)

F(short)

 J(short)  

 C(char)

D(char) 

E(char)

G(char) 

 H(int)

I(char)

K(char) 


 

 

 

 

 

 

 

 

 

24바이트가 나온다.


여기서 전처리어 #pragma pack(1)에서 부터 #pragma pack(4)로 묶어버린다면 22바이트가 나온다.

이것이 가장 속도 용량면에서 가장 좋은 효율을 보인다.


메모리로 확인해보자.


#pragma pack(1) 선언하지 않았을때

#pragma pack(1) 선언했을때


'C언어' 카테고리의 다른 글

20140411 구조체  (0) 2014.04.11
20140410 구조체 변수와 포인터  (0) 2014.04.10
20140408 구조체  (0) 2014.04.08
20140307 입출력함수  (0) 2014.04.07
20140304 표준 입출력과 버퍼  (0) 2014.04.04
by 날라차숑 2014. 4. 9. 17:08

WinAVR설치

구글에서 winavr검색 다운로드하면

WinAVR20100110을 받을수 있다. 받아라 커스텀설치에서 3가지 항목나오는데 3가지 다 받아두자.

'디지털회로' 카테고리의 다른 글

20140425  (0) 2014.04.25
20140424 USART  (0) 2014.04.24
20144022 문자열 숫자, 출력하기  (0) 2014.04.22
20140421 LCD2  (0) 2014.04.21
20140417 LCD  (0) 2014.04.17
by 날라차숑 2014. 4. 9. 12:33


#include <stdio.h>

struct smart  //->smart 구조체이름 //변수선언 아님
{
  char Name[7];
  char Phone[14];
  int  Age;
};
int main()
{
  struct smart People[3];    //struct를 꼭 붙여서 내가 만든 타입이란걸 안다

  int iCnt;
  
  for(iCnt=03>iCnt; ++iCnt)
  {
    printf("이름을 입력하세요. \n");
    scanf("%s", People[iCnt].Name);    //배열이 주소값을 나타내니 &필요없음
    printf("전화번호를 입력하세요. \n");
    scanf("%s", People[iCnt].Phone);
    printf("나이를 입력하세요. \n");
    scanf("%d"&People[iCnt].Age);    //&People[iCnt].&Age로 쓰지마라.배열이 아니니 주소값을 붙여주자
  }

  for(iCnt=03>iCnt; ++iCnt)
  {
    printf("이름:[%s] 전화번호:[%s] 나이[%d] \n", People[iCnt].Name,People[iCnt].Phone, People[iCnt].Age);
        
  }

  return 0;
}


연습문제2

 #include <stdio.h>


struct   employee
{
  char eName[8];           //이름
  char idNum[16];          //주민번호
  int salary               //연봉

};

int main()
{
  struct employee emp[3];        //배열세개를 선언해서 세명분을 넣어보자.
  int i;
  
  for(i=03>i; i++)
  {
    printf("이름을 입력하시오 \n"); scanf("%s", emp[i].eName);
    printf("주민번호를입력하시오 \n"); scanf("%s", emp[i].idNum);
    printf("연봉을 입력하시오 \n"); scanf("%d", emp[i].salary)
  }
  for(i=03>i; i++)
  {
    printf("%s \n", emp[i].eName);
    printf("%s \n", emp[i].idNum);
    printf("%s \n", emp[i].salary);
    
  }
  

  return 0;
}




구조체 배열의 초기화

 #include <stdio.h>


struct person
{
  char name[20];
  char phoneNum[20];
  int  age;
};

int main()
{
  struct person arr[3]={
    {"이승기""010-1212-0001"21},
    {"임윤아""010-3453-0002"20},
    {"티파니""010-7521-0003"30}
  };

  int i;
  for(i=03>i; i++)
    printf("%s %s %d \n", arr[i].name, arr[i].phoneNum, arr[i].age);
  
  
  return 0;
}



'C언어' 카테고리의 다른 글

20140410 구조체 변수와 포인터  (0) 2014.04.10
20140409 구조체 효율높이기  (0) 2014.04.09
20140307 입출력함수  (0) 2014.04.07
20140304 표준 입출력과 버퍼  (0) 2014.04.04
20414 함수 포인터와 void 포인터  (0) 2014.04.01
by 날라차숑 2014. 4. 8. 15:18



#include <stdio.h>

typedef unsigned int   smart;  //[새로운 타입의 정의 typedef]


//       old type-       newtype-


int main()

{

  smart Num;    //smart는 unsigned int 타입  

  Num = 100;  

  printf("%d", Num);  //unsigend int Num이랑 똑같이 출력된다.



  return 0;

} 



#include <stdio.h>

char * Mystrcpy(char * dest, const char * src);

int main()
{
  char str1[50]="Hello C";
  char str2[50];
  char str3[50];
  int iCnt;
  
  Mystrcpy(str2, str1);  //str1을 str2에 복사
  Mystrcpy(str3, str1);  //str2를 str3에 복사
  
  fputs(str1,stdout);  //Hello C출력
  printf("\n");
  fputs(str2,stdout);  //Hello C출력    
  printf("\n");
  fputs(str3,stdout);  //Hello C출력
  return 0;
}

char * Mystrcpy(char * dest, const char * src)
{
  int iCnt;
    for(iCnt=00!=src[iCnt]; iCnt++) 
    {
      *(dest+iCnt)=*(src+iCnt);  //str1을 str2에 복사 dest[iCnt]=src[iCnt]와동일
    
    }
    *(dest+iCnt)=0;        //str2에 완전 똑같게 넓값을 넣어준다.
  return dest;
}



#include <string.h>
int main()
{
  char str1[50="Oh! My ";
  char str2[50="girl!";

  char str3[50="010-8976";
  char str4[50="-4XXX";

  strcat(str1, str2);                //str2가 str1뒤에 붙는함수
  puts(str1);                        //Oh! My gril!이 출력됨을 알수있다.

  strcat(str3, str4);
  puts(str3);                        //마찬가지.



  return 0;
}



'C언어' 카테고리의 다른 글

20140409 구조체 효율높이기  (0) 2014.04.09
20140408 구조체  (0) 2014.04.08
20140304 표준 입출력과 버퍼  (0) 2014.04.04
20414 함수 포인터와 void 포인터  (0) 2014.04.01
20140331 이중포인터  (0) 2014.03.31
by 날라차숑 2014. 4. 7. 16:58



 #include <stdio.h>


int main()
{
  char * cpStr = "Test Program \n";
  
  
  while(*cpStr != 0)
  {
    putchar(*cpStr);
    cpStr = cpStr+1;     주소값을 1씩증가시켜서 가리키는 

                               대상을바꿈

                                   
      
  }

  return 0;
}


 #include <stdio.h>


void ClearLineFromReadBuffer(void)
{
  while(getchar()!='\n');
}

int main()
{
  char str[5];
  int i;


  for(i=03>i; i++)
  {
    fgets(str, sizeof(str), stdin);
    printf("Read %d: %s \n", i+1, str);
    fflush(stdin);       //입력버퍼를 비움 4글자를 넣어도 엔터영향없음
//    ClearLineFromReadBuffer();    //함수를 직접구현함
  }
  return 0;
}


#include <stdio.h>

int main()
{
  char * str="Simple String";

  printf("1. puts test ------ \n");
  puts(str);      //\n가 포함되어있음
  puts("So Simple String");  //\n가 포함되어있음

  printf("2. fputs test ------\n");
  fputs(str, stdout); printf("\n");
  fputs("So Simple String", stdout); printf("\n");

  printf("3. end of main ----\n");

  return 0;
}




'C언어' 카테고리의 다른 글

20140408 구조체  (0) 2014.04.08
20140307 입출력함수  (0) 2014.04.07
20414 함수 포인터와 void 포인터  (0) 2014.04.01
20140331 이중포인터  (0) 2014.03.31
20140327 포인터와 배열  (0) 2014.03.27
by 날라차숑 2014. 4. 4. 11:13



#include <stdio.h>

void SimpleAdder(int n1, int n2)      //더하기 함수
{
  printf("%d + %d = %d \n", n1 , n2, n1+n2);  
}
void ShowString(char * str)           //문자출력 함수
{
  printf("%s \n", str);
}

int main()
{
  char *  str = "Function Pointer";
  int num1 = 10;
  int num2 = 20;

  void (*fptr1)(intint= SimpleAdder;           
  void (*fptr2)(char *) = ShowString;

  /* 함수 포인터 변수에 의한 호출 */
  fptr1(num1, num2);
  fptr2(str);    

  return 0;
}

fptr1과   SimpleAdder와 동일한 값이 저장
fptr2와   ShowString과  동일한 값이 저장
fptr1();  SimpleAdder();
fptr2();   ShowString(); 은 결과가 같음.




'C언어' 카테고리의 다른 글

20140307 입출력함수  (0) 2014.04.07
20140304 표준 입출력과 버퍼  (0) 2014.04.04
20140331 이중포인터  (0) 2014.03.31
20140327 포인터와 배열  (0) 2014.03.27
20140326 포인터와 배열  (0) 2014.03.26
by 날라차숑 2014. 4. 1. 17:13


              ipp주소 문제있슴!! 




'C언어' 카테고리의 다른 글

20140304 표준 입출력과 버퍼  (0) 2014.04.04
20414 함수 포인터와 void 포인터  (0) 2014.04.01
20140327 포인터와 배열  (0) 2014.03.27
20140326 포인터와 배열  (0) 2014.03.26
20140324 지역변수 전역변수 & 배열  (0) 2014.03.24
by 날라차숑 2014. 3. 31. 14:32

 

#include <stdio.h>

int main()
{
  int arr[3= {112233}; //배열선언;
  int * ptr  = arr;          //배열주소의 포인터 선언;

  printf("%d %d %d\n"*ptr, *(ptr+1), *(ptr+2));
ptr이 가리키는 값(11) 다음값(22)그다음값(33)
  
  printf("%d ", *ptr); ptr++; 주소값의 증가
  printf("%d ", *ptr); ptr++;   주소값의 증가
  printf("%d ", *ptr); ptr--; 주소값의 감소
  printf("%d ", *ptr); ptr--;   주소값의 감소
  printf("%d ", *ptr); printf("\n");
  
  return 0;
}







 #include <stdio.h>


int main()
{
  char caText[256]= "APPLE";  //char형 문자배열선언, APPLE문자열 초기화

  scanf("%s", caText+5);  //APPLE뒤에올 문자입력
  printf("%s", caText);   
  
  return 0;
}






 #include <stdio.h>


void ShowArayElem(int * param, int len) 

아래의 arr1의 주소를 받음

아래의 arr1의 길이(또는문자개수)를 받음

{
  int i;
  for(i=0; i<len; i++)  len(arr1의 길이)까지 for문을 돌림
    printf("%d ", param[i]);  

아래의 배열이 나열되겠죠.!!


  printf("\n");
}

int main()
{
  int arr1[3= {123};
  int arr2[5= {45678};
  ShowArayElem(arr1, sizeof(arr1) /sizeof(int));
  ShowArayElem(arr2, sizeof(arr2) /sizeof(int));
  
  return 0;
}



'C언어' 카테고리의 다른 글

20414 함수 포인터와 void 포인터  (0) 2014.04.01
20140331 이중포인터  (0) 2014.03.31
20140326 포인터와 배열  (0) 2014.03.26
20140324 지역변수 전역변수 & 배열  (0) 2014.03.24
20140321 함수(1)  (0) 2014.03.21
by 날라차숑 2014. 3. 27. 17:12

함수를 이용해서 iNum1의 값과 iNum2의 값을 바꿔보자.

#include

void Swap(int n1, int n2);

int main()

{

int iNum1 = 10;

int iNum2 = 20;

Swap(iNum1,iNum2);

return 0;

}

void Swap(int n1, int n2)

{

int temp;      //임시로 공간(변수)하나 주자

temp= n1;    //temp에 10이 들어간다.

n1  = n2;    //n1에 20이 들어간다. 그러면 n1 == 20

n2  = temp; //n1에 값이 temp에 있었지요? 그렇죠? n2 == 10


printf("%d %d", n1, n2); //n1이 20 n2가 10이 되었다.



}


하지만 Main함수에서 iNum1값과 iNum2값이 바뀌었나요? 아니죠.

하지만 메모리 주소로 직접들어가면 바꿀수 있죠? 대마법사 포인터를 불러봅시다.

안녕 망할포인터야.!! 바꿔주세요다사이.

#include <stdio.h>

void Swap(int *n1, int *n2);


int main()

{

int iNum1 = 10;

int iNum2 = 20;

Swap(&iNum1, &iNum2);

printf("iNum1:%d iNum2:%d", iNum1, iNum2);


return 0;

}

void Swap(int *n1, int *n2)

{

int temp;

temp = *n1; //temp에 n1이 가리키는 값10들어갑니다.

*n1  = *n2; //n1  에 n2가 가리키는 값20들어갑니다.

*n2  = temp; //n2  에 temp(n1)      값10들어갑니다.

//참쉽죠!!

}



scanf를 이용한 배열선언

#include <stdio.h>

int main()

{

char str[50]; //50까지 배열을 선언함

int idx=0; //[idx]를 하기 위한 선언


printf("문자열입력하시오:");

scanf("%s", str);

printf("입력 받은 문자열: %s \n", str);//scanf에는 null값이 찍히니까 알아서 해준다.


printf("문자 단위 출력: ");       

while(str[idx] != '\0') //하나씩 str[0]에서부터 [50]까지 찍어준다.

{ //'\0' null값이 찍히면 반복문 종료. 

printf("%c", str[idx]);

idx++;

}

printf("\n");

return 0;

}

'C언어' 카테고리의 다른 글

20140331 이중포인터  (0) 2014.03.31
20140327 포인터와 배열  (0) 2014.03.27
20140324 지역변수 전역변수 & 배열  (0) 2014.03.24
20140321 함수(1)  (0) 2014.03.21
20140320 포인터의 기초  (0) 2014.03.20
by 날라차숑 2014. 3. 26. 17:02

전역변수와 동일한 이름의 지역변수가 선언되면?
#include
 <stdio.h>

int Add(int val);
int iNum = 1;    //전역변수

int main()
{
  int iNum = 5;  //지역변수
  printf("iNum: %d\n", Add(3));    
  printf("iNum: %d\n", iNum+9);


  return 0;
}

int Add(int val)
{
  int iNum = 9;
  iNum = iNum+val;
  return iNum;
}
//main의 iNum과 Add의 iNum은 다르다.




지역변수 전역변수로 답을 유추해보자.

#include <stdio.h>

void Test(void);


int main()
{
  Test();
  Test();
  Test();
  
  return 0;
}
void Test(void)
{
  int iNum1 = 0;  //STACK
  static  int iNum2;  //BSS
  int iNum3 = 0;  //STACK
  static  int iNum4;  //BSS
  int iNum5 = 0;  //STACK
  static  int iNum6 = 10;  //DATA
  int iNum7 = 0;  //STACK
  static  int iNum8 = 20;  //DATA
  int iNum9 = 0;  //STACK

  printf("iNum1 : %08X \n"&iNum1);
  printf("iNum2 : %08X \n"&iNum2);
  printf("iNum3 : %08X \n"&iNum3);
  printf("iNum4 : %08X \n"&iNum4);
  printf("iNum5 : %08X \n"&iNum5);
  printf("iNum6 : %08X \n"&iNum6);
  printf("iNum7 : %08X \n"&iNum7);
  printf("iNum8 : %08X \n"&iNum8);
  printf("iNum9 : %08X \n"&iNum9);
  
  ++iNum1;
  ++iNum2;
  ++iNum3;
  ++iNum4;
  ++iNum5;
  ++iNum6;
  ++iNum7;
  ++iNum8;
  ++iNum9;

  printf("iNum1 : %d \n", iNum1);
  printf("iNum2 : %d \n", iNum2);
  printf("iNum3 : %d \n", iNum3);
  printf("iNum4 : %d \n", iNum4);
  printf("iNum5 : %d \n", iNum5);
  printf("iNum6 : %d \n", iNum6);
  printf("iNum7 : %d \n", iNum7);
  printf("iNum8 : %d \n", iNum8);
  printf("iNum9 : %d \n", iNum9);

}




아래의 주석문을 배열로 바꿔써보자.
/*#include <stdio.h>

int main()
{
  int iNum1 = 1;
  int iNum2 = 2;
  int iNum3 = 3;
  int iNum4 = 4;
  int iNum5 = 5;
  int iNum6 = 6;
  int iNum7 = 7;
  int iNum8 = 8;
  int iNum9 = 9;

  printf("iNum1 = %d \n", iNum1);
  printf("iNum2 = %d \n", iNum2);
  printf("iNum3 = %d \n", iNum3);
  printf("iNum4 = %d \n", iNum4);
  printf("iNum5 = %d \n", iNum5);
  printf("iNum6 = %d \n", iNum6);
  printf("iNum7 = %d \n", iNum7);
  printf("iNum8 = %d \n", iNum8);
  printf("iNum9 = %d \n", iNum9);


  return 0;
}
*/


#include <stdio.h>

int main()
{
  int iNum[9];
  int iCnt;
  
  for(iCnt=09>iCnt; ++iCnt)
  {
    iNum[iCnt] = iCnt;    //0번방에0을집어넣어라~8번방에8을집어넣어라
  }
  
  for(iCnt=09>iCnt; ++iCnt)
  {
    printf("%d \n", iNum[iCnt]);  //0번방에는0~8번방에는8 확인
  }

  return 0;
}





'C언어' 카테고리의 다른 글

20140327 포인터와 배열  (0) 2014.03.27
20140326 포인터와 배열  (0) 2014.03.26
20140321 함수(1)  (0) 2014.03.21
20140320 포인터의 기초  (0) 2014.03.20
20140318 포인터의 이해  (0) 2014.03.18
by 날라차숑 2014. 3. 24. 17:19
| 1 ··· 5 6 7 8 9 10 11 |