Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ybjeon01 opened this issue Jul 3, 2021 · 5 comments
Assignees

Comments

@ybjeon01
Copy link

ybjeon01 commented Jul 3, 2021

안녕하세요. 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
Copy link

Juha3141 commented Jul 4, 2021

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

@Juha3141
Copy link

Juha3141 commented Jul 4, 2021

아닌가 저도 잘 모르겠네요

@kkamagui
Copy link
Owner

kkamagui commented Jul 4, 2021

안녕하세요 @ybjeon01 님,

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

@kkamagui kkamagui pinned this issue Jul 4, 2021
@kkamagui kkamagui unpinned this issue Jul 4, 2021
@kkamagui kkamagui self-assigned this Jul 4, 2021
@ybjeon01
Copy link
Author

ybjeon01 commented Jul 4, 2021

@Juha3141 님 안녕하세요

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

@Juha3141
Copy link

Juha3141 commented Jul 4, 2021

아하! 이해했어요..!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants