kkamagui / mint64os

Project for making your own 64bit multicore operating system (MINT64 OS) from scratch
61 stars 25 forks source link

ConsoleShell.c 파일안 kDropCharactorThread 함수 구현 실수 해결 방안 #7

Open ybjeon01 opened 3 years ago

ybjeon01 commented 3 years ago

안녕하세요. Chapter 21을 읽는 도중에 구현 실수를 발견한 것 같아 글을 남깁니다. 또한 github에도 책과 같은 코드가 존재하기도 하고요.

matrix string이 위에서 아래로 영화 matrix 화면과 비슷하게 출력할려면 github kDropCharactorThread 함수가 iY 변수가 활용되야 하는데 원래 코드에는 iY를 사용하는 코드가 없습니다. iY를 활용하는 코드가 없어서 제가 첨부한 비디오처럼 화면 첫번쨰 줄부터 순서대로 끝까지 철창살이 내려오는 것처럼 string이 출력되는 걸 볼 수가 있었습니다. 원래 코드와 제가 수정한 코드 두개를 여기에 남깁니다. 수고하세요.

video: https://youtu.be/5VM0xHjQbfU

Original Code (mint64os/02.Kernel64/Source/ConsoleShell.c)

/**
 *  철자를 흘러내리게 하는 스레드
 */
static void kDropCharactorThread( void )
{
    int iX, iY;
    int i;
    char vcText[ 2 ] = { 0, };

    iX = kRandom() % CONSOLE_WIDTH;

    while( 1 )
    {
        // 잠시 대기함
        kSleep( kRandom() % 20 );

        if( ( kRandom() % 20 ) < 16 )
        {
            vcText[ 0 ] = ' ';
            for( i = 0 ; i < CONSOLE_HEIGHT - 1 ; i++ )
            {
                kPrintStringXY( iX, i , vcText );
                kSleep( 50 );
            }
        }        
        else
        {
            for( i = 0 ; i < CONSOLE_HEIGHT - 1 ; i++ )
            {
                vcText[ 0 ] = ( i + kRandom() ) % 128;
                kPrintStringXY( iX, i, vcText );
                kSleep( 50 );
            }
        }
    }
}

Modified Code

// thread task that prints a string as in matrix movie
static void kDropCharactorThread(void) {
    int iX;
    int iY;
    int i;
    char vcText[2] = {0, };

    iX = kRandom() % CONSOLE_WIDTH;

    while (TRUE) {
        iY = kRandom() % CONSOLE_HEIGHT;                 // 바뀐 부분
        kSleep(kRandom() % 20);

        if ((kRandom() % 20) < 15) {
            vcText[0] = ' ';
            for (i = iY; i < CONSOLE_HEIGHT - 1; i++) {     // 바뀐 부분
                kPrintStringXY(iX, i, vcText);
                kSleep(50);
            }
        }
        else {
            for (i = iY; i < CONSOLE_HEIGHT - 1; i++) {    // 바뀐 부분
                vcText[0] = (char) (i + kRandom());
                kPrintStringXY(iX, i, vcText);
                kSleep(50);
            }
        }
    }
}
Juha3141 commented 3 years ago

어 저기 for문에 iY는 그럼..

Juha3141 commented 3 years ago

아닌가 저도 잘 모르겠네요

kkamagui commented 3 years ago

안녕하세요 @ybjeon01 님,

오! 그렇군요! 감사합니다! 제가 시간날 때 한 번 반영해서 확인해보겠습니다. ^^)-b

ybjeon01 commented 3 years ago

@Juha3141 님 안녕하세요

원래 코드에선 for loop에 iY를 활용하는 코드가 없습니다. 혹시 헷갈릴까봐 원글를 좀 수정했습니다. 문제를 보여주는 비디오, 원래 코드, 바뀐 코드 3개를 올렸으니 이해 안 되는거나 제가 잘못 적은거 있으면 알려주세요.

Juha3141 commented 3 years ago

아하! 이해했어요..!