카테고리 없음2010. 2. 5. 15:20

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

우선 메모리에 관한 설명입니다.
C 프로그램을 실행시키면, 다음과 같이 4개의 영역으로 메모리가 나뉩니다.

+--------+ infinity
|  stack    |
|     |       |
|     |       |
|     V       |
:               :
:               :
:               :
|     ^       |
|     |       |
|     |       |
|  heap    |
+--------+
|  global  |
|  data     |
+--------+
|program|
| code    |
+--------+ 0

(운영체제에 따라 모양이 조금 다른 경우도 있습니다. 예를 들면, Unix는 아마 stack이 program code 밑으로 내려가는 것으로 기억하고 있습니다.)

program code : 말 그대로 프로그램의 내용이 저장되는 곳입니다.
global data : global 변수들이 우선 이 곳에 저장이 됩니다. static으로 지정된 변수들도 이 곳에 함께 저장이 됩니다. 프로그램이 시작될때 모두 한꺼번에 미리 저장을 해 두죠.
heap: 이 곳이 프로그래머가 직접 사용이 가능한 메모리이며, malloc으로 메모리를 할당해줄 경우, 이 곳의 메모리를 씁니다.
stack: 컴파일러가 임시로 사용하는 곳입니다. 함수라던가를 부를 경우, 그 안에서 만들어지는 모든 local 변수들(malloc을 사용하지 않고 직접 정의된 경우)이 이 곳에 저장이 됩니다.

---------

char *c= (char*)malloc(sizeof(char)*10);

을 실행시키면, 10 바이트의 메모리를 heap에서 떼어다가 할당해준후, c가 그 장소를 가리키게 합니다.
여기서,

c = "hello!"

이렇게 하게 되면, 우선 프로그램은 "hello!"라는 문자열을 만듭니다. 이것은 어디까지나 함수내에서 만들어진 데이터 임으로 local 변수로 취급되어 stack에 저장이 됩니다. 그러고 나서 포인터 c가 hello!라는 이 변수를 가리키게 만듭니다. 앞에 malloc으로 만들어준 그 장소를 더이상 가리키지 않게 되죠.
여기서 이 c를 free를 시키려고 해도, c는 malloc으로 지정해준 메모리를 가리키고 있지 않고, stack에 있는 데이터는 프로그래머가 마음대로 제어할 수 없으므로 access 어쩌고 의 에러가 뜨는 겁니다.

그와 반대로

gets(c);

또는

c[0]='h'
c[1]='e'

는 malloc이 지정해준 장소에 문자열을 직접 입력해 넣는 방법이므로 문제가 없는 것입니다.


해결책

malloc 해준후

strcpy(c, "이게 복사될것");

free(c);

하면 된다. c의 주소값이 변하지 않고 복사 되기때문에...
The last portion of code in my previous post actually doesn't give the desired behaviour I don't think. If anyone stumbles across this solution in the future the code for repeating a single file is simpler since we don't need to use the wmppsPlaying event, we can just use wmppsStopped (which is not always the case when playing from a playlist.) The amended code for repeating a single file is attached.

Also as an additional note if you want the media player to loop through an entire playlist (not just repeat one song, which the code above achieves) then you can use;

player.settings.setMode("loop", true);
// If you are playing a single file
private void player_StatusChange(object sender, EventArgs e) {
    if (player.playState == WMPLib.WMPPlayState.wmppsStopped) {
        // simply use the play command to start the track again
        player.Ctlcontrols.play();
    }
}
참조 : http://www.experts-exchange.com/Programming/Languages/.NET/Visual_CSharp/Q_23967223.html

'예전것 > .NET Compact Framework' 카테고리의 다른 글

C#에서의 using  (0) 2009.11.06
C# 전역변수 사용법 (폼 간에)  (0) 2009.11.04
About Thread (C#) - .net compact framework  (0) 2009.11.02
카테고리 없음2010. 1. 27. 00:01
카테고리 없음2010. 1. 22. 22:18

using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace ServerTest
{
    public partial class Form1 : Form
    {
        private TcpListener Server;
        private TcpClient SerClient;
        private NetworkStream myStream;
        private StreamWriter myWrite;
        private Boolean Start = false;
        private Thread myServer;

        private int[] intArr;


        public Form1()
        {
            InitializeComponent();


        }

        private void Form1_Load(object sender, EventArgs e)
        {
            intArr = new int[40];

            for (int i = 0; i < intArr.Length; i++)
            {
                intArr[i] = i;
            }

            Start = true;
            IPAddress addr = new IPAddress(0);
            Server = new TcpListener(addr, 2007);
            Server.Start();          

            myServer = new Thread(ServerStart);
            myServer.Start();
           

            //this.Timer.Enabled = true;
        }

        private void ServerStart()
        {

           

            if (txtMessage.InvokeRequired)
            {
                txtMessage.Invoke(new MessageViewHandler(MessageView), "server start");
            }
            while (Start)
            {
                try
                {
                    SerClient = Server.AcceptTcpClient();

                    if (txtMessage.InvokeRequired)
                    {
                        txtMessage.Invoke(new MessageViewHandler(MessageView), "Client is connected");
                    }
                    else
                        MessageView("Client is connected");

                    myStream = SerClient.GetStream();
                    myWrite = new StreamWriter(myStream);
                }
                catch { }
            }
            
        }

 

        private void MessageView(string strText)
        {           
           
            this.txtMessage.AppendText(strText + "\r\n");
            this.txtMessage.Focus();
            this.txtMessage.ScrollToCaret();
         
        }

        private delegate void MessageViewHandler(string strText);
      
        /*
        private void Timer_Tick(object sender, EventArgs e)
        {
            Msg_send();
        }

        private void Msg_send()
        {
            try
            {
                string dt = Convert.ToString(DateTime.Now);
                myWrite.WriteLine(dt);
                myWrite.Flush();
            }
            catch { }
        }
         */

        private void btnSend_Click(object sender, EventArgs e)
        {
            byte[] size = new byte[64];
            byte[] data = new byte[intArr.Length * 4];

            size = BitConverter.GetBytes(intArr.Length);
            myStream.Write(size, 0, size.Length);

            for (int k = 0; k < intArr.Length; k++)
            {
                intToByte(intArr[k], data, k * 4);
            }

            /*
            if (myStream != null && myWrite != null)
            {               
                myWrite.WriteLine("서버에서 메시지를 보냅니다.");
                myWrite.Flush();
            }*/
            myStream.Write(data, 0, data.Length);

        }

        public void intToByte(int value, byte[] data, int idx)
        {

        // int는 4byte이므로 4개의 byte에 기록 (int = 4byte = 32bit)

        // 32bit를 24칸 쉬프팅을 하면 24비트는 짤리고 마지막 8bit(상위 1byte)에 값이 들어간다.

        // 이것을 byte 캐스팅을 해버리면 8bit가 짤려서 저장된다.

        // 나머지 24bit도 값을 밀어서 바이트(8비트)로 자른 뒤 집어넣는다.

        // 즉 배열에 인덱스를 하나씩 증가시키면서 int값을 8bit씩 잘라서 집어넣는다.

        // 마지막 배열에는 8비트만이 남으므로 쉬프트 연산으로 밀어버릴 필요가 없다.

        data[idx] = (byte)(value >> 24);

        data[++idx] = (byte)(value >> 16);

        data[++idx] = (byte)(value >> 8);

        data[++idx] = (byte)value;
        }


        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!(myWrite == null))
            {
                try
                {
                    myWrite.WriteLine("서버를 종료합니다");
                    myWrite.Flush();
                }
                catch
                { }
            }

            this.Start = false;
            //this.Timer.Enabled = false;

            if (!(myWrite == null))
            {
                myWrite.Close();
            }

            if (!(myStream == null))
            {
                myStream.Close();

            }

            if (!(SerClient == null))
            {
                SerClient.Close();

            }

            if (!(Server == null))
            {
                Server.Stop();
            }

            if (!(myServer == null))
            {
                myServer.Abort();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int i;
            string strHostName;

            // Getting Ip address of local machine...
            // First get the host name of local machine.
            strHostName = Dns.GetHostName();


            // Then using host name, get the IP address list..
            IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
            IPAddress[] addr = ipEntry.AddressList;

           
            for (i = 0; i < addr.Length; i++)
            {
                txtMessage.Text += addr[i].ToString() + "\r\n";
                
                /*
                if (addr[i].AddressFamily.ToString() != "InterNetworkV6")
                {
                    break;
                }*/
            }

            //MessageBox.Show(addr[i].ToString());
        }


    }
}

카테고리 없음2010. 1. 22. 22:18

using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Diagnostics;

namespace ClientTest
{
    public partial class Form1 : Form
    {
        private TcpClient client; // TCP 네트워크 서비스에 대한 클라이언트 연결 제공
        private NetworkStream myStream; // 네트워크 스트림
        private StreamReader myRead; // 스트림 읽기
        private Thread myReader; //스레드
        private int[] data;
        int i = 0;
        int[] intArr2;

 

        public Form1()
        {
            InitializeComponent();

            data = new int[20];
        }
  

        private void Form1_Load(object sender, EventArgs e)
        {                           
                client = new TcpClient();
                client.Connect("localhost", 2007);

                MessageView("Connected to Server");
                myStream = client.GetStream();


                myRead = new StreamReader(myStream);
                myReader = new Thread(Receive);
                myReader.Start();

        }

        private void Receive()
        {
            byte[] size = new byte[64];
            byte[] data2;

            while (true)
            {
                if (myStream.CanRead)
                {
                    myStream.Read(size, 0, size.Length);
                    intArr2 = new int[BitConverter.ToInt32(size, 0)];
                    data2 = new byte[intArr2.Length * 4];

                    myStream.Read(data2, 0, data2.Length);

                    for (int z = 0; z < intArr2.Length; z++)
                    {
                        intArr2[z] = byteToInt(data2, z * 4);

                        Debug.WriteLine(intArr2[z]);
                    }
                    /*
                    string msg = myRead.ReadLine();
                    if (msg.Length > 0)
                    {
                        MessageView(msg);
                    }*/
                }
            }
                       
        }
        public int byteToInt(byte[] data, int idx)

        {
            return

            (

            /*

            16진수 0xFF는 255를 나타낸다.

            0xFF를 & (AND 연산)하는 이유는

            원래 음수가 아니었는데 byte로 자르다보면 부호비트에 1이 들어와서 음수가 되는 경우가 있다.

            그 음수값을 다시 복구하기 위해서 0xFF를 2진수(마지막 8비트만 1이고 나머지는 0)로 AND 연산하면 부호비트는 0이 되어 본래 부호 그대로 들어오고 8비트는 그대로 복원될 수 있다.

            이것을 다시 쉬프팅하고 OR연산을 하면 이전의 int 값이 나오게 된다.

            | (OR연산) 대신 + 를 해도 되지만 비트연산이 더 빠르기 때문에 OR연산을 사용한다.

            */

            ((data[idx] & 0xFF) << 24) |

            ((data[++idx] & 0xFF) << 16) |

            ((data[++idx] & 0xFF) << 8) |

            (data[++idx] & 0xFF)

            );

        }


        private void showData()
        {
            for(int j=0; j <= i; j++)
            {
                this.txtMessage.AppendText(data[j] + "\r\n");
            }
            this.txtMessage.Focus();
            this.txtMessage.ScrollToCaret();
        }

        private void MessageView(string strText)
        {
            this.txtMessage.AppendText(strText + "\r\n");
           
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (!(myRead == null))
                {
                    myRead.Close();
                }
                if (!(myStream == null))
                {
                    myStream.Close();
                }
                if (!(client == null))
                {
                    client.Close();
                }
                if (!(myReader == null))
                {
                    myReader.Abort();
                }
            }
            catch
            {
                return;
            }
        }

 


    }
}

예전것/프로그래밍2010. 1. 13. 21:33
http://withrobot.tistory.com/180
위 사이트에 나와있다.

<textarea name="code" class="Python" cols="60" rows="10">
코드는 여기에 복사한다.
</textarea>
예전것/웃긴거2009. 12. 17. 03:14

'예전것 > 웃긴거' 카테고리의 다른 글

흑형 ㅋㅋㅋㅋㅋ  (0) 2010.06.28
페널티킥 심리전  (0) 2009.07.09
예전것/프로그래밍2009. 12. 8. 23:01
예전것/SmartPhone2009. 11. 14. 16:31


c# 에서의 using은 2가지 사용법이 있다.

첫번째는 다들 아시겠지만 네임스페이스사용..
using System;
using System.Collections.Generic;

이런것들에 using이 사용되어 지는 것이고

두번째 사용은 자동  Dispose() 사용시 using문이 사용되어진다.
예를 들어보자
using(testGame = new TestPongGame (testLoop))
{
          testGame.Run();
}
위와 같은 문구가 있을때 { }안에 있는 모든 내용이 완료되어지면 동적으로 생성한 testGame개체에 대한 Dispose()문이 자동으로 불러지게 하는 역활을 using이 하는것이다.