#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <conio.h>
#include "struct_header.h"

#pragma comment(lib,"wsock32.lib")

void ErrorHandling(char *message);

void SocketOpen();

void main(void)
{
 int ch=NULL;

 while(1)
 {
  printf("\n[1]전송,[2],종료\n");
  ch=getch();

  switch(ch)
  {
   case'1':
    SocketOpen();
    break;
   case'2':
    return;
   default:
    puts("[1]전송,[2],종료");
    break;
  }
 }
 return;
}

void ErrorHandling(char *message)
{
 fputs(message,stderr);
 fputc('\n',stderr);
 exit(1);
}

void SocketOpen()
{
 
 WSADATA wsaData;
 SOCKET hSocket;
 int strLen;
 int i;
 
 SOCKADDR_IN servAddr;

 if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
  ErrorHandling("WSAStratup() error!");

 hSocket=socket(PF_INET,SOCK_STREAM,0);
 if(hSocket==INVALID_SOCKET)
  ErrorHandling("socket() error");
           
 memset(&servAddr,0,sizeof(servAddr));      
 servAddr.sin_family=AF_INET;
 servAddr.sin_addr.s_addr=inet_addr("192.168.0.34");
 servAddr.sin_port=htons(2000);

 if(connect(hSocket,(SOCKADDR *)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
  ErrorHandling("connect() error");

 MsgBuff msg;
 char sendData[MSG_SiZE + MSG_HEADER];
 int count=1;
 
 memset(&msg, 0x00, sizeof(msg));
 memset(&sendData, 0x00, sizeof(sendData));

 msg.data_sz = sizeof(msg);
 msg.msgID = count;

 memcpy(&msg.data[0], "1", 1);
 memcpy(&msg.data[1], "123", 3);

 while(1)
 {
  msg.msgID = count;

  memcpy(&sendData, &msg, sizeof(msg));
  Sleep(1);
  send(hSocket, sendData, MSG_SiZE+MSG_HEADER, 0);
  printf("%d\n", msg.msgID);
  count++;
 } 
 closesocket(hSocket);
 WSACleanup();

 return;
}                   

무한으로 전송 UDP로 제작하는게 더 낳을지 모른다...

전치 연산자를 다음과 같이 함수를 선언함으로써 중첩시킬 수 있습니다.

반환형 operator op (매개변수)

여기서 op는 중첩시킬 연산자 입니다. 따라서 ++ 연산자를 다음과 같은 모양으로
void operator++ ()

// 전치연산자(PreFix Operator)를 중첩(Overloading) 시키기.
#include <iostream>
using namespace std;

typedef unsigned short USHORT;
class Counter
{
public:
 Counter();
 ~Counter() {}
 USHORT GetItsVal() const { return itsVal; }
 void SetItsVal(USHORT x) { itsVal = x; }
 void Increment() { ++itsVal; }
 void operator++ () { ++itsVal; } // 재정의하고 싶은 연산자

private:
 USHORT itsVal;
};

// 디폴트 생성자 초기값 0
Counter::Counter():itsVal(0) {};
 
int main()
{
 Counter i;
 cout << "The value of i is " << i.GetItsVal() << endl;
 i.Increment();
 cout << "The value of i is " << i.GetItsVal() << endl;
 ++i;
 cout << "The value of i is " << i.GetItsVal() << endl;

 return 0;

}

함따라 봤는데 진짜 신기한군요.

포인터 : 포인터란 메모리 주소를 가리킬 수 있는 변수

포인터를 이해하기 위해서는 여러분은 컴퓨터의 메모리에 대해 조금 알아야 합니다. 컴퓨터의 메모리는 그 위치를 가리키는 연속적인 번호가 붙여진

부분으로 나누어질 수 있습니다. 각 변수는 메모리의 각 유일한(주소라고 함)을 가리키고 있습니다.

 

#include <iostream>

using namespace std;

 

int main()

{

    unsigned short shortVar = 5;

    unsigned long longVar = 65535;

    long sVar = -65535;

 

    cout << "shortVar:" << shortVar << "\t";

    cout << "Address of shortVar:";

    cout << &shortVar << "\n";

 

    cout << "longVar:" << longVar << "\t";

    cout << "Address of shortVar:";

    cout << &longVar << "\n";

 

cout << "sVar:";

    cout << sVar << "\t Address of sVar:";

    cout << &sVar << "\n";

 

    return 0;

 

}

 

 

여러분이 각 변수의 실제의 주소를 숫자로 알아야 할 이유는 없습니다. 중요한 것은 각 변수는 자신의 주소를 갖고 또 그 변수의 형만큼의 길이를

갖는다는 것입니다. 여러분은 변수형을 선언함으로써 컴파일러에게 그 변수형에 해당하는 길이 만큼의 메모리를 잡아 놓을 것을 말해줍니다.

컴파일러는 자동적으로 그 변수의 주소를 할당합니다. 예를 들어, long 정수형은 4바이트이고 이는 메모리에서 4바이트를 차지한다는 의미입니다.

 

포인터에 주소를 저장

모든 변수는 주소를 갖고 있습니다. 주어진 변수를 몰라도 여러분은 주소를 포인터에 저장할 수가 있습니다. 예를 들어, howOld가 정수형이라고 합

시다. howOld의 주소를 저장할 포인터를 pAge라 하면 여러분은 다음과 같이 쓸 수 있습니다.

Int *pAge = 0;

이 선언은 pAge가 정수형의 변수 주소를 가리키는(정수형의 포인터라고 한다.) 변수라는 뜻입니다. 다시 말해 pAge는 정수형의 주소를 가지도록

선언되었습니다.

pAge는 변수 입니다. 여러분은 정수형 변수를 선언하면 그 변수에 저장되는 내용은 정수로 해석됩니다. 여러분이 pAge를 포인터로 선언했으면

pAge에 저장되는 내용은 주소로 해석됩니다. pAge는 변수는 변수이되 그 내용이 약간 다를 뿐입니다.

여기의 예에서 pAge는 0으로 초기화되어 있습니다. 그 값이 0인 포인터를 널 포인터라고 합니다. 모든 포인터는 그들이 생겨날 때 어떤 값으로 초기

화가 됩니다. 포인터에 어떤 값을 초기화시켜야 할지 모르겠거든 0으로 초기화합시다. 초기화 되지 않은 포인터를 와일드(wild) 포인터라고 합니다.

♨ 주의 포인터는 항상 초기화 합시다.

여러분이 포인터를 0으로 초기화했다면 언젠가는 howOld의 주소를 pAge에 저장해야 합니다. 다음과 같이 저장합니다.

Unsigned short int howOld = 50; // 변수를 만듦

Unsigned short int *pAge = 0; // 포인터 만듦

pAge = &howOld; // howOld의 주소를 pAge에 저장

줄여서 unsigned short int *pAge = &howOld; // 포인터르 만듦

이제 pAge는 howOld의 주소를 저장하는 포인터입니다. pAge를 사용하여 여러분은 실제적으로 howOld의 값을 알 수 있습니다.

포인터 pAge를 사용하여 howOld에 접근하는 것을 간접 지정(indirection)이라 합니다. 왜냐하면 pAge를 경유하여 howOld로 접근하기 때문입니다.

간접지정 : 포인터에 지정된 주소값을 통해 원래의 변수에 접근하는 방식을 의미합니다. 포인터는 그 안에 지정된 주소값을 통해 그 주소에 저장된

값을 알 수 있는 간접적인 방식을 제공합니다.

 

포인터 이름

포인터는 일반 C++에서 가지는 변수명을 가질 수 있습니다. 이 책에서는 일단 포인터는 p로 시작하는 작명방식을 쓰고자 합니다.

 

간접 지정 연산자

간접 지정(indirection) 연산자(*)는 조회 연산자(dereference)라고도 부릅니다. 포인터가 조회되었을 때 그 포인터에 저장된 주소에 있는 값이 검색됩

니다. 일반적인 변수들은 그 값에 직접 접근 방식을 제공합니다. 가령 여러분이 yourAge라 불리는 unsigned short 정수형을 선언했다면, 여러분은

howOld의 값을 그 새로운 변수에 저장할 수 있습니다.

Unsigned short int yourAge;

yourAge = howOld;

포인터에는 원하는 값의 주소가 저장되어 있으므로 간접 지정 방식을 통해 접근합니다. 포인터 pAge를 통해 yourAge에 howOld 값을 저장하려면 다

음과 같이 합니다.

Unsigned short int yourAge;

yourAge = *pAge;

pAge 앞에 붙어있는 간접 지정 연산자(*)는 '이 주소에 저장된 값'을 의미합니다. 따라서 둘째 줄은 다음과 같이 해석됩니다. 'pAge에 저장된 값(이는

주소를 가리킴)을 가져와, 이 주소가 가리키는 곳으로 찾아가 저장된 값을 찾아 yourAge에 저장합니다.'

*pAge = 5; // 값 5를 pAge 안에 지정된 주소 위치에 저장하라.

 

포인터, 주소, 변수

포인터라는 변수

그 포인터 변수에 저장된 주소값

그 포인터 변수에 저장된 주소값이 가리키는 메모리를 찾아가면 저장되어 있는 실제값

Int theVariable = 5;

Int *pPointer = &theVariable;

theVariable은 5로 초기화된 정수형 값입니다.

pPointer는 정수형 값이 저장되는 주소를 저장하는 포인터입니다.

 

포인터를 사용한 자료 연산

포인터가 변수의 주소값을 할당받았다면, 그 변수의 자료에 접근하기 위해 여러분은 포인터를 쓸 수가 있습니다.

 

 

#include <iostream>

using namespace std;

typedef unsigned short int USHORT;

 

int main()

{

    USHORT myAge; // 변수

    USHORT *pAge = 0; // 포인터

myAge = 5;

        

    cout << "myAge:" << myAge << "\n";

 

    pAge = &myAge;

 

    cout << "*pAge:" << *pAge << "\n\n";

    cout << "*pAge = 7 \n";

 

    *pAge = 7; // sets myAge to 7

 

    cout << "*pAge:" << *pAge << "\n";

    cout << "myAge:" << myAge << "\n\n";

 

    cout << "myAge = 9\n";

 

    myAge = 9;

 

    cout << "myAge:" << myAge << "\n";

    cout << "*pAge:" << *pAge << "\n\n";

    

    return 0;

 

}

 

 

 

 

주소 관찰

포인터는 여러분이 주소를 실제 그 주소를 정확히 알지 못하더라도 연산할 수 있게 해줍니다. 오늘 이후로 포인터에 변수의 주소를 대입하면 그 주소

가 대입이 되고 그 포인터는 그 변수의 주소를 가지고 있다는 것을 자신 있게 알게 될 것입니다.

 

포인터가 가리키는 주소에 저장된 값에 접근하려면 간접 지정 연산자(*)를 씁시다.

모든 포인터를 유효한 주소값이나 널(0)로 초기화합시다.

포인터에 저장된 주소값과 그 주소의 메모리에 저장된 값을 구별할 줄 압시다.

 

포인터를 선언하려면 저장되는 주소가 가리키는 값의 변수형 또는 객체형을 쓰고, 포인터 연산자를 쓰며(*) 그 포인터의 이름을 씁시다.

Unsigned short int *pPointer = 0;

포인터에 값을 저장하거나 초기화할 때 저장하고자하는 주소의 변수명 앞에 주소 연산자(&)를 붙여 대입합니다.

Unsigned short int *pPointer = &theVariable;

포인터를 소환하려면 소환연산자(*)를 포인터 앞에 붙입니다.

Unsigned short int theVariable = *pPointer;

 

도대체 왜 포인터를 쓰는가?

 

여태껏 여러분은 변수의 주소를 가리키는 포인터에 대해 자세히 배웠습니다. 그런데 여러분은 이렇게 복잡한 방식이 맘에 안들 것입니다. 왜 값에

직접 접근할 수 있는 변수가 있는데 포인터를 쓰는 것일까요?

 

포인터 용도

- 자유 기억 장소의 자료를 다룰 때

- 클래스 멤버 자료와 클래스 멤버 함수에 접근할 때

- 함수에 주소 전달을 할 때

 

스택과 자유 기억 공간(Free Stor)

- 전역 공간

- 자유 기억 공간

- 레지스터

- 코드 영역

- 스택

 

지역 변수는 함수의 매개 변수와 함께 스택에 저장됩니다. 코드는 코드 영역에 저장되고 전역 변수는 전역 공간에 저장됩니다. 레지스터는 여러 잡다

한 일들을 합니다.(예를 들어, 스택의 꼭대기와 명령 포인터를 계속 추적하는) 그리고 나머지의 메모리는 자유 기억 공간(free store)로 분류되는데 힙

(heap)이라고 불립니다.

 

지역 변수의 문제점은 영원히 지속되지 않는다는 것입니다. 함수가 반환되면 지역 변수들은 버려집니다. 또한 전역 변수들은 그 문제를 해결했지만

프로그램의 모든 부분에서 제한 없이 접근할 수 있다는 대가를 치러야 합니다.

 

전화기에는 메모리 기능이 있습니다. 김군 집의 전화번호는 1번 단추에, 이군 집의 전화번호는 2번 단추에 기억을 시켜 넣는 것입니다. 이렇게 하면

여러분은 친구 집에 전화를 걸려고 일일이 그 번호를 다 입력을 하지 않아도 됩니다. 그 전화번호는 어디 구석에 넣어둡니다. 여러분이 번호 하나만

누르면 전화가 알아서 찾아가 줍니다. 그 자세한 전화번호는 무엇인지 모릅니다. 하지만 그 집에 통화는 할 수 있습니다.

여러분은 컴퓨터의 메모리에 주소를 통해 접근할 수 있습니다. 이는 실제 전화 번호 입니다. 하지만 여러분은 실제 메모리의 주소를 몰라도 됩니다.

단지 포인터에 잡아넣으면 됩니다. 특정 번호만 누르면 됩니다. 포인터는 여러분이 여러분의 자료에 자세한 주소를 몰라도 접근할 수 있게 해줍니다.

 

포인터는 간접 접근 방식으로 자료에 접근할 때 강력한 도구를 제공합니다. 모든 변수는 주소를 가지고 있는데 이는 주소 연산자 &를 통해 얻을 수

있습니다. 이 주소가 포인터에 저장됩니다.

포인터는 그 포인터가 가리키는 객체의 형을 쓰고 간접 연산자(*)를 붙인 뒤 포인터의 이름을 써서 완성시킵니다.

포인터는 객체, 또는 널을 가리키게 하여 초기화시킵니다.

간접 연산자(*)를 사용하여 포인터에 저장된 주소값을 접근합니다.

     상수형 포인터를 선언하여 그 포인터에 다른 객체의 주소를 대입할 수 없게 하고 또 상수형 객체의 포인터를 선언하여 포인터가 가리키는 값을 바꿀

수 없게 할 수 있습니다. 힙에 new 객체를 만들어 포인터에 그 값을 대입할 수 있습니다. Delete 예약어를 호출하여 메모리를 풀어놓을 수 있습니다.

Delte는 메모리를 풀어놓지만 그 포인터를 파괴하지는 않습니다. 따라서 다른 주소값을 그 포인터에 저장할 수 있습니다.

 

간만에 포인터에 대해서 함 공부하면서 정리한 내용들은데 역시 포인터는 잘쓰면 해가 되고 잘못사용 독이 된다는 사실을 알았습니다…

제가 알고리즘 숙제 하다가 찾은 사이트인데요..

님 질문 보니까 이곳에서 본게 생각나서 ^^

갖다 붙이고 보니까 너무 기네요...

보기 복잡하시면 이곳에 가서 보세요~~ 시험 잘 보세요~~~

http://user.chollian.net/~lm7050/

1. 치명적인 에러

Bad call of in-line function
인라인 함수의 호출형식이 이상하다.

Irreducible expression tree
컴파일러 내부에러에의해 코드생성 불가

Register allocation failure
컴파일러 내부에러가 복잡해서 코드 생성 불가


2. 그 밖의 에러

#operator not followed by macro
argument name
매크로 정의 속에서 #의 뒤에 매크로 인수가 없다

'XXXXXXXX' not an argument
인수가 정확하지 않다

Ambiguous symbol 'XXXXXXXX'
구조체의 멤버명이 애매하다

Argument # missing name
함수 플롯타입안에 인수명이 없다

Argument list syntax error
함수의 인수 리스트 구분이 정확하지 않다

Array bounds missing ]
배열지정에 ']'가 없다

Array size too large
배열의 크기가 너무 크다

Assembler statement too long
인라인 어셈블러문이 너무 길다

Bad configuration file
TURBOC.CFG 화일의 구분이 정확하지 못하다

Bad file name format in include
directive
#include 화일명 지정이 정확하지 못하다

Bad ifdef directive syntax
#ifdef 문의 구문이 정확하지 않다

Bad ifndef directive syntax
#ifndef 문의 구문이 정확하지 않다

Bad undef directive systax
#undef 문의 구문이 정확하지 않다

Bit field size syntax
비트 필드의 비트수가 너무 길다

Call of non-function
함수 이외의 것을 호출하려 하고 있다

Cannot modify a const object
const 문으로 선언된것을 변경하려 한다

Case outside of switch
switch 문 밖에 case 문이 있다

Case statement missing ;
case 문에 ;(세미 콜론)이 없다

Cast syntax error
캐스트의 구문이 정확하지 않다

character constant too long
문자 상수가 너무 길다

Compound statement missing }
복합문에 } 가 없다

Conflict type modifiers
수식자가 2 개 이상 지정되어 있다

Constant expression required
배열의 크기가 상수로 정의되지 않았다

Could not find file XXXXXXXX.XXX'
지정된 화일이 발견 되지 않는다

Declaration missing ;
구조체에서 ; 이 발견되지 않는다

Declaration needs type or
storage class
형(type)과 기억클래스가 없는 선언이 있다

Declaration syntax error
선언의 구문이 정확하지 않다

Default outside of switch
switch 문 밖에 default 가 있다

Define directive needs an
identifier
#define 하는 이름이 정확하지 않다

Division by zero
0에 의한 나눗셈이 있다

Do statement must have while
do 문에 while 이 없다

Do-while statement missing (
do 문의 while 뒤에 ( 이 없다

Do-while statement missing )
do 문의 while 뒤에 ) 이 없다

Do-while statement missing ;
do 문의 while(식)뒤에 ; 이 없다

Duplicate case
같은 case 문이 있다

Enum syntax error
enum 선언의 구문이 명확하지 않다

Enumeration constant syntax error
enum의 값이 식의 상수가 아니다

Error Directive : XXX
이 메시지는 #error 문에 의해 출력된 것이다

Error writing output file
작업용 디스크의 용량이 부족하다

Expression syntax
식의 구문이 명확하지 않다

Extra parameter in call
포인터에 의한 함수 호출에서 인수의 수가 너무 많다

Extra parameter in call to
XXXXXXXX
지정된 함수의 인수가 너무 많다

File name too long
#include 하는 화일의 이름이 너무 길다

For statement missing (
for 문에 ( 이 없다

For statement missing )
함수 호출의 ) 가 없다

Function doesn't take a varaible
number of arguments
가변개(?) 인수가 아닌 함수에서 va_start가 매크로로 사용되고 있다

Goto statement missing label
goto 문에 레이블 지정이 없다

If statement missing (
if 문에 ( 가 없다

If statement missing )
if 문에 ) 가 없다

Illegal character 'C' (0xXX)
화일 속에 유효하지 않은 문자가 있다

Illegal initialization
초기화에는 사용될수 없는 것이 사용되고 있다

Illegal octal digit
8진 상수속에 8또는 9가 있다

Misplace continue :
루푸 밖에 break 문이 있다

Misplace decimal point
부동 소숫점의 지수부에 소수점이 있다

Misplace else
if 문과 대응하지 않는 else 문이 있다

Misplace elif directive
#if,#ifdef 또는 #ifndef와 대응하지않는 #elif가 있다

Misplace else directive
#if,#ifdef 또는 #ifndef와 대응하지않는 #else가 있다

Misplace endif directive
#if,#ifdef 또는 #ifndef와 대응하지않는 #endif가 있다

Must be addressable
어드레스가 정해져 있지 않은 대상에 &를 사용하고 있다

Must take address of memory
location
어드레스를 취할수 없는 대상에 대해 & 를 사용하고 있다

No file name ending
#include 에서 "" 혹은 > 가 없다

No file name given
대상이 되는 화일명이 하나도 지정되어 있지 않다

Non-portable pointer assignment
캐스트없이 포인터의 대입(또는 그 반대)이 행해 지고 있다

Non-portable pointer comparison
캐스트없이 포인터와 그 이외의 비교가 행해 지고 있다

non-portable return type
conversion
return 식과 함수 선언의 행이 틀린다

Not an allowed type
허가 되지 않은 형의 선언이 있다

Out of memory
메모리가 부족하다

Pointer required on left side of ->
->의 왼쪽에 포인터가 없다

Redeclaration of 'XXXXXXXX'
같은 이름이 또 사용되고 있다

Size of structure or array not known
정의하지 않은 구조체나 크기의 지정이 없는 배열에
sizeof 가 사용 되었다

Statement missing ;
; 이 없다

Structure or union syntax error
struct 나 union의 구문이 정확하지 않다

Structure size too long
구조체의 크기가 너무 크다

Subscripting missing ]
]가 없는 첨자식이 사용되었다

Switch statement missing (
switch 문에 ( 가 없다

Switch statement missing )
switch 문에 ) 가 없다

Too many parameter in call
포인터에 의한 함수 호출에서 인수의 수가 너무 많다

Too few parameter in call to
'XXXXXXXX'
지정된 함수의 인수가 너무 크다

Too many cases
1개의 switch 문에는 256 개 이상의 case 문을 사용 할 수 없다

Too many decimal points
부동 소숫점수 속에 여러개의 소숫점이 있다

Too many default cases
default 가 2 개 이상있다

Too many exponents
부동 소숫점속에 여러개의 지수부가 있다

Too many initializers
선언된 것보다 많은 초기화 식이 있다

Too many storage classes in declaration
선언속에 여러개의 기억 클래스 지정이 있다

Too many types in declaration
선언속에 여러개의 형 지정이 있다

Too much auto memory in function
auto 변수의 크기가 너무 크다

Too much code defined in file
하나의 화일 속에 코드의 크기가 64KB 를 넘었다

Too much global data defined in file
글로발로 선언된 데이타가 64KB 를 넘었다

Two consecutive dots
2개의 점(..)이 연속으로 있다

Type mismatch in parameter #
n본째의 인수의 형 변환을 할 수 없다(포인터에 의한 호출)

Type mismatch in parameter # in call
to 'XXXXXXXX'
인수의 형 변환을할 수 없다(함수 호출)

Type mismatch in parameter
'XXXXXXXX'
인수의 형 변환을할 수 없다(포인터에 의한 호출)

Type mismatch in parameter
'XXXXXXXX' in call to 'XXXXXXXX'
인수의 형 변환을할 수 없다(함수 호출)

Type mismatch in redeclaration of
'XXX'
처음과 다른 형으로 선언이 되있다

Unable to create output file
'XXXXXXXX.XXX'
출력 화일을 작성할 수 없다

Unable to create turboc.lnk
작업용 화일 turboc.$nk를 작성할 수 없다

Unable to execute command 'XXXXXXXX'
TLINK 나 TASM 을 실행할 수 없다

Unable to open input file
'XXXXXXXX.XXX'
소스의 화일이 발견 되지 않는다

Undefined label 'XXXXXXXX'
레이블이 정의 되지 않았다

Undefined structure 'XXXXXXXX'
구조체가 정의 되지 않았다

Undefined symbol 'XXXXXXXX'
심볼이 정의 되지 않았다

Unexpected end of file in common
started on line #
명령의 끝에 */ 이 없다

Unexpected end of file in
conditional started on line #
#endif가 없다

Unexpected preprocessor directive
'XXX' : # 지정의 구문이 틀리다

Unterminated character constant
문자 상수의 끝에 ' 이 없다

Unterminated string
문자열 상수에 " 이 없다

Unterminated string or character
constant
문자열의 끝에 " 이 없다

User break
사용자에 의해 브레이크 되었다

While statement missing (
while 문에 ( 이 없다

While statement missing )
while 문에 ) 이 없다

Wrong number of argument in call to
'XXXXXXXX'
매크로 인수 호출 수가 정확하지 않다
내용출처 : http://user.chollian.net/~lm7050/

+ Recent posts