[카테고리:] 컴퓨터

  • int와 char

    C언어에서 가장 많이 사용하는 변수는 역시 int일 것이다. 당장 for문 쓰려고 해도 int형 변수를 선언해야 하니까.

    기본적으로, int는 정수형 변수고 char는 문자형 변수를 나타내는 예약어이다.

    다음과 같이 선언해서 쓴다.

    int a;

    char b;

    이렇게 하면 a는 정수 1개를 저장하는 변수가 되고 b는 문자 1개를 저장하는 변수가 된다.

    a=65;

    b=’A’;

    이렇게 사용할 수 있다.

    그런데 이런것도 된다.

    a=’A’;

    b=65;

    이게 되는 이유는 C언어에서 문자를 숫자로 변환해서 사용하기 때문이다. 이때 변환하는 규칙은 ASCII코드표에 다 써져 있다. (ASCII코드가 아닌 다른 코드를 쓸 수도 있지만, 대세는 ASCII이다.)

    다음과 같이 하면, a는 66이 되고 b는 “B”가 된다.

    a++;

    b++;

    물론 다음과 같은 것도 된다.

    printf(“%d\n”, a);

    printf(“%c\n”, (char)a);

    printf(“%c\n”, b);

    printf(“%d\n”, (int)b);

    이렇게 하면 그 결과는

    65

    A

    A

    65

    가 될 것이다.

    int와 char는 공통적으로 (실제로는) 둘 다 정수 1개를 저장한다. 하지만 int로 선언한 경우와 char로 선언한 경우에는 그 해석이 달라지는데, char로 선언하면 그것을 문자 1개로 해석한다. int로 선언한 경우에는 그것을 정수로 해석한다. 그리고 char에 저장될 수 있는 내용은, 그것을 정수로 생각한다면 8비트 정수 1개만 가능하다. 하지만 int는 그 선언을 어떻게 하느냐에 따라 다 달라진다

    int a; //기계 또는 컴파일러에서 제공하는 기본적인 정수형의 길이(대체로 16비트나 32비트)

    short int a; //16비트(2바이트) 길이

    long int a; //32비트(4바이트) 길이

    long long int a; //64비트(8바이트) 길이. 이건 요새 64비트 컴퓨터가 늘어나면서 쓰게 되었다. 운영체제에 따라서 long long 대신 int64를 쓰는 것도 있다.

    이렇듯 더 큰 숫자를 쓰기 위해서 길이를 여러가지로 지정할 수 있다.

    char은 또 한가지 중요한 특징이 있는데, 웬만해서는 포인터형 변수 또는 배열 변수로 사용한다는 점이다. 만약 “snowall”이라는 문자열을 처리하기 위해서 7개의 변수가 필요하다고 할 때,

    char a=’s’;

    char b=’n’;

    char c=’o’;

    char d=’w’;

    char e=’a’;

    char f=’l’;

    char g=’l’;

    이런식으로 쓰는 프로그래머가 있을지도 모르겠지만, 아마 돈받고 일하는 프로그래머중에는 없을 것이다.

    이렇게 쓰면 아주 많은 문제가 발생한다. 직접 문자열을 다루고 체험하면서 느낄 수도 있지만 그런 수고를 덜기 위해서 간단히 설명해 보자면, 저렇게 쓰면 귀찮다. (귀찮지 않다면… 뭐 굳이 저렇게 써도 상관 없지만, 혼자서 개발하는 프로그램에만 저렇게 쓰기를 바란다.) 그래서 다음과 같이 쓸 수 있다.

    char a[8] = “snowall”

    이렇게 쓰면 a[0]부터 a[7]까지 접근하여 snowall의 각각의 글자들을 다룰 수 있다.



    [각주:

    1

    ]



    물론 a라는 배열 변수를 이용하여 한번에 뭔가를 할 수도 있다.

    하지만 이 경우에도 문제가 발생하는데, a에 저장하여야 할 문자열의 길이가 7글자가 아닌 경우이다. 이때는 다시 길이를 마음대로 바꿀 수 있는 포인터를 사용하여 선언하게 된다.

    #include

    char *a;

    a = malloc(sizeof(char)*8);

    strcpy(a, “snowall”);

    free(a);

    이와 같이 쓰면 코드는 좀 복잡하지만 문자열의 길이를 맘대로 바꿔가면서 사용할 수 있다.

    1. 글자가 7개인데 배열이 8칸인 이유는 숨어있는 1글자 때문에 그렇다. 그 숨어있는 1글자는 자습.

      [본문으로]

  • 윈도우즈 설치 버그

    뭐를 뭐에 넣어달라고? -_-;

  • 윈도우즈 탐색기의 묘한 버그

    탐색기를 열고

    화살표키를 이용해서 탐색하다보면

    이상하다.

    엔터 쳐서 들어가면

    아무것도 선택이 안 되어 있다.

    그래서 화살표키를 아래로 내리면 목록에서 두번째 것이 선택된다

    첫번째 것으로 바로 들어갈 수가 없다. 두번째 것으로 간 다음 다시 위로 올라가야 한다.

    아…귀찮아라…

  • 빈칸 처리하기

    VB2005에서 개발하다보면 황당한 상황들이 자주 발생한다. 이건 언어의 정의와 운영체제의 문제가 결합되서 만들어진 건데…

    내가 하고싶은건 cmd.exe를 실행시켜서 그 뒤에 명령을 붙이는 것이다.

    명령의 형태는

    strCmd = My.Application.Info.DirectoryPath & “\gnuplot\binary\gnuplot.exe”

    문자열로 주어져 있는 이 명령을 실행시키면 된다. 그래서 실행시켜봤더니 안된다.

    왜 안되는가 살펴봤더니 My.Application.Info.DirectoryPath에서 반환하는 이름에 공백이 들어가 있다. 그리고 cmd.exe는 공백은 모두 매개변수의 구분자로 생각하기 때문에 없는 명령이라면서 실행되지 않는다.

    해법1. 실행시키고 싶은 명령어가 있는 디렉토리의 경로에서 빈칸이 없도록 잘 조정한다.

    그런데 이렇게 하면 임의의 디렉토리에 있는 것을 실행시킬 수 없다. 따라서 앞으로 Program Files에 들어갈 이 프로그램의 작동이 보증이 안된다. 왜 MS에서는 Program과 Files 사이에 빈칸을 넣은 걸까? 개발자 삽질하라고? -_-;

    해법1을 기각하고 해법2를 찾는 중이다.

    해법2. 그래서 경로명의 앞/뒤에 강제로 “를 넣도록 해 봤다. 경로명 전체가 “로 둘러싸여서 안된다. 가령

    D:\Visual studio 2005\binary

    이런 경로명이 있다고 할 때

    “D:\Visual studio 2005\binary”

    이렇게 하면 뭔가 된다.

    암튼 해결.

    —-

    그 뒷이야기

    gnuplot을 그냥 실행시키기만 하면 안되고, 그 뒤에 스크립트 파일을 열도록 해야 한다. 그 스크립트 파일의 경로 또한 빈칸이 들어가 있고, 따라서 똑같은 에러가 발생한다 -_-;

    그래서. 홧김에 빈칸이 절대 들어가지 않아도 되도록 상대 경로로 지정해 버렸다.

    이해 되는 분만 웃으시면 됩니다. -_-;

  • for구문 무한루프

    for구문인데 무한루프에 빠진다.

    for(i=0;i<200;i++){
    printf(“%d th iteration \n”, iteration++);

    linmin(band, xi);

    if(2.0*fabs(fret-fp) break;

    }

    fp=NEBpotential(band);

    xi = NEBforce(band);

    gg=0.0;

    dgg=0.0;

    for(i=0;i<__DISCRETIZE__+1;i++){
    for(j=0;j<__DIM__;j++){
    gg+=g[i][j]*g[i][j];

    dgg = (xi[i][j]+g[i][j])*xi[i][j];

    }

    }

    gam=gg/dgg;

    if(gg==0.0){

    break;

    }

    for(i=0;i<__DISCRETIZE__+1;i++){
    for(j=0;j<__DIM__;j++){
    g[i][j] = -xi[i][j];

    h[i][j] = g[i][j]+gam*h[i][j];

    xi[i][j] = h[i][j];

    }

    }

    }

    분명히 괄호도 잘 막았고 for구문 쓰는 법도 맞았는데…

    어디서 틀린거지 -_-;

    C언어 쓰다가 이런 경우는 처음이다.

    추가 – for문 안에 for문을 또 쓸때 인덱스로 들어간 i를 같은걸 쓰는 바람에 이런 비극이 벌어졌다. -_-; 바보.

  • 문득…

    컴퓨터를 이용해서 뭔가를 한다는 것은 컴퓨터와 눈높이를 맞춰야 한다는 것이다.

    가르쳐주지 못하면 아무것도 못하는 이놈에게 나는 덧셈, 뺄셈부터 가르쳐야 한다.

    그래서…

    GSL을 쓰기로 결심하는 중이다. GSL은 컴퓨터에게 덧셈을 가르쳐 주는 존재랄까…


    http://www.gnu.org/software/gsl/

  • for문과 while문의 차이

    for와 while은 C언어의 대표적인 반복문이다.

    양천서.cpp

    //100대까지만 팬다

    for(int i = 0; i < 100; ++i){

    hit();

    if(confession()) break;

    }

    //자백할 때까지 팬다

    while(!confession()){

    hit();

    if(die()) break;

    }

    //일단 패고 본다

    do {

    hit();

    }while(!confession())


    http://kldp.org/node/116277

  • 개발 환경

    정신 차려보니 내가 가진 컴퓨터가 6대다.

    솔직히 말하자면 노트북 2대 빼고 나머지는 세팅도 못했다. -_-;

    클러스터링 세팅 해야 하는데…

    가장 왼쪽에 있는 놈은 LCD의 백라이트가 고장났다. 용산 가서 고쳐야 한다.

  • 자동 샷 카운터 프로그램 배포

    이걸 써먹을 곳이 우리 연구소 말고 어디에 있을까 싶긴 하지만 써보고 싶은 사람은 써도 좋다.

    이 프로그램은 GNU Public License의 적용을 받는다.

    압축은 7-zip을 이용해서 실행하였으니 아마 잘 될 것이다.

    아, 참고로 윈도우 전용이다. 어쩔 수 없다. -_-;

    개발 플랫폼은 Visual Studio 2005 (= .Net Framework 2.0)과 AutoHotkey와 MinGW(= gcc)라는 막장 조합이다.

    (막강 조합이 아님에 유의)

  • 완성 – 클릭 수 세는 프로그램

    이게 어쩌다 이렇게 된건지는 모르겠지만 이번에도 자세한 설명은 생략한다. 아무튼, 원하는대로 프로그램을 만들었다. 이것으로 레이저 한번 쏠 때마다 몇번 쐈는지 기록해 주는 프로그램을 작동시킬 사람 1명을 “절약”할 수 있게 되었다. 날림으로 만든 코드이며 매우 쉬우므로 소스코드 분석은 각자 해보기 바란다. 이런 프로그램을 다른데서 쓸 사람이 있을지는 모르겠지만 만약 사용하고 싶다면, 개인적인 용도로는 마음껏 써도 되지만 어딘가에 공표할 때에는 snowall의 명시적 허락을 받고 사용하길 바란다. (저작권료를 따로 청구하지는 않을 것이다.)


    Public Class frmMain

    Private c As Integer = 0

    Private today As Integer = 0

    Private beginning As Integer = 0

    Private autoflag As Boolean = False

    Private diaflag As Boolean = False

    Private remoteFlag As Boolean = False

    Private filenumber As Integer = 0

    Private file As String()

    Public Property intcount() As Integer

    Get

    Return c

    End Get

    Set(ByVal value As Integer)

    If value < 0 Then
    c = 0

    Else

    c = value

    End If

    counting()

    End Set

    End Property

    Private Sub counting()

    txtCount.Text = intcount.ToString

    txtPresent.Text = (intcount – 1).ToString

    ‘txtToday.Text = today.ToString

    System.IO.File.WriteAllText(My.Application.Info.DirectoryPath & “\APRICounter.txt”, txtCount.Text)

    End Sub

    Private Sub up()

    intcount += 1

    txtToday.Text = CInt(txtToday.Text) + 1

    End Sub

    Private Sub down()

    intcount -= 1

    txtToday.Text = CInt(txtToday.Text) – 1

    End Sub

    Private Sub reset()

    intcount = 0

    beginning = intcount

    txtToday.Text = 0

    End Sub

    Private Sub setting()

    Try

    intcount = CInt(txtSetCount.Text)

    beginning = intcount

    txtToday.Text = 0

    Catch

    End Try

    End Sub

    Private Sub btnReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReset.Click

    reset()

    End Sub

    Private Sub btnUp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUp.Click

    up()

    End Sub

    Private Sub btnDown_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDown.Click

    down()

    End Sub

    Private Sub btnSet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSet.Click

    setting()

    End Sub

    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Try

    intcount = System.IO.File.ReadAllText(My.Application.Info.DirectoryPath & “\APRICounter.txt”)

    beginning = intcount

    txtToday.Text = “0”

    Catch

    intcount = 0

    End Try

    txtDate.Text = System.DateTime.Today

    End Sub

    Private Sub btnFontSize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFontSize.Click

    Dim fnt As Font

    fnt = New Font(System.Drawing.FontFamily.GenericSansSerif, CInt(txtFontSize.Text))

    txtCount.Font = fnt

    End Sub

    Private Sub btnAuto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAuto.Click

    If diaflag Or remoteFlag Then

    If autoflag Then

    btnAuto.Text = “Auto” & vbCr & “count”

    Else

    btnAuto.Text = “Stop” & vbCr & “count”

    End If

    autoflag = Not (autoflag)

    Timer1.Enabled = autoflag

    Exit Sub

    End If

    If Not diaflag Then

    MsgBox(“First, Select auditing folder!”)

    Exit Sub

    End If

    If Not remoteFlag Then

    MsgBox(“First, Select auditing file!”)

    Exit Sub

    End If

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    If diaflag Then

    If filenumber <> System.IO.Directory.GetFiles(diaFolder.SelectedPath).Length Then

    file = System.IO.Directory.GetFiles(diaFolder.SelectedPath)

    txtCount.Text = CInt(filenameWashing(file, diaFolder.SelectedPath.Length)) + 1

    Me.txtPresent.Text = CInt(filenameWashing(file, diaFolder.SelectedPath.Length))

    txtToday.Text = CInt(txtToday.Text) + 1

    Else

    Exit Sub

    End If

    filenumber = System.IO.Directory.GetFiles(diaFolder.SelectedPath).Length

    End If

    If remoteFlag Then

    Dim n As New System.IO.StreamReader(OpenFileDialog1.FileName)

    Dim k As String

    k = n.ReadLine

    If txtToday.Text <> k Then

    txtPresent.Text = txtCount.Text

    txtCount.Text = CInt(txtCount.Text) + 1

    txtToday.Text = k ‘CInt(txtToday.Text) + 1

    End If

    n.Close()

    n.Dispose()

    End If

    System.IO.File.WriteAllText(My.Application.Info.DirectoryPath & “\APRICounter.txt”, txtCount.Text)

    End Sub

    Private Sub btnDir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDir.Click

    If diaFolder.ShowDialog <> Windows.Forms.DialogResult.Cancel Then

    flagClean()

    diaflag = True

    End If

    End Sub

    Private Sub btnSetToday_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetToday.Click

    txtToday.Text = txtSetCount.Text

    End Sub

    Private Function filenameWashing(ByVal filename() As String, ByVal baseLength As Integer) As String

    ‘Dim f As String

    Dim files As Integer()

    ReDim files(filename.Length)

    Dim i As Integer

    Dim regexPattern As String = “[^0-9]”

    Dim regex As New System.Text.RegularExpressions.Regex(regexPattern)

    For i = 0 To filename.Length – 1

    files(i) = CInt(regex.Replace(filename(i).Substring(baseLength, filename(i).Length – 4 – baseLength), regexPattern, “”)) ‘CAUTION!!! This code will work WRONG

    Next

    Array.Sort(files)

    Return files(files.Length – 1)

    End Function

    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click

    Me.Close()

    End Sub

    Private Sub btnRemote_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemote.Click

    If OpenFileDialog1.ShowDialog <> Windows.Forms.DialogResult.Cancel Then

    flagClean()

    remoteFlag = True

    txtToday.Text = 0

    End If

    End Sub

    Private Sub flagClean()

    remoteFlag = False

    diaflag = False

    autoflag = False

    End Sub

    End Class