전역변수로 선언한 것을 다른 파일에서 선언하여

사용할 때, 쓴다라고 정도로만 알고 있었는데 


http://tksssch29.tistory.com/162 에서 참조함



extern는 다른 파일에 선언되어 있는 전역변수에 대한 링크 시킨다는 의미이다.

extern 변수 선언시 변수의 타입을 기입하지 않는 경우가 있는데 이때 컴파일러는 type checjing작업을 통해
묵시적으로 사용된 값에 대한 타입을 예상하게 된다. 이는 곧 타입에 대한 기재가 없어도 심볼테이블을 통해
변수의 타입을 알아낸다는 의미가 되겠다.
하지만 만일 묵시적으로 선언된 변수가 외부에서 두가지 이상의 타입으로 선언되어 있다면 컴파일러가
어느 타입인지 추론하는게 어렵기 때문에 Link시 에러가 날 가능성이 있는 것이다.

많은 사람들이 extern 키워드를 이용하면 따로 변수를 선언하여 메모리를 잡는다고 이해하는 사람이 많다.
extern 키워드는 다른 파일에 선언되어 있는 변수를 링크시켜 자신이 만들고자 하는 프로그램에 쓸 수 있는 것이라
생각하면 된다. extern 키워드는 컴파일러에게 

"이러한 변수가 어딘가에 선언되어 있고 그거 쓸꺼니까 메모리 올리지 말고 일단 그냥 넘어가~"
라는 말을 하는 것이다.

extern로 선언된 변수는 Link시에 심볼테이블을 검색을 통해 다른 obj들로 부터 찾게 된다. 

다시 정리 하자!
extern 키워드를 사용해서 변수를 명시했다고 그것이 변수 선언을 의미하는게 아니다. 즉 메모리를 잡지 않는다는 것이다. 그 변수에 대한메모리는 다른 파일?에서 잡혀 있을거고, 링크타임때 그 변수에 대한 메모리를 찾아 링크시키는 것이다.

반응형

암호설정하기 자꾸 까먹어서 업어왔습니다.

http://pro.babyz.co.kr/68




압축하기 

( -P 옵션 옆에는 password, -r 옵션옆에는 압축될 파일명, 그 옆엔 압축당할 경로)

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

# zip -P manpage -r home.zip /home

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



압축 풀기  (그냥 풀면 암호 입력하라고 나옴, 아예 암호까지 입력해서 풀거나)

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

# unzip home.zip

# unzip -P manpage home.zip 

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

반응형

fwirte 함수를 가지고 바이너리 파일 쓰기를 하는데 

2,3번째 인자가 해깔린다... ㅜ.ㅜ


ptr

스트림에 쓰여질 배열을 가리키는 포인터.


size

그 배열의 각각의 원소의 크기

count

그 배열의 원소의 수 이다. 이 때, 각 원소의 크기는 size 바이트 이다.

stream

내용을 쓸 스트림을 가리키는 FILE 포인터

출처 :: http://itguru.tistory.com/69

--

#include 

int main ()
{
  FILE * pFile;
  char buffer[] = { 'x' , 'y' , 'z' };
  pFile = fopen ( "myfile.bin" , "wb" );
  fwrite (buffer , 1 , sizeof(buffer) , pFile );
  fclose (pFile);
  return 0;
}

---- 기타 fwrite example ----
FILE *fp;
fp=fopen("c:\\test.bin", "wb");
char x[10]="ABCDEFGHIJ";
fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp);
----------------------------





--

반응형

우연히 Junior, Senior, Lazy 프로그래머를 구분하는 

코딩에 대한 글을 보았다. 

소스코드를 보면 아래와 같다. 

물론 EDW519를 보다가 생각이 났다. 

====

Junior Programmer:
if (m==1){Month="January")}
if (m==2){Month="February")}
if (m==3){Month="March")}
if (m==4){Month="April")}
if (m==5){Month="May")}
if (m==6){Month="June")}
if (m==7){Month="July")}
if (m==8){Month="August")}
if (m==9){Month="September")}
if (m==10){Month="October")}
if (m==11){Month="November")}
if (m==12){Month="December")}
---------------------------------------------------------------
Senior Programmer:
switch(m)
{
case 1:
Month = "January"
break;
case 2:
Month = "February"
break;
case 3:
Month = "March"
break;
case 4:
Month = "April"
break;
case 5:
Month = "May"
break;
case 6:
Month = "June"
break;
case 7:
Month = "July"
break;
case 8:
Month = "August"
break;
case 9:
Month = "September"
break;
case 10:
Month = "October"
break;
case 11:
Month = "November"
break;
case 12:
Month = "December"
break;
default:
Month = "unknown"
}
---------------------------------------------------------------
Lazy Programmer:
MonthNames == ["","January","February","March",...]
Month = MonthNames[m]


====

위의 글을 볼때만 해도 음... 보기가 깔끔해서 그런건가 싶었다. 

뭔가 성능적인 문제도 있겠지만..

아래의 글을 보면서 난 아직도 형편없나보다 싶어서 찾게 되었다. 


Signs You’re a Crappy Programmer

==> You execute too much code because you don’t know the difference between “if” and “case”.


매우 많은 코드를 실행한다면 당신은 형편없는 프로그래머, 

왜냐면, 당신은 if와 case의 차이를 모르기때문에..


그렇다.. 난 여태 if와 case문의 차이점에 대해서 알려는 시도조차 안했다. OTL..


그래서 구글링으로 뒤적이다보니 아래의 링크에 아주 기가 막히게 설명을 해두었다.

http://blog.naver.com/PostView.nhn?blogId=kki2406&logNo=80041410085

완전 감사한마음으로 읽었고 요약하면 대략 이렇다. 


1. 성능을 향상시키느냐, 메모리 사용량을 줄이느냐의 문제가 있다.

  -  성능이 중요한 경우 : switch case문을 사용

  -  메모리 사용을 줄이고자 하는 경우 : if else문을 사용


2. swtich-case문의 특성

  - case값은 가급적 순차적으로 감소 혹은 증가하는 것이 메모리 관리면에서 좋다. 

  - case문의 개수가 4 미만이면 jump table을 사용하지 않고 그 이상이면 jump table을 사용한다.

    물론 사용하지 않는것이 성능면에서 좋을것 같다.

  - 1,2,3,1000 이런 경우에는 1,2,3에 대한 table을 생성하고 진입할 때, 1000은 따로 분기함.

  - gcc 4.4.3의 경우에는 table을 생성하지 않는다..는 추가내용까지


위의 내용은 링크된 블로그에 assembly 코드를 가지고 설명을 해뒀는데 

참.. 볼수록 잘 썼다. ㅋㅋ


반응형

'Language > C' 카테고리의 다른 글

extern 선언에 대한 쉬운설명  (1880) 2012.12.07
fwrite함수 예제  (758) 2012.11.06
바이너리 파일전송 C언어 예제 -클라이언트-  (467) 2012.10.18
바이너리 파일전송 C언어 예제 -서버-  (158) 2012.10.18
itoa 함수 예제  (468) 2012.10.17

본 페이지는 HACKER NEW의 TOP CONTIRBUTOR

Ed Weissman의 기고문을 바탕으로 작성되었습니다.

출처 : The Best of edw519

 

소프트웨어를 빙산처럼 나타내서

소프트웨어에서 소스코드중에

오픈소스가 얼마만큼 공개되어 있는지를

나타내면 아래와 같다.

 

빙산의 일각이라고 보면 되겠네,,,

 

반응형

이어서 클라이언트에서는 아래와 같습니다. 

IP주소, 포트번호, 파일 경로 및 인자 값 입력 받는 등의 추가 옵션은

코드를 약간만 변경하시면 됩니다.


해더파일은

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

----

int main(int argc, char **argv)
{

    int client_len;
    int client_sockfd;
    char buf[256];
    struct sockaddr_in clientaddr;

    clientaddr.sin_family = AF_INET;
    clientaddr.sin_addr.s_addr = inet_addr("100.10.1.57");
    clientaddr.sin_port = htons(8002);
    client_len = sizeof(clientaddr);

    client_sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (connect (client_sockfd, (struct sockaddr *)&clientaddr,
                client_len) < 0)
    {
        perror("connect error :");
        exit(0);
    }

    int nbyte;
    size_t filesize = 0, bufsize = 0;
    FILE *file = NULL;

    file = fopen("test.jpg", "wb");

    ntohl(filesize);
    recv(client_sockfd, &filesize, sizeof(filesize), 0);
    printf("file size = [%d]\n", filesize);
    bufsize = 256;
    while(filesize != 0)
    {
        if(filesize < 256)
            bufsize = filesize;

        nbyte = recv(client_sockfd, buf, bufsize, 0);
        filesize = filesize -nbyte;

        fwrite(buf, sizeof(char), nbyte, file);

        nbyte = 0;

    }

    close(client_sockfd);
    fclose(file);
    return 0;
}


반응형

'Language > C' 카테고리의 다른 글

fwrite함수 예제  (758) 2012.11.06
switch case문과 if문의 성능차이  (450) 2012.10.31
바이너리 파일전송 C언어 예제 -서버-  (158) 2012.10.18
itoa 함수 예제  (468) 2012.10.17
strspn 함수 예제  (3488) 2012.09.20

파일전송하는데 그냥 write, read를 사용하는 경우에는

TEXT파일만 전송하는 문제가 생겼습니다. 

그래서 바이너리 파일 전송을 해야해서 여기저기 참고해서 작성했습니다. 


참고 : http://altibase.net/66


추가해야할 해더파일은

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

이렇습니다. 


아래의 소스코드가 맘대로 복사되게 해야하는데 방법을 모르겠습니다. 

아시는 분은 좀 알려주시길...


파일 사이즈를 얻는 방식은 2가지가 있습니다. 하나는 주석처리함.

----

int main(int argc, char **argv)
{
    int server_sockfd, client_sockfd;
    int state, client_len;
    size_t fsize = 0, nsize = 0, fpsize = 0;
    size_t fsize2 = 0;
    size_t fsize3 = 0;
    FILE *file = NULL;

    int ret;
    struct stat file_stat;

    struct sockaddr_in clientaddr, serveraddr;

    char buf[256];
    memset(buf, 0x00, 256);
    state = 0;

    client_len = sizeof(clientaddr);

    if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket error : ");
        exit(0);
    }

    memset(&serveraddr,0x00, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(8002);

    state = bind(server_sockfd , (struct sockaddr *)&serveraddr,
            sizeof(serveraddr));
    if (state == -1) {
        perror("bind error : ");
        exit(0);
    }
    state = listen(server_sockfd, 5);
    if (state == -1) {
        perror("listen error : ");
        exit(0);
    }


    file = fopen("test.jpg", "rb");
    fseek(file, 0, SEEK_END);
    fsize = ftell(file);
    fseek(file, 0, SEEK_SET);

    /*
    ret = lstat("test.jpg", &file_stat);
    if (ret < 0) {
        return -1;
    }
    if (file_stat.st_size == 0) {
        return -1;
    }

    fsize3 = file_stat.st_size;
    printf("file size 1 [%d]\n", fsize);
    printf("file size 2 [%d]\n", fsize3);
    */

    client_sockfd = accept(server_sockfd,
            (struct sockaddr *)&clientaddr, &client_len);
    printf("file size [%d]\n", fsize);
    fsize2 = htonl(fsize);
    printf("file size [%d]\n", fsize2);

    send(client_sockfd, &fsize2, sizeof(fsize), 0);

    while(nsize != fsize)
    {
        fpsize = fread(buf, 1, 256, file);
        nsize = nsize+fpsize;
        send(client_sockfd, buf, fpsize, 0);
    }
    printf("file send \n");
    close(client_sockfd);
    fclose(file);

    return 0;
}


----

반응형

'Language > C' 카테고리의 다른 글

switch case문과 if문의 성능차이  (450) 2012.10.31
바이너리 파일전송 C언어 예제 -클라이언트-  (467) 2012.10.18
itoa 함수 예제  (468) 2012.10.17
strspn 함수 예제  (3488) 2012.09.20
strcmp 함수 예제  (3161) 2012.08.17

가끔가다가 integer, long, float 타입을 char 형식으로 바꿔야할

일이 생겼습니다.

 

예를 들면 itoa 함수를 찾아보니 따로 존재하지 않았습니다.

물론 구글에 검색하면 비슷한 기능을 수행하는 함수의 예를 확인하실 수 있습니다.

 

본 페이지의 하단에 대략적인 itoa 함수를 나타냈습니다.

하지만 http://www.cfaq.com 웹페이지에서 제안하는 방식은.

snprintf(sprintf) 함수를 이용하는 것 입니다.

 

예를 들면 아래처럼 사용할 수 있다.

 

char test_char[16] = {0,};
int test_int = 10000;

snprintf( test_char, sizeof(test_char), "%s", test_int);

 

 

 

 

 

#define INT_DIGITS 19		/* enough for 64 bit integer */

char *itoa(i)
     int i;
{
  /* Room for INT_DIGITS digits, - and '\0' */
  static char buf[INT_DIGITS + 2];
  char *p = buf + INT_DIGITS + 1;	/* points to terminating '\0' */
  if (i >= 0) {
    do {
      *--p = '0' + (i % 10);
      i /= 10;
    } while (i != 0);
    return p;
  }
  else {			/* i < 0 */
    do {
      *--p = '0' - (i % 10);
      i /= 10;
    } while (i != 0);
    *--p = '-';
  }
  return p;
}

--------

반응형

'Language > C' 카테고리의 다른 글

바이너리 파일전송 C언어 예제 -클라이언트-  (467) 2012.10.18
바이너리 파일전송 C언어 예제 -서버-  (158) 2012.10.18
strspn 함수 예제  (3488) 2012.09.20
strcmp 함수 예제  (3161) 2012.08.17
strchr 함수 예제  (442) 2012.08.14

+ Recent posts