linux/linux tips2012. 1. 9. 18:35
함수 호출 시 구조체 변수를 인자로 전달하거나 리턴하는 과정에서 일어나는 모든 일은
기본 자료형 변수와 완전히 동일하다

■ 함수의 인자로 전달되는 구조체 변수
구조체 변수를 함수 호출 시 전달하는 방법은 일반 변수를 전달하는 방법과 마찬가지로 크게 두가지로 나뉜다

값에 의한 전달(call - by - value)와 레퍼런스에 의한 전달(call - by - reference)로 나뉜다

다시한번 말하지만 이러한 과정과 일은 일반변수와 같다 
 

■ typedef 란 키워드는 무엇인가?
이미 존재하는 자료형에 새로운 이름을 붙이기 위한 용도로 사용된다

typedef int INT;

해석 : 이름을 지어주자 // int 에게 // INT 라는 이름을 

그럼 구조체를 쓸때는???

typedef struct data data

해석 : 이름을 지어주자 // struct data 에게 // data 란 이름을..

그럼 구조체 선언을 할때
data d = {1,2}
이렇게 struct 를 쓸필요가 없다!!

구조체 정의와 typedef 선언 동시에 하기

typedef struct data{

  int data 1;
  int data 2;
}data;  <--- 새로운 이름
...
data d = {1,2}; 

 
 

'linux > linux tips' 카테고리의 다른 글

백트랙 깔기 , centos 깔기  (0) 2013.01.21
쉘스크립트 결과 화면 깨질때  (0) 2013.01.03
구조체에 대한 이해  (0) 2012.01.09
리눅스 함수에 대한 이해  (0) 2012.01.09
리눅스 프로그래밍 오류처리  (1) 2012.01.07
Posted by babuzzzy
linux/linux tips2012. 1. 9. 18:12
구조체란 하나 이상의 변수를 그룹 지어서 새로운 자료형을 정의하는 것이다.
 
구조체를 정의하는 기본적인 방법

struct point // point라는 이름의 구조체 선언     

     int x;    //구조체 멤버
     int y;    //구조체 멤버 
};
 


 point 라는 이름은 하나의 자료형이 된것이다
--> 기본자료형 변수를 묶어 새로운 자료형을 만든 것!!

구조체 정의와 구조체 변수 선언의 분리

struct point {

    int x;
    int y;
};

int main(void)
{
    struct point p1, p2, p3;
    ...
    return 0;


 구조체 변수로의 접근

int main(void)
{
    struct point p1, p2, p3;
    p1.x=10;
    p2.x=20;
    ...
    return 0;



구조체의 멤버에 배열도 들어갈수 있다.

struct person {

    char name[20];
    char phone[20];
}; 



 구조체 변수와 포인터
:구조체 포인터를 선언하여 구조체 변수를 가리킬 수 있다
person이라는 구조체가 이미 있다고 가정하고

struct person* p;


 이렇게 구조체 포인터를 선언 할수 있다.

#include <stdio.h>

struct person {
   char name[20];
   char phone[20];
};

int main()
{
    struct person man = {"thomas", "354-00xx"};
    struct person* pMan;
    pMan= &man;

    //구조체 변수를 이용한 출력
    printf("name        : %s\n", man.name);
    printf("phone       : %s\n", man.phone);

    //구조체 포인터를 이용한 출력
    printf("name        : %s\n", (*pMan).name);
    printf("name        : %s\n", (*pMan).phone);

    //구조체 포인터를 이용한 출력 2
    printf("name        : %s\n", pMan->name);
    printf("name        : %s\n", pMan->phone);

return 0;




 





포인터 변수와 구조체 멤버
: 구조체의 멤버로 포인터가 선언되는 경우

struct perinfo{
   char addr[30];
   char tel[20];
};
struct person {
   char name[20];
   char pID[20];
   struct perinfo* info;
}; 

 
구조체 변수의 주소값과 구조체 변수의 첫 번째 멤버의 주소 값
"구조체 변수의 주소 값과 구조체 변수의 첫 번째 멤버의 주소 값은 같다"
 

Posted by babuzzzy
linux/linux tips2012. 1. 9. 17:16

예를 들어서 

#include <sys/utsname.h>
int uname (struct utname *name); 


이렇게 원형이 있다고 하면
이것을 어떻게 사용해야하는지에 대해서 곰곰히 생각해보자

main 위에 선언되는게  
int uname (struct utsname *name); 
이거라고 생각하고..
그렇다면 당연히 uname 인자에는 주소값이 들어가야겟네.
포인터는 주소값을 저장하기 위한 변수니까..

struct utsname 으로 미리 buf 라는 구조체를 하나 만들고
거기에 대한 주소를 전달해줘야되니까
uname (&buf) 이렇게 하면 되겠네.



 

'linux > linux tips' 카테고리의 다른 글

구조체 변수의 전달과 리턴  (0) 2012.01.09
구조체에 대한 이해  (0) 2012.01.09
리눅스 프로그래밍 오류처리  (1) 2012.01.07
우분투 11.10 에서 vnc 하기  (1) 2011.10.30
우분투 live 부팅 이란  (0) 2011.10.30
Posted by babuzzzy
linux/linux tips2012. 1. 7. 21:55
리눅스를 하다보면 오류처리를 해야할 일이 아주 많다

리눅스 오류처리 할때 구분해야할것이 있다

1. errno 에 셋팅 되느냐
2. errno  에 셋팅이 안되느냐


1번상황 errno에 셋팅이 되면 에러노 처리를 하자

리눅스에서는 거의 모든 함수가 오류 일때 errno일때 셋된다
간단하게


 void DieWithSystemMessage(const char *msg)

 {

     perror(msg);

     exit(1);

  }

위의 두가지를 분류해서 함수로 만들어서 사용하기 편리하다
ex) DieWithSystemMessage("bind() failed");

perror는 입력한 값을 그대로 출력


perror 함수 원형
#include <stdio.h>
void perror(const char *s);


이때 매개 변수 s 에는 오류 메시지 앞에 덧붙이고 싶은 문자열을 전달하면 된다.


myperror.c 오류 메시지 출력 예    open: No such file or directory 이렇게 해당 오류내용을 보여준다



2번상황
errno 셋팅이 안될때
주로 argc 판별할때 쓴다

 void DieWithUserMessage(const char *msg, const char *detail)

  {

      fputs(msg, stderr);

      fputs(": ", stderr);

      fputs(detail, stderr);

      fputc('\n', stderr);

      exit(1);

  }

ex) if ( argc !=2)
 DieWithUserMessage("Usage : is directory_name")  







 

'linux > linux tips' 카테고리의 다른 글

구조체에 대한 이해  (0) 2012.01.09
리눅스 함수에 대한 이해  (0) 2012.01.09
우분투 11.10 에서 vnc 하기  (1) 2011.10.30
우분투 live 부팅 이란  (0) 2011.10.30
./configure 와 make 의 이해  (0) 2011.10.30
Posted by babuzzzy
c language2012. 1. 7. 17:26
#include <stdio.h>

void fct1(int );
void fct2(int);

int a=10;
int b=20;

int main (void)
{
int m=123;

fct1(m);
fct2(m);
return 0;
}

void fct1(int c)
{
int d= 30;
}
void fct2(int e)
{
int f=40;
}
--------------------------------------------------------------------------------------
전역변수 가 프로그램이 종료 될때까지 종료되는 이유
데이터 영역에 있기 때문에 

main 함수는 시스템에 의해서 자동적으로 호출된다는 점을 제외하면 사실상 일반 함수와 차이가 없다

변수 m도 main 함수 내에서 선언 되었으므로 지역 변수다
지역 변수는 함수가 호출되어 실행되는 동안에만 유효한 변수이다
main 함수가 완료되면 지워져 버린다

void fctl(int c) 와 같은 함수 내에 선언된 변수도 지역변수다

스택의 중요한 특징
함수 호출시 할당 되었다가 함수 호출이 완료 되면 사라져 버린다

main의 완료는 프로그램의 종료를 의미하므로 데이터 영역도 완전히 지워지고 프로그램은 종료하게 된다

------------------------------------------
배열 선언 시 반드시 상수만 써야 하는 이유
--
스택과 데이터 영역에 할당될 메모리의 크기는 컴파일 동안에 결정되어야 한다

중요한 이야기이다 

void function (int a)
{
    int b;
    int c[2];
}

우리가 컴파일러 라고 해도 이 function 함수는 stack에 16바이트
매개변수 a 가 4바이트  지역변수 b 가 4바이트 배열 c가 8바이트  총 16바이트가 스택공간에 할당된다
 
이것처럼 컴파일 동안에 메모리의 크기가 할당되어야 한다. 

그러니까 
void function(int i)
{
int array[i];
}
여기서 당연히 오류가 생기는 것이다

그래서 보통 다음과 같이 표현한다
"데이터 영역과 스택에 할당될 메모리의 크기는 컴파일 타임에 결정되어야 한다"

void function(void)
{ int i=10;
int array[i];
}
---> 이렇게 해도 에러가 생긴다
Posted by babuzzzy
The PHANTOM of the OPERA2011. 12. 19. 21:37
He had suddenly appeared before them in the passage
그는 그들앞에서 갑작스럽게 사라졌다

They thought he seemed to have come through the wall.
 그들은 생각했다//그는 벽을 통과해서 온거같다라고//
 
After the dancers finished describing what they had seen, no one spoke for several minutes.
댄서들이 그들이 본것을 묘사하는것이 끝난뒤에, 몇분동안 아무도 말을 하지 않았다.

Then Jammes, with a look of real terror on her face, whispered, "Listen!"
곧 Jammes 가 공포로 뒤덥힌 얼굴로 속삭였다. "들어봐!"

Everybody heard a rustling sound outside the door. 
rustling sound : 옷 스치는 소리
모두가 문밖에 옷 스치는 소리를 들었다

There was no sound of footsteps.
발자국 소리는 없었다.

Then it was silent again
그리고 다시 고요했다.

Sorelli tried to show more courage than the others.
courage : 용기
sorelli 는 다른사람보다 용기를 내보려 노력했다 

She went to the door and in a trembling voice asked "Who's there?" Nobody answered

그녀는 문쪽으로 갔다. 그리고 떨리는 목소리로 말했다. "거기 누구에요?" 아무도 대답하지 않았다

Sorelli said very loudly, "Is there anyone behind the door?"
소릴리는 아주 크게 말했다. "문뒤에 아무도 없어요?" 

"Oh yes,yes! Of course there is!" cried Meg.
"아 맞아맞아! 분명 거기 있어!" Meg가 울부짓엇다
 
"Whatever you do, don't open the door! oh , lord, don't open the door!" 
"니가 누구든, 문을 열지마 오 신이시어 문열지마!"

 But Sorelli had already turned the key and opened the door.
그런 Sorelli 는 열쇠를 열고 문을 열었다.

In her hand she held the small dagger that she always carried with her.
그녀의 손에는 그녀가 항상 지니고 있던 작은 단검을 쥐고 있엇다

The dancers moved toward the back of the dressing room, away from the door.
 댄서들은 문쪽에서 멀리 드레싱룸에서 가까지 붙어 있었다.

Meg cried softly for her mother.
Meg 는 그녀의 엄마를 위해 울었다

Sorelli looked bravely out into passage.
Sorelli 는 용기있게 통로쪽을 들여다보았다.

A gaslight flickered and made a red glow in the darkness
.
가스라이트는 켜지고, 어둠속에서 빨간 불꽃을 만들었다.

The passage was emty.
통로에는 아무도 없었다.

Sorelli slammed the door again, with a deep sigh

 a deep sigh : 깊은 한숨
Sorelli는 한숨을 쉬며 문을 쾅 닫았다.

"NO" she said, "there is no one there"
"없어." 그녀는말했다. "아무도 없어"

"But we saw him!" cried Jammes
"하지만 우리는 그를 봤어요!" Jammes는 소리쳤다.
 
"He must be somewhere. I won't go back to our dressing room. We must all go down to the Dancers' Hall together for the speech. Then we will come back here again, together"
그는 분명 어딘가 있어요, 저는 우리 드레싱룸으로 돌아가지 않을거에요. 우리는 (이사실을) 알리기위해 함께 댄서홀로 내려가야되요.  그러면 우리는 다시 여기에 올수있어요!"


As she spoke, Jammes touched the little coral ring she wore as a charm against bad luck.
charm : 매력 
그녀가 말할때 , Jammes는 작은 산호색의 종을 쳤다//그녀가 불운에 대비해서 갖고다니던??

Sorelli turned her back to the dancers for a few moments.
Sorelli는 댄서들에게 등을 돌려있었다//몇분동안

With her knife she quickly scratched a cross on the wooden ring she wore on her left hand.
그녀는 재빠르게 칼로 나무종을 긁었다.//그녀의 왼손에 있던 (나무종을)

Then she faced the dancers again.
그리고 다시 댄서들을 마주보았다.

"Come on, pull yourselves together!" she said with a brave expression.
"와라 다덤벼봐" 그녀는 용기있게 말했다

"I don't believe anyone has seen the phantom except Joseph Buquet, the scene-shifter.
나는 연극무대 담당자인 Joseph Buquet을 제외하고 누가 팬텀을 봤다는것을 믿지않아"
 
And he has described him so well that everyone imagines they see him in every dark corner.
그리고 그는 그를 묘사했다 모두가 상상한다/ 그들이 어둠속에서 그를 본 이미지를  


 
Posted by babuzzzy
thinking/life2011. 11. 29. 02:16

남자라면 누구나 공감

 

'thinking > life' 카테고리의 다른 글

사람은 간사해서 좋은것은 다 잊어먹는데..  (1) 2011.09.14
Posted by babuzzzy
c++2011. 11. 5. 18:06

9.3 프렌드 함수(friend function)


 

프렌드 함수의 매개변수는 반드시 클래스의 객체변수 이다 
예를 들면 friend int bbb(student aa);
이렇게 student 클래스 aa라고 객체변수로 만들어서 매개변수에 쓴다


 

클래스의 private 멤버 변수의 초기화는 멤버함수를 통하여 하였다. 그러나 일반 함수로서 비공개 멤버 변수에 접근할 수 있는 것이 프렌드 함수이다.

 

프렌드 함수는 클래스에 종속되지 않은 외부 함수로서 기술하여 멤버 변수에 접근할 수 있기에 멤버 함수와 동일한 기능을 수행할 수 있다.

 

프렌트 함수는 일반 함수로 정의하지만 프렌드 함수를 사용하는 클래스에는 프렌트 함수의 프로토타입을 정의해야 한다. 그리고 함수 앞에 friend라고 키워드를 붙여야 한다.

 

멤버함수는 프로토타입 선언 후 클래스 밖에서 클래스명::멤버함수명()으로 사용하였다.

1) 프렌드 함수는 일반함수이다.

2) 클래스내에 프렌드 함수의 원형을 선언하고 외부에 정의한다.

3) 프렌드 함수의 매개변수는 반드시 클래스의 객체변수이다.

4) 프렌드 함수를 멤버 함수처럼 사용하여 클래스의 멤버 변수에 접근할 수 있다.

 

<형식> 프렌트 함수 사용

class 클래스명{

[private :]

데이터형 멤버변수명1;

데이터형 멤버변수명2;

public :

리턴데이터형 멤버함수명1(매개변수)

{

문장;

}

friend 리턴데이터형 함수명1(클래스명 객체변수);

// friend 프로토타입 선언

};

리턴데이터형 함수명1(클래스명 객체변수)

{

문장;

}

 

<예제1> 프렌드 함수 사용

#include<iostream>

using namespace std;

class student{

int a, b;

public :

void aaa(int x, int y)

{

a = x;

b = y;

}

friend int bbb(student aa);

};

int bbb(student aa)

{

int k;

k = aa.a*5 + aa.b*5;

return k;

}

void main(){

student st; //객체 생성

int result;

st.aaa(100, 200);

result = bbb(st);

cout <<"프렌트 함수 결과 : "<<result<<endl;

}

/* 여러 클래스의 프렌드 함수

특정 함수가 여러 클래스의 프렌드 함수로 사용된다 */

#include <iostream>

using namespace std;

class mbc;

class kbs

{

int salary, hours;

public :

void s_value(int a, int b)

{

salary = a;

hours = b;

}

friend int work_time(mbc mm, kbs kk);

};



class mbc{

int bonus, hours;

public :

void s_value(int m, int n)

{

bonus = m;

hours = n;

}

friend int work_time(mbc mm, kbs kk);

};

int work_time(mbc mm, kbs kk)

{

int result;

result = mm.hours - kk.hours;

return result;

}


void main()

{

mbc mc;

kbs ks;

int result;

mc.s_value(3000,30);

ks.s_value(500,20);

result = work_time(mc,ks);

if(result > 0)

cout <<"MBC가 일을 더 많이 합니다"<<endl;

else 

cout <<"KBS가 일을 더 많이 합니다"<<endl;

}

 

Posted by babuzzzy
c++2011. 11. 5. 17:21

객체 배열 및 포인터

 

배열 형태의 객체 (객체변수명 -> 객체배열명 사용)

 

클래스 자체로서는 아무 작업도 할 수 없으며 객체를 생성해야 클래스내의 멤버(변수와 함수)를 객체변수를 통하여 사용할 수 있다.

그것은 객체를 생성시 메모리에 멤버의 기억공간이 확보되고 객체변수를 통하여 접근 할 수 있기 때문이다.

 

다음은 객체변수를 배열형태로 정의 하여 보자(객체배열 생성).

 

<형식> 객체배열 생성

클래스명 객체배열명[크기];

 

() student aaa[10];

 

클래스의 멤버를 참조하는 형식은 다음과 같다. 직접멤버접근연산자 . 사용

 

<형식> 객체배열명을 통한 클래스 멤버(변수, 함수) 참조 표현 방법

객체배열명[인덱스].멤버변수명;

객체배열명[인덱스].멤버함수명;

 

 

 

<예제1>

#include<iostream>

using namespace std;

class sample

{

int num;

public :

sample(int number)

{

num = number;

}

int assign_value()

{

return num;

}

};

void main()

{

sample su[4][2] = {{100, 200},

{200, 300}, {400, 700}, {800, 900}};

for(int a=0; a<4; a++)

{

cout <<su[a][0].assign_value()<<" ";

cout <<su[a][1].assign_value()<<endl;

}

}

'c++' 카테고리의 다른 글

프렌드 함수  (0) 2011.11.05
첫번째와 두번째에서 name 배열에서 차이가 생기는 거 조심!!  (0) 2011.11.05
switch 문 쓰는법  (0) 2011.11.05
Posted by babuzzzy
c++2011. 11. 5. 17:14

#include<iostream>

using namespace std;

class sungjuk

{

private :

int hakbun, kor, eng, mat, tot;

char *name;

double ave;

public :

void aaa(int hh, char *nn, int kk, int ee, int mm);

void bbb();

void ccc();

};

void sungjuk::aaa(int hh, char *nn, int kk, int ee, int mm)

{

hakbun = hh;

name = nn;

kor = kk;

eng = ee;

mat = mm;

}

void sungjuk::bbb()

{

tot = kor + eng + mat;

ave = tot / 3.0;

}

void sungjuk::ccc()

{

cout <<"학번 : "<<hakbun<<endl;

cout <<"성명 : "<<name<<endl;

cout <<"국어 : "<<kor<<endl;

cout <<"영어 : "<<eng<<endl;

cout <<"수학 : "<<mat<<endl;

cout <<"총점 : "<<tot<<endl;

cout <<"평균 : "<<ave<<endl;

}

void main()

{

int hakbun, kor, eng, mat;

char name[20];

cout <<"학번 국어 영어 수학 점수를 입력하시오?"<<endl;

cin >>hakbun>>kor>>eng>>mat;

cout <<"성명을 입력하시오?"<<endl;

cin >>name;

sungjuk ss;

ss.aaa(hakbun, name, kor, eng, mat);

ss.bbb();

ss.ccc();

}

--------------------------------------------------------------------------
<예제7> <예제>을 다음과 같이 수정한다.

 

1) hakbun, name, kor, eng, mataaa()에서 입력 받는 것으로 수정한다.

#include<iostream>

using namespace std;

class sungjuk

{

private :

int hakbun, kor, eng, mat, tot;

char name[20];

double ave;

public :

void aaa();

void bbb();

void ccc();

};

void sungjuk::aaa()

{

cout <<"학번 국어 영어 수학 점수를 입력하시오?"<<endl;

cin >>hakbun>>kor>>eng>>mat;

cout <<"성명을 입력하시오?"<<endl;

cin >>name;

}

void sungjuk::bbb()

{

tot = kor + eng + mat;

ave = tot / 3.0;

}

void sungjuk::ccc()

{

cout <<"학번 : "<<hakbun<<endl;

cout <<"성명 : "<<name<<endl;

cout <<"국어 : "<<kor<<endl;

cout <<"영어 : "<<eng<<endl;

cout <<"수학 : "<<mat<<endl;

cout <<"총점 : "<<tot<<endl;

cout <<"평균 : "<<ave<<endl;

}

void main()

{

sungjuk ss;

ss.aaa();

ss.bbb();

ss.ccc();

}

 

 

'c++' 카테고리의 다른 글

프렌드 함수  (0) 2011.11.05
객체 배열 및 포인터 의 이해  (0) 2011.11.05
switch 문 쓰는법  (0) 2011.11.05
Posted by babuzzzy