[Powered by Google Translate] [제 5 : 덜 편안]
[네이트 Hardison, 하버드 대학교]
[이 CS50 수 있습니다.] [CS50.TV]
그래서 사람들은 다시 환영합니다.
섹션 5에 오신걸 환영합니다.
이 시점에서, 퀴즈를 0을 완료 답니다 당신이 한 방법을 볼 수있게 되서,
I 매우이 섹션의 점수에 감동했기 때문 잘하면 니가 정말 좋아.
온라인 시청자를 들어, 우리는 몇 가지 질문을 했어
문제 세트의 마지막 두 가지 문제에 대한 - 또는 퀴즈에, 오히려.
그래서 우리는 모든 사람들이 무슨 일이 일어 났는지 볼 수 있도록 정말 빨리 그 이상 갈거야
하고 오히려 그냥 솔루션 자체를 보는 것보다 실제 솔루션을 통해 이동하는 방법.
우리는 정말 신속하게 문제의 지난 몇 동안 이동 32 33거야.
그냥, 다시, 그래서 온라인 시청자하는 것은이 볼 수 있습니다.
>> 당신은 13 페이지에 문제 32에 설정하면
16 13에서이 문제가 32 모든 스왑에 있습니다.
이 두 정수를 교환에 관한 모든이었습니다.
우리가 강의에서 몇번 겪었으니하는 문제입니다.
그리고 여기, 우리가 당신 한테 부탁 한 것은 빠른 메모리 추적합니다.
그들은 스택에있는 같은 변수의 값을 채워
코드는 스왑 기능을 통해 전진.
특히, 우리는보고 - 난이 아이 패드를 놓을 -
특히, 우리가보고있는 것은이 줄은 이곳에서 6 권리를 번호입니다.
그리고는 이전 문제를 단지 접근을 위해 6 번호가있어.
우리가 원하는 것은 메모리의 상태를 표시하거나 라벨입니다
우리가이 광고 번호 6을 실행하면 시간에로
이는 효과적으로 우리의 여기 스왑 함수에서 반환됩니다.
우리가 여기까지 스크롤하면, 우리는 메모리에 모든 주소가 우리에게 제공 한 것을 보았다.
이 매우 중요합니다, 우리는 한 순간에 다시 갈 게요.
그리고 여기 아래에, 우리는 우리가 참조 할 것 같군 작은 메모리도했다.
사실 난 내 아이 패드에이을 다했습니다.
그래서 난 참조 용으로 아이 패드와 코드 사이를 앞뒤로 번갈아거야.
>> 의 시작하자. 첫째, 바로 여기에 주요 행의 첫 번째 몇에 초점을 맞춰 보자.
시작하려면, 우리는 2로 1 Y x를 초기화거야.
우리는 두 정수 변수를 가지고 그래서, 그들은 스택에 배치 될 것 모두.
우리는 그들에 1과 2를하겠습니다.
내 아이 패드로 뒤집기다면, 희망, 보자 -
애플 TV 미러링, 그리고 거기 우리는 간다. 좋아요.
내 아이 패드로 뒤집기면하면,
I 2로 1 Y x를 초기화하고 싶습니다.
우리는 X를 표시 상자에 1을 작성하여 간단 그런 짓을
그리고 상자에 2 y를 표시했습니다. 상당히 간단합니다.
그래서 지금의이 노트북으로 돌아 가자고, 다음번에 일어날 일을 참조하십시오.
상황이 까다로운 얻을 곳이 다음 줄 것입니다.
우리는 매개 변수로 x의 주소와 y의 주소를 전달 스왑 함수 a와 b.
x와 y의 주소의 주소는 우리가 계산 할 수 없습니다 물건
이 총알을 참조하지 않고 바로 여기 아래 지적했다.
다행히도, 처음 두 글 머리 기호는 답변이 정확히 알려주세요.
메모리에서 x의 주소는 10이며, 메모리 y의 주소는 14입니다.
그래서 그것들은로 전달받을 값입니다 및 스왑 함수에서 위에서 나.
그럼 다시, 우리의 다이어그램으로 전환, 나도은 10를 작성할 수
B와 14.
우리가 스왑을 진행 위치를 지금이 시점입니다.
자, 다시 노트북으로 돌아 내리고
우리는 스왑을 작동하는 방법은 TMP에와 상점의 결과 I 첫번째 역 참조입니다 참조하십시오.
따라서 역 참조 연산자는 야 "라고. 주소와 같은 변수의 내용을 다룹니다.
그 주소에 저장되어있는 어떤으로 이동하여로드합니다. "
당신이 변수에서로드 것은 우리의 TMP 변수에 저장 될 것입니다.
아이 패드로 돌립니다.
우리가 10 해결로 이동하는 경우, 우리는 주소를 10 varible X 것을 알고
우리는 메모리에서 x의 주소는 10입니다 우리의 총알 포인트가 말한 있었 으니까.
그래서 우리는, 우리가 아이 패드에서 볼 수로, 거기에 가서 1 그것의 가치를 얻을 수 있습니다
그 TMP로로드합니다.
다시 말하지만,이 마지막 내용이 없습니다.
우리는을 통해 걸어 갈 거에요, 그리고 우리는 말에 프로그램의 최종 상태로 연결됩니다.
하지만 지금, 우리는 tmp 디렉토리에 저장되어있는 값 1이 있습니다.
>> 그리고 여기에 빠른 질문이 있어요.
[알렉산더] 역 참조 연산자입니까 - 그냥 변수 앞의 별이있어?
>> 예. , 우리는 다시 한번 우리의 노트북에 다시 뒤집기으로 역 참조 연산자 그래서
앞이 스타입니다.
그런 의미에서, 그래 - 당신은 곱셈 연산자로 대조
이는 두 가지가 필요하고, 역 참조 연산자는 단항 연산자입니다.
그냥 바이너리 연산자는 반대로 하나의 값에 적용하면,
당신은 두 개의 서로 다른 값으로 적용 곳.
그 말씀은 라인에 무슨 일이 일어날 지 알려주지.
우리는 값 1을로드하고 임시 정수 변수에 저장.
다음 행은, 우리는에 B의 내용을 저장합니다 -
또는, 오히려, 우리는 B가가 가리키는 곳으로 가리키는되는 내용을 저장합니다.
우리가 오른쪽에서 왼쪽으로이 분석하면, 우리는 역 참조 B로가는거야
우리가 14 해결하려고, 우리는이 정수를 잡아 거에요
그리고 우리는, 주소 10가는거야
우리는 그 공간에 B 우리의 역 참조의 결과를 던져 버릴 수 있습니다.
우리가이 좀 더 구체적으로 만들 수 있습니다 우리의 아이 패드로 다시 내리고,
여기 주소의 모든에 번호를 작성하면 도움이 있습니다.
그래서 우리는 Y에, 우리는 주소를 14 것을 알고, x는 주소 10시.
우리가 B에서 시작하면, 우리는 역 참조 B는, 우리는 값 2를 잡아거야.
우리는이 주소 14 사는 값이 있기 때문에이 값을 가져 갈 수 있습니다.
그리고 우리는, 주소 열에서 살고 변수에 넣어 것
이는 우리 변수 x에 해당하는, 바로 거기에 있습니다.
그래서 우리는 여기에 덮어 쓰기 약간을 수행 할 수
우리는 우리의 일을 제거하고 그 대신 우리는 2 쓸 곳.
이 모든 우리는 이제 덮어 X를 했는데도 잘 세계에서 좋아요.
우리는 우리의 TMP 변수에서 x의 이전 값을 저장하고 있습니다.
그래서 우리는 다음 행으로 스왑을 완료 할 수 있습니다.
우리 노트북으로 돌립니다.
지금 그 유적은 우리의 임시 정수 변수의 내용을 제거입니다
와 B가 들고있는 주소에서 살고있는 변수에 보관하십시오.
그래서 우리는 변수에 대한 액세스를 얻을 효율적으로 역 참조를 B에가는거야
즉, B는 거기에 보유하고있는 주소입니다
우리는 TMP가에 들고있는 값을 쑤셔거야.
한 번 더 아이 패드로 다시 돌립니다.
내 말은, 여기 2이 값을 지울 수 있습니다
대신 우리는으로 한 권리를 복사합니다.
그런 다음 과정을 실행하는 다음 줄 -
우리가 노트북으로 다시 뒤집기 경우 -이 시점 6입니다
우리 그림이 완전히 작성하고 싶었되는 점은 어떤 것입니다.
그래서 아이 패드에 다시 내리고는 다시 한 번, 그렇게 당신은 완성 된 그림을 볼 수 있습니다
당신은 우리가 X에서의 10, B에 14, tmp 디렉토리에있는 1, 2,와 y에 1을 가지고 볼 수 있습니다.
이것에 대해 질문이 있습니까?
이건 통해 걸어 것에 더 의미가 있습니까?
덜 이해가가? 희망이 없습니다. 좋아요.
>> 포인터는 매우 까다로운 될 수 있습니다.
우리가 함께 일하는 사람들 중 하나는 매우 일반적인 말이 있습니다 :
"포인터를 이해하려면 먼저 포인터를 이해해야합니다."
어떤 나는 매우 사실이라고 생각합니다. 그것은 익숙해 질 수있는 시간이 걸릴하지 않습니다.
매우 도움이되며, 사진을 많이 그리기 이와 같은 메모리 다이어그램을 많이 그리기
당신은 예를 들어 한 후 예를 들어 한 후 예를 들어 통과 후,
그것은 좀 더 감각과 좀 더 감각과 조금 더 이해하기 시작합니다.
마지막으로, 언젠가는 모든이 완전히 마스터해야합니다.
우리는 다음 문제로 이동? 질문하기 전에 괜찮아요.
따라서 노트북에 다시 뒤집기.
우리가 다음 문제는 문제 33 번 파일에 있습니다 I / O.
이 약간 확대합니다.
문제 33 - 네?
>> [다니엘] 난 그냥 간단한 질문을했다. 이 별, 또는 별표,
그것은 당신이 전에 별표를 사용하면 dereferencing라고.
당신은 전에 앰퍼샌드를 사용할 때이 제목이 뭐야?
>> 앰퍼샌드은 이전 주소 -의 운영자입니다.
그럼가 다시 스크롤 보자.
죄송합니다. 너무 내가 할 수있는 정말 스크롤되지 줌 모드에서입​​니다.
우리는 바로 여기 정말 빨리이 코드를 보면,
다시 같은 일이 벌어지고 있습니다.
우리가 바로이 코드를 보면,이 라인에서 우리는 통화, 교환 만드는 곳
앰퍼샌드는 "주소 변수 x의 삶을 삽시다."라고되어 있습니다
당신의 컴파일러가 코드를 컴파일 할 때하면
실제로 물리적으로 살 수 있도록 모든 변수에 대해 메모리에 장소를 표시합니다.
이 모든 컴파일 된 후 그리고 컴파일러는 다음 무엇을 할 수
는 "오, 난 주소 10 x를 넣어. 나는 주소 14 y를 넣어."알고
그런 다음 당신을 위해이 값을 입력 할 수 있습니다.
그럼 당신은 그때 할 수 있습니다 - 그럼뿐만 아니라 및 패스 & Y에서이 작업을 전달할 수 있습니다.
,이 사람들은 주소를 얻을뿐만 아니라, 언제 스왑 기능으로 합격
이러한 유형의 정보, 바로 여기 INT *은, 컴파일러를 알려줍니다
"그래, 우리는 정수 변수의 주소로이 주소를 해석 할 것"이라고 말했다.
정수의 주소되는데,이 문자 변수의 주소를 다른
정수는 32 비트 시스템에 차지하기 때문에, 공간의 4 바이트를 차지
문자는 공간 1 바이트를 차지 반면.
그게 무엇인지를 알고하는 것이 중요이야 - 사는 무슨 가치를 어떤 타입의
인치 통과 했어요 주소에 살고
당신이 상대하고있는 또는 주소를 입력합니다.
이렇게, 당신은 얼마나 많은 바이트의 정보가 실제로 RAM에서로드 할 수 알아요.
그리고, 그래, 당신 같은이 역 참조 연산자는, 요구 된
들어가서 특정 주소에 대한 정보를 액세스합니다.
그래서 여기이 변수라고, 주소와 같은 내용을 취급,
해당 주소로 이동하여 끌어 등록에 프로세서 부하로로드
실제 값 또는 해당 주소에 살고있는 콘텐츠입니다.
질문 더 있습니까? 이러한 좋은 질문들입니다.
그건 너무 새로운 용어 많이 있습니다.
그것은 다른 곳에서 &와 * 표시도 펑키 한 종류입니다.
>> 괜찮아요.
그러니까 문제 33, 파일 I / O.
이건 내가 몇 가지 일이 생각 이러한 문제 중 하나였습니다.
하나는, 그것은 상당히 새로운 주제입니다.
그것은, 퀴즈를하기 전에 곧 발표가 된
그리고 나는 수학에서 해당 단어 문제 중 하나와 같은 가지 생각
어디에 당신에게 많은 정보를 제공하지만, 실제로 그것의 톤을 사용할 필요 결국하지 않습니다.
이 문제의 첫 번째 부분은 CSV 파일이 뭔지 설명되어 있습니다.
이제 CSV 파일, 설명에 의하면, 쉼표로 구분 된 값 파일입니다.
이 모든 재미에 있습니다 이유, 그리고 다시를 사용하는 이유
왜냐하면, 어떻게 많은 적 Excel과 같은 물건을 사용했을입니까?
아마, 또는 당신의 삶에 어떤 시점에서 사용이 당신의 대부분을 그림.
당신은 Excel과 같은 것을 사용합니다.
Excel 스프레드 시트의 데이터를 얻거나 그것으로 처리 어떤 종류를하기 위해,
당신은 C 프로그램이나 파이썬 프로그램, 자바 프로그램을 작성하고자 할 경우
당신이 거기에 저장 한 데이터를 처리하기 위해,
그것을 꺼내하는 가장 일반적인 방법 중 하나가 CSV 파일에 있습니다.
당신은, dialogue '다른 이름으로 저장'로 이동할 때 그리고 당신은 Excel을 열고 수
당신은 실제 CSV 파일을 얻을 수 있습니다.
>> 이런 것들을 처리하는 방법을 알고하는 것이 편리.
작동 방법은 비슷합니다 것입니다 - 내 말은, 그것은 본질적으로, 스프레드 시트를 흉내 낸 것
어디 우리가보다시피, 가장 왼쪽 대부분의 작품에서
우리는 마지막으로 이름이 있습니다.
그래서 우리는 다음 Malan, Hardison 후 보덴, MacWilliam 후 찬 있습니다.
모든 마지막 이름입니다. 그리고 쉼표는 첫 번째 이름과 마지막 이름을 분리합니다.
데이빗, 네이트, 로브, 토미, 그리고 Zamyla.
항상 로비와 톰를 섞는다.
그리고, 마지막으로, 세 번째 열은 이메일 주소입니다.
당신이 이해되면, 프로그램의 나머지 부분은 구현하기가 매우 간단합니다.
우리는 우리의 C 프로그램에서이 같은 구조를 모방하기 위해 무슨 짓을했는지
우리는 구조를 사용했습니다된다.
우리는뿐만 아니라이 조금 더 가지고 노는 시작합니다.
우리는 사전 처리 된 문제 세트 3, 최초의 약간의 사람들을 보았다.
그러나이 직원 구조체는 마지막 이름, 이름과 이메일을 저장합니다.
우리의 CSV 파일 등이 저장되었습니다.
그래서 단 한 형식에서 다른 변환합니다.
우리는 선으로,이 경우 직원 구조체로 변환해야합니다
그와 같은 쉼표로 구분 선.
그게 말이나 돼? 당신들은 모든 퀴즈를 촬영 한
나는 당신이 적어도 이것에 대해 생각할 시간을 가지고 상상해보십시오.
>> 대여 함수에서 문제가 우리가 수행하기를 부탁합니다 -이 약간의 뇌물로 확대 -
, 이름 s와 (과), 직원 구조, 직원 구조체에 걸릴
우리의 staff.csv 파일에 내용을 추가합니다.
그것은이 사용하기 매우 간단하다고 밝혀졌다.
우리는 가지가 조금 더 이러한 기능 오늘 놀러됩니다.
그러나이 경우에, fprintf 함수는 정말 중요합니다.
따라서 fprintf와 함께, 우리는 너희들이 printf이 모든 용어를 사용해 왔습니다처럼 인쇄 할 수 있습니다.
당신은 파일에 printf 줄 수 있습니다.
대신 일반적인 printf 전화를을 그래서 당신은 그것을 형식 문자열을 제공 곳
그리고 당신은 다음 인수와 함께 모든 변수를 대체
fprintf와 함께 귀하의 첫 인자는 대신에 당신이 기록 할 파일입니다.
우리는 사람 fprintf 예를 들어, 어플라이언스에 이것 좀 봐한다면
우리는 printf와 fprintf의 차이점을 볼 수 있습니다.
내가 여기에 조금 확대됩니다.
printf와 그래서, 우리는 우리가 그것을 형식 문자열을 제공 한 다음 이후의 인수
의 형식 문자열로 교체 또는 대체에 대한 모든 변수입니다.
fprintf 반면, 첫 번째 인수는 실제로 스트림이라는이 파일 *입니다.
>> 우리 대여에 여기에 다시 이동
우리는 이미 파일 * 스트림이 우리를 위해 열려있어.
그거 내가이 첫 번째 줄은 무엇을, 그것은 staff.csv 파일을 엽니 다,
이 추가 모드에 열리고, 우리가 할 남은 건입니다
파일에 직원 구조를 써주세요.
그리고 제가 아이 패드를 사용하려면 어떻게, 어디 보자?
나는 iPad를 사용합니다. 우리는 무효가 - 좀 더 쓸 수 있도록 테이블에 넣어까요? -
대여를 취소하고, 한 인수에 S라는 직원 구조를 걸립니다.
우리 교정기있어, 우리는, 파일라고하며 파일 *이 있어요
우리는 우리에게 주어진 우리의 fopen 줄이
이 pedia에 이미 않았고, 난 점으로 기록됩니다.
그리고 우리의 다음 줄에, 우리는 fprintf에 전화를 걸거야
우리는, 우리가 인쇄 할 파일에 전달 할거야
다음의 형식 문자열,있는 -
나는 너희들이 어떻게 생겼는지 말해 드리겠습니다.
당신은 어때요, 스텔라? 당신은 형식 문자열의 첫 번째 부분이 어떻게 생겼는지 알 수 있습니까?
[스텔라] 내가 모르겠어. >> 지미 물어 주시기 바랍니다.
당신은 지미를 아세요?
[지미]는 그냥 마지막 주시겠습니까? 모르겠어요. 저도 잘 모르겠습니다.
좋아요 >>. 어때요, 사람은 시험에서이 올바른 거죠?
좋아, 안돼.
여기 우리가해야 할 일은 우리가 저희 직원 구조의 각 부분을 원이라고 밝혀
우리 파일에 문자열로 출력 할 수 있습니다.
우리가 성을 가지고 있기 때문에 우리는 문자열 대체 문자 세 다른 시간을 사용하여
쉼표 뒤에 다음, 첫 번째 이름은 쉼표로 이어
그리고 마지막 한 이메일 주소가옵니다 -이 아닌
내 화면에 맞는 - 그러나 그 줄 바꿈 문자 뒤에있어.
그래서 난 저기를 작성하는거야.
그리고, 우리의 형식 문자열에 따라
우리는 우리가 점 표기법을 사용하여 액세스하는 대체이
우리는 문제 세트 3 본.
우리는 s.last, s.first 및 s.email를 사용할 수 있습니다
의 형식 문자열에 세 값을 대체합니다.
그래서 어떻게 됐어? 이해가가?
그래? 아냐? 가능? 좋아요.
>> 우리가 인쇄 한 우리가 우리의 파일을 오픈 한 후 이후에 우리가하는 마지막으로 한가지 :
우리가 파일을 오픈 한 할 때마다, 우리는 항상 문을 닫을 것을 기억해야합니다.
그렇지 않으면 우리가 메모리가 누수 헤어지는 것 때문에하는 것은
파일 설명을 사용합니다.
그래서 우리는 어떤 기능을 사용합니까, 그것을 닫으려면? 다니엘?
[다니엘] fclose? 정확히 >> fclose.
따라서이 문제의 마지막 부분은 fclose 함수를 사용하여 파일을 올바르게을 닫으 것이 었습니다
이는 그 것 같습니다.
미친 짓 없습니다.
좋아.
그래서 그런 퀴즈의 문제가 33입니다.
우리는 I / O가 오는 확실히 더 많은 파일이 있습니다.
우리는 지금 오늘 강의에서 조금 더 많은 일을, 또는 섹션에합니다
그이 다가오는 pset의 대량를 형성 무슨 일 때문이에요.
가이 시점에서 퀴즈에서 이동하세요. 그래?
>> [샬롯]] 왜 대신에 fclose의 fclose (파일) (staff.csv)?
>> 아. 이 것이 밝혀하기 때문에 - 그래서 질문은, 큰 중 하나입니다 것은,
왜 우리가 fclose를 쓸 때, 우리는 fclose (파일) 성 변수를 작성하는합니다
로 파일 이름, staff.csv에 반대? 그 맞습니까? 그래.
그러니를 살펴 보자. 내 노트북​​로 다시 전환하는 경우는,
과의이 fclose 함수를 살펴 보도록하겠습니다.
그래서, fclose 함수는 스트림을 닫고, 우리가 가까이 할 스트림 포인터에 소요
으로 우리가 접근 할 실제 파일 이름에 반대했습니다.
그리고이 때문에 장면 뒤에, 당신은 fopen에 전화를 걸 때입니다
당신은 파일을 열 때, 당신은 실제로 파일에 대한 정보를 저장 메모리를 할당하고 있습니다.
당신은 파일에 대한 정보를 파일 포인터가
이 열려있는 등, 당신이 파일에 현재의 크기,,
당신은 읽고 파일 내에서 특정 장소에 호출을 작성 할 수 있도록.
대신 파일 이름을 해지 포인터를 닫는 결국.
>> 그래? [다니엘] 지금 대여를 사용하려면, 당신 생각은 어때요 - 어떻게는 사용자 입력을받을입니까?
fprintf 그냥 사용자 입력을 기다리겠습니다이라는 관점에 입각 GetString처럼 행동 하는가
그리고이를 입력하도록 요청 - 또는 이러한 세 가지를 입력하길 기다리라고?
또는 대여를 구현하는 무언가를 사용해야합니까?
>> 그래. 그래서 우리는이 아니에요 - 문제는 어떻게 우리는 사용자 입력을 어떻게해야합니까되었습니다
대여를 구현하려면? 그리고 우리가 여기있는 것은, 대여의 호출자입니다
이미 구조체에 저장된 모든 데이터와 함께 직원 구조체에 통과 시켰습니다.
따라서 fprintf 단지 파일에 직접 데이터를 작성 할 수 있습니다.
는 사용자 입력을 기다리는이 없습니다.
사용자가 이미 제대로이 직원 구조체에 넣어하여 입력을 뺏기는군요.
이러한 포인터 중 하나가 널 (null)이라면 일들은 물론, 대냐
그래서 우리는 여기까지 다시 스크롤하고 우리는 우리의 구조체보세요.
우리는 문자열 마지막으로, 문자열 첫째, 문자열 이메일을 갖추고 있습니다.
우리는 지금 그 정말 모두, 후드 아래 숯불 * 변수 않고 있다는 것도 알고있다.
그래서 null로 지적되지 않을 수도 있습니다 나.
그들은 힙에 메모리를 가리키는 될 수 있습니다
스택에 아마도 메모리.
우리는 사실을 알고 있지만, 이러한 포인터 중 하나가 널 (null), 또는 무효 인 경우,하지 않습니다
확실히 우리의 대여 기능을 중단하겠다 그.
그 시험의 범위를 넘어 가지였다 것이었다.
우리는 그것에 대해 걱정하지.
좋아요. 좋아요. 그래서 퀴즈에서의 이동.
>> 의이 남자를 가까이, 우리는 pset 4에서 보는거야.
너희들이 pset 사양에 보면면 일단 당신이 그것을 액세스 할 수 cs50.net/quizzes,
우리는 섹션 문제가 오늘날의 몇 가지를 통해 갈 수 있습니다.
나는 아래로 스크롤거야 - 질문 섹션은 pset 사양의 세 번째 페이지에서 시작됩니다.
그리고 첫 번째 부분은 리디렉션 및 파이프에 가서 짧은보고를 부탁합니다.
시원한 짧은 사람 이었어요있는 당신에게 당신이 사용할 수있는 몇 가지 새로운, 멋진 명령 줄 트릭을 보여줍니다.
그리고 우리는뿐만 아니라 당신을 위해 몇 가지 질문이 있어요.
스트림에 대한 첫 번째 질문, printf 기본적으로 기록 할 수있는
우리는 가지 좀 전에 조금 언급.
우리가 토론 한 것을이 fprintf는 인자로 파일 * 스트림에 걸립니다.
fclose는뿐만 아니라 파일 * 스트림에 소요
그리고 fopen의 반환 값은뿐만 아니라 당신에게 파일 * 스트림을 제공합니다.
우리가 printf 처리했을 때 우리가 전에 사람들을 보지 못하는 이유
printf 기본 스트림이 때문입니다.
그리고 기록 할 수있는 기본 스트림
당신은 짧은에 대해 찾을 수 있습니다.
그럼 확실히 한번 살펴보십시오.
>> 오늘의 섹션에서, 우리는 GDB에 대해 조금 얘기를 할거야
더 친숙 당신이 그 때문에, 더 연습 당신은 그것을 받아들
더 나은 수 있습니다 당신은 실제로 자신의 코드에서 버그를 사냥 수 있습니다.
이 엄청난까지 디버깅의 과정을 가속화시킵니다.
따라서 printf를 사용하여 때마다 당신은, 당신은 코드를 다시 컴파일해야하는 일
당신이 다시 실행해야 가끔 당신은 주변의 printf 전화를 이동해야
코드를 주석으로, 단지 시간이 걸립니다.
우리의 목표는 시도하고 GDB를 사용하면 기본적으로 할 수 있다는 것을 설득하는 것입니다
printf 코드의 모든 시점에서 아무 것도 있고 당신이 그 사실을 다시 컴파일 할 필요가 없습니다.
당신은 시작하고 어디에서 printf 다음도 추측 유지하지 않아도됩니다.
해야 할 첫 번째 일은이 줄을 복사하여 웹의 섹션 코드를 하차하는 것입니다.
난 "wget​​ http://cdn.cs50.net"라고 코드이 줄을 복사거야.
난 복사 할거야.
내 기기로 갈거야, 그래서 당신은, 내가하는 일이 볼 수 축소
거기에 붙여, 나는 Enter 키를 쳤을 때이 wget 명령은 문자 그대로 웹 얻을 수 있습니다.
그것은 인터넷의이 파일을 내리고 겁니다
그리고 현재 디렉토리에 저장 거에요.
내 현재 디렉토리를 나열하면 이제 바로 내가이 section5.zip 파일을 가지고있는 것으로 볼 수 있습니다.
그 사람을 처리하는 방법은, 그것을 압축을 풉니하는 것입니다
어떤 당신은 같이 명령 줄에 수행 할 수 있습니다.
Section5.zip.
을 압축을 풉니 될거야, 저 폴더를 만듭니다
내용을 모두 급증, 거기에 넣어.
그래서 지금은 cd 명령을 사용하여 5 절 디렉토리로 이동 할 수 있습니다.
맑은 사용하여 화면을 지 웁니다. 따라서 화면을 취소합니다.
지금은 처리 할 수​​있는 좋은 깨끗한 터미널있어.
>> 나는이 디렉토리에있는 모든 파일을 나열다면 지금이라도
buggy1, buggy2, buggy3, 그리고 buggy4 : 내가 네 파일이있어 것을 볼 수 있습니다.
나는 또한 해당. C 파일있어.
우리는 지금. C 파일을 볼 수 없어요.
대신, 우리는 GDB를 열 때를​​ 사용하려고하고 있습니다.
우리는 GDB를 사용할 때 우리는 우리가 실제 소스 코드에 액세스 할 수 있도록 주변을 유지 한
하지만 섹션의이 부분의 목표는 GDB와 주변 땜쟁이하는 것입니다
우리는이 네 버그 프로그램을 통해 잘못 무슨 일인지 알아 내기 위해 사용할 수있는 방법을 참조하십시오.
그래서 우리는 정말 신속하게 방 주위에가는거야
그리고 난 버그 프로그램 중 하나를 실행 누군가를 요구하려고
그리고, 우리는 GDB를 통해 그룹으로 갈거야, 그리고 우리가 이러한 프로그램을 해결하기 위해 할 수있는 일을 볼 수 있습니다
아니면 적어도 그들 각각의 잘못된 무슨 식별합니다.
다니엘과 함께 시작하자. 당신은 buggy1을 실행 되나요? 어떻게 알아 보자.
[다니엘] 그것은 응용 프로그램 오류가 있다고 하는데요. >> 그래. 그렇지.
나는 buggy1을 운영하는 경우 그래서, 난 감금 결함을.
이 시점에서, 난 가서 buggy1.c을 열 수
, 시도하고 잘못된 무슨 일인지 알아 내기
하지만이 감금 오류 오류에 대한 가장 역겨운 것들 중 하나
이 프로그램 일 줄은 실제로 잘못 가서 고장 내용에 얘기하지 않는다는 것입니다.
당신은 가지 코드를 바라보아야 할 필요
그리고 추측를 사용하여 파악하고 확인하거나 printf 잘못 무슨 일이 볼 수 있습니다.
GDB에 대한 멋진 것들 중 하나는 정말, 정말 쉽다는 점입니다
선을 찾아 낼 수있는 프로그램 충돌에서.
그것은 완전히도 그에 대한 경우, 그것을 사용 가치가있어.
그럼 GDB를 부팅하려면, 나는 GDB를 입력 한 다음 내가 실행하고자하는 실행에에게 경로를 제공합니다.
난 여기 gdb를 ./buggy1을 입력거야.
Enter 키를 누르십시오. 나에게 모든 저작권 정보를 제공합니다
아래로 당신은 여기 ", / home에 /에서 읽기 기호를 말합니다이 줄을 볼 수 있습니다
jharvard/section5/buggy1. "
모두가 잘 가면, 당신은 이런 식으로 보이는 메시지를 인쇄이 표시됩니다.
그것은 기호를 읽을 것, 그것은 "나는 당신의 실행 파일에서 기호를 읽고있어"라고합니다
다음은 여기에이 "완료"메시지가 있습니다.
이 중 다른 변화를 참조하거나 당신이 볼 경우에는 기호를 찾을 수 없습니다
또는 그런 일을, 뭘 의미하는 것은 당신이 방금 제대로 실행 파일을 컴파일하지 않은 것입니다.
우리는 GDB와 함께 사용하기위한 프로그램을 컴파일 할 때, 우리는 그 특수 g 플래그를 사용해야합니다
당신이 프로그램을 컴파일하는 경우와 그건 그냥 확인 입력하여 기본적으로 끝났
또는 버그를 걸거나 그 중 어느 복구합니다.
하지만 당신이 꽝을 수동으로 컴파일하는 경우, 당신은에 가서 그 - g 플래그를 포함해야합니다.
>> 이 시점에서, 이제 우리는 우리의 GDB 프롬프트를 가지고
이 프로그램을 실행하기 위해 아주 간단합니다.
우리는 하나 실행을 입력 할 수 있습니다, 또는 우리는 R을 입력 할 수 있습니다.
대부분의 GDB 명령은 생략 할 수 있습니다.
보통 꽤 좋아 하나 또는 몇 문자로.
당신은 r을 입력하고 무슨 일이, Enter 키를다면, 사드?
[사드] 내가 SIGSEGV, 분류 오류, 그리고이 모든 어려운 있어요.
>> 그래.
지금 우리가 화면에 표시하는 것, 그리고 사드 말씀 드렸듯이,
우리가 실행 또는 r을 입력하고 Enter를 누르 때, 우리는 여전히 같은 감금 오류를 얻을.
그럼 GDB를 사용하는 것은 우리의 문제가 해결되지 않습니다.
그러나 우리에게 어려운를 부여하며 밝혀 그이 어려운
가 일어나는 곳 실제로 우리에게 알려줍니다.
이 조금 구문 분석하려면 첫 번째 비트는 모든 잘못이야하는 기능입니다.
가이 __ strcmp_sse4_2은, 그리고 그것이이 파일에 무슨 일이 우리에게 알려줍니다
sysdeps/i386 불리는이, 다시 엉망 종류의 -하지만 선 254.
그런 구문 분석 가지 어렵습니다. 당신은 이런 짓을 볼 때 보통
그 방법은 우리가 시스템 라이브러리 중 하나에 오류있는 독방 감금 있다는 것을 의미합니다.
그럼 뭔가 strcmp와해야 할 일. 당신들은 전에 strcmp를 보았다.
미친 짓,하지만이 strcmp는 strcmp에 문제가 있다는 깨거나 있다는 뜻입니까?
당신은 알렉산더를 어떻게 생각하십니까?
[알렉산더]인가 - 254 선입니까? 그리고 -이 아닌 이진 않지만 자신의 천장 아니라,
다음 각 기능에 대한 다른 언어가 있습니다. - 그건 그 함수에서 254, 또는입니까?
>>이 줄 254입니다. 그것은이.의 파일에있는 것 같은데 아마도이의 어셈블리 코드 때문에.
>> 그러나, 우리가 감금 결함을 늘어 놓던 때문에 더 중요한 문제는, 것 같네요
하고 strcmp 함수에서 올 것 같은데,
이 의미 않으며, 다음, 해당 strcmp가 고장 났어요?
그것은 바라건대, 안돼. 당신은 세분화 결함을 가지고 있으므로해서
시스템 기능 중 하나에서 일반적으로 그것이 당신이 방금 올바르게 호출하지 않은 것을 의미합니다.
무슨 일이 실제로 무슨 일이야 알아내는 제일 빠른 방법
당신이 감금 결함을 볼 때마다이 같은 미친 짓을 볼 때,
당신은 더 이상 단지 기본을 사용하고있는 프로그램이 특히
추적 (backtrace)를 사용하는 것입니다.
나는 전체 추적 (backtrace) 단어 반대로, BT를 작성하여 역 추적을 생략.
그러나 샬롯, 당신은 BT를 입력하고 조회가 입력되면 어떻게 되겠습니까?
[샬롯] 그것은 나에게 두 줄, 줄 0과 1 호선을 보여줍니다.
>> 그래. 그러니까 줄 0과 1 호선.
다음은 프로그램이 작동을 중지했을 때 놀이에 현재 있던 실제 스택 프레임입니다.
맨 위 프레임, 프레임 0에서 시작하고, 프레임 1있는 가장 아래로 이동.
우리 최상위 프레임은 strcmp 프레임입니다.
당신이에 우리가 포인터와 퀴즈에서 뭘했는데 그 문제에와 유사한 생각할 수
어디에서 우리는 주요 스택 프레임의 상단에 스택 프레임을 교환 한
우리는 스왑 주요 사용하던 변수의 상단에 사용하던 변수를했다.
다음은 충돌은 우리의 주요 기능에 의해 호출 된 우리 strcmp 함수에 일
및 추적 (backtrace) 우리에게 일들이 실패하는 기능뿐만 아니라 제공되며,
모든 것이에서 호출 된 곳뿐만 아니라 우리를 말하고 있어요.
나는 오른쪽으로 조금 더 이상 스크롤면
우리는 예, 우리가이 strcmp - sse4.s 파일의 라인 254에 있다고 볼 수 있습니다.
그러나 전화가 buggy1.c, 선 6되었다.
우리는 확인하고, 무슨 일이 있었는지 보러 수있다 - 우리가 할 수있는 것을 의미하므로
buggy1.c 줄 6 개.
다시 말하지만,이 작업을 수행 할 수있는 몇 가지 방법이 있습니다. 하나는 GDB에서 종료하는 것입니다
또는 코드가 다른 창 및 상호 참조에서 열 수 있습니다.
이제 근무 시간에 있으면 때문에 자체의 아주 편리합니다
그리고 당신은 감금 결함이있어 모든이 밝아 위치에 TF가 궁금해
당신은 "아, 6 호선 말할 수 있습니다. 내 말은, 무슨 일이 일어나고 있었는지 몰랐어
하지만 6 호선에 대해 뭔가 내 프로그램이 부러 원인이다. "
할 수있는 다른 방법은 GDB에서 목록이라는 명령을 사용할 수 있습니다.
당신은 또한 리터로 생략 할 수 있습니다.
우리가 나도 친다면 그럼, 우리가 여기서 무슨 일을 어떻게해야합니까?
우리는 이상한 물건을 왕창를.
이것은 실제 어셈블리 코드입니다
그 strcmp_sse4_2에 있습니다.
이것은 펑키의 종류를 보인다
그리고 우리가이 발생하는 이유는 지금 당장 때문입니다
GDB는 프레임 0에서 우리가 있습니다.
>> 그럼 언제 우리가 볼 변수에서, 우리는 소스 코드를보고 어떤 시간,
우리는 스택 프레임에 관련된 우리가 들어 현재 걸 소스 코드를보고
따라서 의미있는 뭔가를하기 위해, 우리는해야
더 많은 의미가 스택 프레임으로 이동합니다.
이 경우, 주 스택 프레임은 좀 더 나을 거
그 사실은 우리가 신조 때문입니다.
하지 strcmp 코드입니다.
우리가 두 가지고 있기 때문에,이 경우에는, 프레임 사이를 이동 할 수있는 방법
우리는 0과 1이
당신은 위 아래 명령으로 그 해.
한 프레임을 위로 이동하는 경우
지금은 기본 스택 프레임에있어.
내가있는 곳으로 돌아가 아래로 이동할 수 있습니다
다시 가서 다시 내려 가고, 다시 이동합니다.
지금까지 GDB에서 프로그램을 할 경우에는 충돌이 발생하게됩니다, 당신은 역 추적을
당신은 당신이 무슨 일이 일어나고 있는지 알지 못하는 일부 파일에 것을 볼 수 있습니다.
당신이 목록을보십시오 코드는 당신에게 잘 보이지 않는다
귀하의 프레임에서 살펴보고 당신이 어디에 알아 봅시다.
당신이 잘못 스택 프레임에있을 거예요.
적어도 당신이 정말로 디버깅 할 수있는 사람이 아니 스택 프레임에 있어요.
이제 우리는 적절한 스택 프레임에 있으니, 우리는 메인에 있어요
지금 우리는 선이 뭔지 알아 내려고 목록 명령을 사용할 수 있습니다.
그리고 당신은 그것을 볼 수 있으며 바로 여기에 우리를 출력한다.
그러나 우리는 모두 같은 목록을 공격 할 수 있으며, 목록은 우리에게 좋은 출력을 제공합니다
여기에 무슨 일 실제 소스 코드.
>> 특히, 우리는 6 호선 볼 수 있습니다.
우리는 여기서 무슨 일이 일어나고 있는지 볼 수 있습니다.
우리는 문자열 비교를하고 있는거야 것 같아
문자열 "CS50 바위"와 argv가 사이 [1].
이것에 대해 뭔가가 충돌했습니다.
미시 그래서, 여기 무슨 일이 될 수에 대한 생각을해야합니까?
[미시]가 의식을 잃고있어 이유를 모르겠어요. 이 충돌 왜 >> 당신은 몰라요?
지미, 어떤 생각?
[지미] 나는 잘 모르겠어요,하지만 우리가 문자열을 마지막으로 사용한 시간 비교
또는 strcmp, 우리는 그 아래 세 가지 다른 사건들처럼했다.
우리는 ==이 없었, 바로 그 첫 번째 줄에, 생각하지 마.
대신, 3으로 나누어, 하나는 == 0였습니다
하나는 <0, 내 생각 엔, 그리고 하나였다> 0.
그런 식으로 아마 뭔가? >> 그래. 그래서이 문제가
의 우리는 올바르게 비교하는거야?
스텔라? 어떤 생각?
[스텔라] 내가 모르겠어. >> 확실하지. 다니엘? 생각? 좋아요.
우리가 프로그램을 실행할 때 무슨 권리로 여기 무슨 일 것은 밝혀
당신이 처음 프로그램 다니엘을했을 때 우리는, 감금 잘못을 가지고
당신이 어떤 명령 줄 인수를 줬나요?
[다니엘] 번호 >> 번호 이 경우 변수는 argv의 값이 무엇 [1]?주세요
>> 더 값이 없습니다. >>이 맞아.
음, 적절한 문자열 값이 없습니다.
그러나 어떤 값이 있습니다. 거기에 저장됩니다 값은 무엇입니까?
>> 쓰레기 값? 그것은이 경우에는 쓰레기 값이 아니면 >>
변수는 argv 배열의 끝은 항상 널 (null)로 종료됩니다.
그래서 실제로에 저장 했어요은 널 (null)이 있습니다.
다른 방법은, 오히려 그것을 통해 생각보다 이러한 문제를 해결하기 위해
을 출력하는 것입니다.
내 말은, GDB를 사용하여 좋은 것을 말한 곳입니다
당신이 원하는 당신은 모든 변수를 인쇄 할 수 있기 때문에, 모든 값
이 편리한 - 멋쟁이 p 명령을 사용합니다.
나는 P를 입력하면 그래서 나는 변수 또는 변수의 이름의 값을 입력
, argc을 말하면, 내가 argc는 1 것을 볼 수 있습니다.
나는 변수는 argv를 인쇄하려면 [0], 그냥 그런 식으로 할 수 있습니다.
그리고 우리가 본 것처럼, 변수는 argv [0] 항상 프로그램의 이름입니다,
항상 실행 파일의 이름입니다.
여기가 전체 경로 이름을 가지고 참조하십시오.
또 인쇄 할 수 있습니다 argv가 [1] 무슨 일이 일어나는지를 참조하십시오.주세요
>> 여기 신비로운 가치의 종류를 가지고.
우리는이 0x0 있어요.
우리가 16 진수에 대해 얘기 학기의 시작 부분에서 기억 나?
또는 헥스에 50를 나타냅니다하는 방법에 대한 pset 0 말에 그 작은 질문?
우리가 CS의 진수 숫자를 쓸 방법은 그냥 우리 자신을 혼동하지하는
소수점 숫자로, 우리는 항상 0x로를 접두사입니다.
그래서이 0x 접두사는 항상, 16 진수로 다음과 같은 숫자를 해석 의미
아닌 문자열로가 아닌 10 진수로가 아닌 이진수 있습니다.
숫자 5-0는 16 진수로 유효한 숫자 때문입니다.
그리고 진수, 50의 숫자입니다.
그래서 우리가 disambiguate 단지 방법입니다.
따라서도 공 십진수입니다 0x0 수단 진수 0,, 이진 0.
단지 값 0입니다.
그것은이가 null가 메모리에, 사실은 무엇인지 밝혀졌다.
널은 0입니다.
여기 요소는 [1]가 null이 변수는 argv에 저장됩니다.
그래서 우리는 널 (null) 문자열로 우리의 "CS50 바위"문자열을 비교하는 중입니다.
따라서 null을 dereferencing, 널에서 물건을 액세스하려고,
이러한은 일반적으로 세그먼트 오류 또는 발생할 수있는 다른 나쁜 일이 어떤 종류의 원인이 갈 수 있습니다.
그리고 strcmp는 확인하지 않습니다 판명
당신은 null이 있어요 값에 통과 한 여부.
오히려, 그냥 앞서가는, 그 일을하려고
이 오류를 감금되면, 그 결함을 감금하고, 귀하의 문제 야. 당신은 문제를 해결 가야 해.
정말 빠르게, 우리는이 문제를 어떻게 해결할까요? 샬롯?
[샬롯] 당신은 경우에 사용 확인할 수 있습니다.
그래서, 만약 변수는 argv [1] Null입니다, == 0, 다음 1을 반환, 또는 무언가 불륜].
>> 그래. 그럼 우리가 확인할 수 있습니다으로 할 수있는 멋진 방법
우리가 strcmp을 통과 할 겁니다 값은 변수는 argv [1]은 null입니다?
그게 널 (null) 경우, 우리는 중지를 알았다고 할 수 있습니다.
>> 이 작업을 수행하는보다 일반적인 방법은 argc 값을 사용하는 것입니다.
당신은, 메인의 시작 부분에서 바로 볼 수
우리는 우리가 명령 줄 인수를 사용할 때 우리가 일반적으로 수행하는 첫 번째 테스트를 생략
이는 우리 argc 값이 우리가 기대하는 게 뭔지 여부를 테스트하는 것입니다.
이 경우, 우리는 적어도 두 개의 인수를 기대하는
프로그램의 이름을 더하기 다른 사람.
우리는 여기에 두 번째 인수를 사용하려는거야.
그럼 우리 strcmp 전화하기 전에 미리 테스트의 일종을 갖는
변수는 argv은 적어도 2할지 여부를 그 시험도 일 이와 같은 작업을 수행합니다.
그 프로그램을 다시 실행하여 작동하는지 우리는 볼 수 있습니다.
당신은 언제나 정말 좋은 GDB, 내 프로그램을 다시 시작할 수 있습니다.
, 당신은 실행할 수 있으며, 귀하의 프로그램에 인수로 전달할 때
당신은 GDB를 부팅 할 때, 귀하가 실행 한 호출 할 때 전달한 없습니다.
이렇게하면 다른 인수와 함께 때마다 프로그램을 호출 할 수 있습니다.
따라서 실행하거나 다시, 나는 r을 입력 할 수 있으며, 우리가 입력하면 어떤 '안녕하세요'어떻게 볼까 있어요.
다시 처음부터 그것을 시작하려는 경우 그것은 항상 당신을 물어볼 것입니다.
보통, 당신은 처음부터 다시 그것을 시작하고 싶어.
그리고이 시점에서, 그것은 다시 시작은 다시, 그것은 출력
우리가 인수 인사 만하고, buggy1를 실행하고있는 프로그램
그리고이 표준 아웃을 인쇄, 그것은 슬픈 얼굴을 "당신은 D를"말한다.
그러나 우리는 잘못을 감금 없습니다. 이 과정이 정상적으로 종료했다.
그래서 아주 잘 보입니다.
더 이상 감금 결함, 우리는이 과거하지
그 실제로 우리가 점점 있다고 감금 결함 버그처럼 있으므로 같습니다.
불행하게도, 우리가 D.을 받고있는 걸 알 수
>> 우리는 돌아가서 코드를보고 거기에 무슨 일이 있었는지 확인할 수 있습니다
어떻게 된 건지 알아 냈어합니다 - 우리가 D.도했다는 이유
이 printf 당신이 D.도한다는 봅시다, 여기를했습니다
우리가 목록을 입력하면 입력 목록을 삭제하지 않는 한, 그것은 당신의 프로그램을 통해 다운 반복 유지
그래서 귀하의 프로그램의 처음 몇 줄을 표시됩니다.
그런 다음 당신에게 몇 라인, 다음 청크와 다음 덩어리가 표시됩니다.
그리고 내려 노력하겠습니다.
그리고 지금 우리는 "숫자 16 범위를 벗어 줄을."할 게요
이 15 라인이 때문입니다.
이 지점에 도착하고는 "내가 무엇을해야합니까?"궁금해하는 경우 당신은 도움말 명령을 사용할 수 있습니다.
도움이 다음에게 명령의 이름을 사용합니다.
그리고 당신은 GDB이 우리에게 일들이 모든 종류를 제공합니다 참조하십시오.
그것은 "아니오 인수를 통해 이전 목록 다음 또는 주변의 10 년은 더 행을 나열 말합니다.
목록 - 전에 10 라인을 보여줍니다 - "
그러니 목록 마이너스를 사용하여 봅시다.
그리고 그 10 라인 이전 목록, 당​​신은 목록을 조금 주변을 재생할 수 있습니다.
당신은 목록, 목록을 할 수 - 당신은 심지어, 목록 8과 같이 나열에게 번호를 부여 할 수 있습니다
그리고 8 호선 주변에 10 줄을 표시됩니다.
이 경우 다른 간단한이있어 그리고 당신은 무슨 일이 일어나고 있는지 볼 수 있습니다.
당신은 CS50 바위에 입력하면 "당신은 A.를"출력
그렇지 않으면 "당신은 D.를"출력
부랑자 마을. 괜찮아요. 그래?
>> [다니엘] 그래서 따옴표를 쓰지 않고 CS50 돌을 다하고하려고 할 때,
는 "당신은 D.를"라는
나는 작동하도록하는 따옴표가 필요, 이유는?
>> 그래. 그것은 밝혀 그 때 -이 또 다른 재미를 조금 재미있는 이야기입니다 -
우리가 그것을 실행하는 경우이 프로그램을 실행하고 우리가 CS50 바위에 입력 할 때,
처럼 다니엘은 그가 한 말했듯이, 당신은 Enter 키를 누르
그것은 여전히​​ 우리가 D.를 말한다
그리고 질문은, 왜이 있습니다?
그리고 우리의 터미널과 GDB 모두이 두 개의 인자를 구문 분석을 이용할 수 있습니다.
로 숨겨져있는 공간이,이 때 때문에
첫 번째 인자는 끝, 다음 인수는 시작됐다.
둘 다 사람들을 결합 할 수있는 방법, 또는 해요, 인수로,
따옴표를 사용하는 것입니다.
우리가 따옴표를 다시 실행하면 이제, 우리는 A.을
그냥 요점을 되풀이하기 위해 따옴표, CS50 바위는 두 별도의 인자로 해석되지 않습니다.
따옴표로, 그것은 모두 하나의 인자로 파싱있어.
>> 우리는 중단 점을이을 볼 수 있습니다.
지금까지 우리는 우리의 프로그램을 실행 봤는데, 그것은 실행 된
하나는 결함이나 히트에게 오류를 감금까지
하거나 종료하고 모든 완전히 괜찮을 때까지.
때때로 때문, 반드시 가장 유용한 것은 아닙니다
귀하의 프로그램에 오류가 있지만 분류 결함의 원인이 없어.
당신 멈출 프로그램이나 그 비슷한 범죄를 일으키지 않아.
프로그램이 특정 시점에서 일시 중지 GDB를 얻을 수 방법
중단 점을 설정하는 것입니다.
여러분은 함수 이름에 중단 점을 설정하여이 작업을 수행 할 수 있습니다
또는 코드의 특정 줄에 중단 점을 설정할 수 있습니다.
기억하기 쉬운 - 때문에, 함수 이름에 중단 점을 설정하려면
당신이 실제로에 가서 약간의 백업 소스 코드를 변경하는 경우,
다음 정지 점은 실제로 당신의 코드 내에서 같은 장소에서 남아있을 것입니다.
반면에 당신은 줄 번호를 사용하고, 줄 번호가 변경하는 경우
당신은 몇 가지 코드를 추가하거나 삭제할 때문에, 다음 중단 점은 모두 망쳐 있습니다.
제가 가장 일반적인 것들 중 하나는 main () 함수에 중단 점을 설정합니다.
자주 GDB를 부팅거야, Enter 키를 누르, B 주를 입력거야, 그리고 그 중단 점을 설정합니다
단지라는 기본 기능에, "가능한 빨리 실행을 시작으로 프로그램을 일시 중지"
그 방법으로, 나는 같이 CS50 바위, 말과 내 프로그램을 실행 두 개의 인수
그리고 Enter 키를,이 main () 함수에 도달하고 바로 첫 줄에서 중지
그것은 strcmp 기능을 평가 직전에.
>> I가 일시 중지되어 있기 때문에, 지금은 주변 청소 하는건 및 무슨보고를 시작할 수 있습니다
내 프로그램으로 전달되는 다른 모든 변수가 있습니다.
난 여기 argc를 인쇄 무슨 일이 일어나고 있는지 볼 수 있습니다.
그 안에 3 개의 값을 가지고 있기 때문에 argc의이 3 것을 볼 수 있습니다.
이것은 프로그램의 이름을 가지고, 그것은 첫 번째 인수와 두 번째 인수 있어요.
우리는 argv가보고들을 인쇄 할 수 있습니다 [0], argv가 [1], 그리고 변수는 argv [2].
이 strcmp 통화 실패 할 것이다 그래서 지금 당신은 또한 볼 수 있습니다
당신은 두 개의 별도의 인수로 CS50과 바위를 분할 않았다는 걸 알 때문입니다.
당신은 중단 점을 치 한 후이 시점에서, 당신은 프로그램을 통해 단계로 계속
선으로 선으로 다시 프로그램을 시작하기에 반대했다.
다시하고 당신의 프로그램을 시작하지 않으려면 그럼, 여기에서의 계속
당신은 계속 명령을 사용할 수 있으며 계속은 끝으로 프로그램을 실행합니다.
그냥 여기 그랬던 것처럼.
나는 프로그램 CS50 바위를 다시 시작하는 경우에는, 그것은 다시 내 중단 점에 도달
이 시간은, 경우, 프로그램의 나머지 부분을 통해 모든 방법을 그냥 가고 싶지 않아
나는 또한 N과 생략 다음 명령을 사용할 수 있습니다.
그리고이 줄하여 프로그램 라인을 통해 단계 것입니다.
일 실행으로 그래서 당신은 일 업데이트받을으로 같은 변수의 변화를 볼 수 있습니다.
어떤 아주 좋은 것입니다.
다른 좋은 점은, 오히려 다시 이상 이상 이상 같은 명령을 반복보다입니다
방금 입력을 친다면 - 그럼 당신은 내가 아무 것도 입력하지 않았어요 -
난 그냥 Enter 키를한다면, 그것은, 이전 명령을 반복합니다
또는 이전 GDB 명령은 I가 들어 넣은
나는 Enter를 누를 유지할 수 있으며 선으로 내 코드 라인을 통해 스테핑하겠습니다.
나는 너희들이 다른 버그 프로그램을뿐만 아니라 체크 아웃 할 것을 권장합니다.
우리는 모두 오늘 섹션에 통과 할 시간이 없습니다.
소스 코드가, 그래서 당신은 무슨 일이 볼의 종류 수
당신이 정말 곤란한 상황에 처하더라도 장면 뒤에,
하지만 적어도, 그냥, GDB를 부팅 연습
당신에 깨진 때까지 프로그램을 실행
, 역 추적을 받고 추락에 있던 기능을하는지 알아 냈어
어떤 라인이 어떤 변수 값을 인쇄에했다
그런 일이 실제로 당신이 앞으로 도움이 될 것입니다 때문에 너무 당신은 그것을위한 느낌을 얻을.
이 시점에서, 우리는 당신이 Q를 종료 사용하거나 않는, GDB에서 종료거야.
프로그램이 아직 실행의 중간에,하고 종료되지 않은 경우는,
항상 당신을 물어볼 것입니다, "당신은 당신이 정말로 종료 하시겠습니까?"
당신은 예 누르 할 수 있습니다.
>> 이제 우리는 고양이 프로그램입니다 우리가 가지고있는 다음 문제 보는거야.
당신이 리디렉션 및 파이프에 대한 짧은를 볼 경우, 토미이 프로그램을 사용하는 것을 확인할 수 있습니다
그 기본적으로 화면에 파일의 출력을 인쇄합니다.
나는 고양이를 실행하면,이 어플라이언스에 실제로 내장 된 프로그램입니다,
당신이 맥이 경우 터미널을 열고면 당신은 너무 당신의 Mac에서이 작업을 수행 할 수 있습니다.
그리고 우리가 - 고양이가, cp.c의 말을 듣지하고 Enter 키를.
이 무슨 짓을했는지, 우리가 좀 더 빨리 스크롤하고 우리가 선을 뛰어 위치를 확인하는 경우
또는 우리가 고양이 명령을 실행 곳, 그건 말 그대로 우리의 화면으로 cp.c의 내용을 출력한다.
우리는 다시 실행할 수 있으며 여러 개의 파일에 넣을 수 있습니다.
, 그래서 당신은 고양이 cp.c을 할 수 있으며, 그런 다음 우리는 또한 cat.c 파일을 연결하여 수
그 때문에 우리가 기사를 쓰고 싶은있는 프로그램입니다
그리고 우리의 화면으로 돌아 다시 두 파일을 인쇄 할 수 있습니다.
우리가 조금 위로 스크롤하면 그래서, 우리는 우리가보고 우리는이 고양이 cp.c, cat.c를 실행할 때
처음에는 CP 파일을 출력하고, 그 아래가 바로 여기 cat.c 파일을 출력한다.
우리는 우리의 발은 젖이를 사용하는거야.
터미널로 간단한 인쇄와 주변 재생, 그 작동 방식을 참조하십시오.
너희들이 gedit cat.c을 열고 경우, Enter 키를 누르
당신은 우리가 작성하는 정도 남았하는 프로그램을 볼 수 있습니다.
우리가이 좋은 보일러 판을 포함, 우리 모두가 그 곳을 입력 시간을 할애 할 필요가 없습니다 않도록.
우리는 한번 이용해 전달되는 인자의 수를 확인
우리는 좋은 사용 메시지를 인쇄 할 수 있습니다.
>> 이 다시 같은 우리가 얘기 한 것들입니다
거의 근육 기억 같은 거예요.
그냥 물건 같은 종류의 일을 계속 기억
항상 도움이 어떤 메세지를 인쇄
수 있도록 사람들이 귀하의 프로그램을 실행하는 방법을 알고.
고양이와 함께, 꽤 간단합니다, 우리는 서로 다른 인수를 모두 통과 할거야
그는 우리의 프로그램에 전달했고, 우리는 인쇄 할거야
한 번에 화면 하나에 해당 내용 아웃.
화면에 파일을 인쇄하기 위해, 우리는 매우 유사한 무언가를 할 수있는 것
우리는 퀴즈의 끝 부분에 무슨 짓을합니다.
프로그램을 고용 퀴즈의 끝에서, 우리는 파일을 열어 줄 수밖에 없었어
그리고 우리는 그것에 인쇄했다.
이 경우, 우리는 파일을 열거야, 우리는 대신에서 읽을거야.
그럼 우리 대신 파일을 인쇄 할거야, 우리는 화면에 인쇄 할거야.
그래서 당신은 모든 printf를하기 전에 한 화면에 인쇄합니다.
그래서 그런 미친 짓 없습니다.
그러나 파일을 읽는 것은 좀 이상합니다.
우리는 시간에 그 조금을 통해 갈거야.
당신들 퀴즈, 문제 33,에 마지막 문제로 돌아 가면
우리가 여기서 뭘하고있는 첫 번째 줄은 파일을 여는, 우리가 한 짓과 매우 유사합니다.
스텔라 그럼, 우리가 파일을 열 때처럼 그 선 보이지 않아?
[스텔라] 자본금 파일 * 파일 - >> 좋아요. >> - fopen 동일합니다. >> 그래.
이 경우에는 뭐죠? 이 코멘트에 있어요.
>>이 코멘트에? 변수는 argv [I]와 R?
정확히 >>. 맞아. 그럼 스텔라 완전히 맞아.
이 줄은 모습입니다.
우리는 파일 스트림 변수를 FILE *에 보관하려고, 그래서하는 모든 모자,
FILE *,이 변수의 이름은 파일이됩니다.
우리는 우리가 좋아하는대로 부르 수 있습니다. 우리는 우리가 원하는대로, 그 first_file, 또는 file_i 전화 수 있습니다.
그리고 파일의 이름은이 프로그램의 명령 줄에서 통과되었다.
따라서이 변수는 argv에 저장 [I,] 그리고 우리가 읽을 모드에서이 파일을 열거야.
우리가 파일을 열으니 이젠, 어떻게 우리가 늘 기억해야하는 일이야
우리는 파일을 열었습니다 때마다? 를 닫습니다.
미시 그래서 어떻게 파일을 닫습니다합니까?
[미시] fclose (파일) >> fclose (파일). 그렇지.
좋아요. 좋아요. 우리는 여기에 코멘트를 할이 만난다면
는 "오픈 변수는 argv [I]와 STDOUT 그 내용을 인쇄 할 수 있습니다."라고
>> 표준 출력은 이상한 이름입니다. STDOUT 말의 우리의 방법이다
우리는 터미널에 인쇄 할, 우리는 표준 출력 스트림에 인쇄하고 싶습니다.
우리는 실제로 여기이 댓글을 삭제 할 수 있습니다.
난 복사하고 우리가 한 짓 이니까 붙여 넣기거야.
이 시점에서, 이제 우리는 비트하여 파일 비트를 읽을 수 있습니다.
우리는 독서 파일의 몇 가지 방법에 대해 논의했습니다.
어떤 사람은 지금까지 즐겨 찾기입니까?
어떤 방법으로 당신이 본 또는 파일을 읽을 수있는 거, 기억 나?
[다니엘] fread? >> fread? 따라서 fread는 하나입니다. 지미, 당신은 어떤 다른 사람을 알 수 있습니까?
[지미] 번호 >> 좋아요. 아뇨. 샬롯? 알렉산더? 다른 놈들은? 좋아요.
그래서 다른 사람들은 많이를 사용하는 하나의 fgetc되어 있습니다.
또한, fscanf도, 너희들은 여기에 패턴을 보여?
그들은 모두 F로 시작합니다. 파일과는 아무.
fread는 fgetc, fscanf있다. 이것들은 읽기 기능에 있습니다.
우리가 fwrite를 쓰기 위해 대신 fgetc의 fputc 있습니다.
우리는 또한 fprintf 우리가 퀴즈에서 본 좋아했다.
이 파일에서 읽는 관련된 문제이며, 때문에
우리는 이러한 세 가지 기능 중 하나를 사용하려고하고 있습니다.
우리는 여기서 이러한 기능을 사용하지 않을거야.
이러한 기능은 모든 표준 I / O 라이브러리에 발견된다.
이 프로그램의 상단에있는 이봐, 그렇게하는 경우
당신은 우리가 이미 표준 I / O 라이브러리에 대한 헤더 파일을 포함 것을 볼 수 있습니다.
우리가 알고 싶다면 어떤 우리가 사용하려는
우리는 항상 그 사람 페이지를 열 수 있습니다.
그래서 우리는 사람을 stdio를 입력 할 수 있습니다
와 C.에서 stdio 입력 및 출력 기능에 대해 모두 읽었
그리고 우리는 이미 오, 봐 볼 수 있습니다. 그것은 fgetc를 언급, 그렇지 fputc를 언급 있어요.
그래서 fgetc는 조금 자세히 보면, 말할 수
와 맨 페이지를 봐.
당신은 다른 기능의 전체 무리와 함께가는 것을 알 수 있습니다 :
fgetc, fgets, getc, getchar, 도착, ungetc, 그리고 문자와 문자열의 입력.
그래서 우리가 표준 입력으로부터 파일에서 문자와 문자열에서 읽을 방법입니다
이는 사용자의 근본적이다.
그리고 우리는 실제 C.에서 어떻게입니다
그래서이 GetString 및 GetChar 함수를 사용하지 않습니다
우리는 CS50 라이브러리에서 사용했던.
우리는 몇 가지 방법으로이 문제를 할 수있는 것
수 있도록 당신은 그 일을 두 가지 방법을 볼 수 있습니다.
fread 다니엘이 말한 기능과 fgetc 모두 그렇게하는 것은 좋은 방법입니다.
그것은 단지 있기 때문에 당신이보다시피 나는,,, fgetc을 좀 더 쉽게 생각
하나의 인수, 우리는 문자를에서 읽기 위해 노력하고있는 파일 *
와 반환 값은 정수입니다.
그리고 바로 좀 혼란?
>> 우리는 문자를 받고 있기 때문에, 왜이 반환에게 문자, 그렇지?
당신들은이 문자를 반환하지 이유에 어떤 아이디어가?
[미시 답변, 이해할 수없는] >> 그래. 따라서 미시 완전히 맞아.
이 ASCII이라면,이 정수는 실제 문자에 매핑 될 수 있습니다.
ASCII 문자이어야하며 맞아 없습니다.
그게 정확히 무슨 일이 일어나고 있는지입니다.
더 비트가 단순히 때문에 정수를 사용하고 있습니다.
우리의 문자는 8 비트가, 우리의 32 비트 컴퓨터에서 1 바이트 그, 그것은 문자보다 크 잖아.
그리고 int는 공간의 모든 4 바이트 '가치가 있습니다.
그리고 방법은 fgetc가 작동 밝혀,
우리는이 사람이 페이지를 조금 우리의 개요에 아래로 스크롤하면
모든 방법을 아래로 스크롤합니다. 그 사람들이 EOF라는이 특별한 값을 사용하는 것이 밝혀졌다.
이 fgetc 함수의 리턴 값으로 특별한 상수입니다
당신은 파일의 끝을 누르거나 오류가 발생하는 경우. 때마다
그리고, 제대로 EOF과 함께 비교를 할 것이 밝혀
당신은 정수에 갖고있는 정보의 추가 금액을 갖고 싶어
같은 문자 변수를 사용하여 반대했다.
fgetc 효과적으로, 파일에서 문자를 받고있다하더라도
당신은 당신에게 유형 INT의 뭔가를 반환하는지 기억하고 싶습니다.
그게 사용하기 매우 쉽게했다.
우리에게 문자를 포기할 것, 그래서 우리가해야 할 모든 파일을 물어 보는 있으며,
"나에게 다음 문자를주고, 나에게 다음 문자를주고, 나에게 다음 문자를 줘"
우리는 파일의 끝에까지.
그리고, 우리의 파일에서 한 번에 한 문자를 가져옵니다
그리고 우리는 그것으로 원하는대로 할 수 있습니다.
우리는을 저장할 수 있습니다, 우리는 문자열에 추가 할 수 있습니다 우리는 그것을 인쇄 할 수 있습니다.
그 중 하나를 수행합니다.
>> 아웃 다시 확대하고 cat.c 프로그램으로 돌아 간다,
우리는 fgetc를 사용 간다면,
어떻게이 코드 다음 줄에 접근 할 수?
우리는 사용하는 것 - fread이 약간 다른 것을 할 것입니다.
그리고 이번에는, 우리는 한 번에 하나의 문자를 얻을 fgetc를 사용하려고하고 있습니다.
전체 파일을 처리하기 위해, 우리는해야할까요?
저기 파일에 몇 자입니까?
많이 있습니다. 그래서 당신은 아마도 하나 사야
그리고 또 다른을 다른을 다른을.
우리가 여기 사용해야 할 수도 있습니다 알고리즘의 어떤 것 같아요?
어떤 유형의 -? 루프 [알렉산더]? 정확히 >>.
루프의 일부 유형입니다.
루프는이 경우에, 실제로 큰 것입니다.
당신은 전체 파일을 통해 루프를 원하는 것처럼 당신이 말하는 것 같은, 이건 소리
한 번에 문자를 받고.
같이 무엇인지에 대한 방법은?
[알렉산더 이해할 수없는]
>> 알았어요, 당신이 무엇을하려는 지 영어로 말해? [알렉산더 이해할 수없는]
우리가 전체 파일 이상 반복하는 것처럼 그래서이 경우에는, 듣기.
[알렉산더] 그래서 <정수의 크기? >>의 크기 -?
난, 파일의 크기를 알아? 크기 - 꼭 그냥 이렇게 써주세요.
시간에 파일의 크기가되는, 내가 + +.
그래서, 당신이 fgetc를 사용하고 않는 방법이 새로운 것이 밝혀
단지 파일의 크기를 얻을 수 더 쉬운 방법이 없다는 것입니다
당신은 전에 본 적이있는 구성의 "sizeof"유형.
우리가 fgetc 함수를 사용하면, 우리는 어떤 종류의를 소개하고
루프이에 새로운, 펑키 구문, 어디 대신 기본 카운터를 사용
문자로 문자를 이동, 우리는 한 번에 하나의 문자를 끌어가는거야
한번에 문자, 그리고 우리가 알고있는 방법은 우리 말에있어
우리가 문자의 특정 숫자를 계산 한하지 않는 경우는,
하지만 우리가 뽑아 문자 파일 캐릭터의 특별한 끝 때.
이 채널에 연락, 우리는 그것을 초기화 할거야 - 그래서 우리는하여이 작업을 수행 할 수 있습니다
파일의 아웃 첫 번째 문자를 얻을 수 첫 호출.
바로이 부​​분 그래서이 파일의 캐릭터를 데리고 것입니다
그리고 변수 채널에 저장합니다.
우리가 파일의 끝에 얻을 때까지 우리는이 일을 계속 할거야
하는 우리는 특별한 EOF 문자와 동일 게 아니라 문자에 대한 테스트에 의해서.
대신 채널을 다하고을 그리고 + +, 그, 그냥 값을 증가 것
우리는 파일의 아웃, A는 말 자본을 읽고, 그렇게하는 경우
채널 + + 우리에게 B를 제공하게하고 우리가 C하고 D 겠어요.
우리가 원하는 분명 아닙니다. 우리가 여기 원하는
이 마지막 비트에서 우리는 파일에서 다음 문자를 얻고 자 할 수 있습니다.
>> 그럼 우리는 파일에서 다음 문자를할까요?
우리가 어떻게 파일에서 첫 번째 문자를 어떻게해야합니까?
[학생] fgetfile? >> fgetc, 또는, 미안, 당신은 완전히 옳았다.
바로 거기에 맞춤법이 틀린. 그래 그럼.
여기에 대신 채널을하는 + +,
우리는 다시 fgetc를 (파일)를 호출 할거야
와 같은 채널 변수에 결과를 저장합니다.
[학생 질문 이해할 수없는]
이러한 파일 *의 사람들이 특별한 위치 >>입니다.
그들이 작동하는 방법은 있습니다 - 당신이 처음 열 때 - 당신이 먼저 fopen 호출을 할 때,
FILE *는 효과적으로 파일의 시작 부분에 포인터 역할을합니다.
다음 fgetc 전화 때마다,이 파일을 통해 한 문자 이동합니다.
이 전화를 자 할 때마다, 당신은 문자로 파일 포인터를 증가하고 있습니다.
그리고 다시 fgetc 때, 당신이 다른 문자를 이동
다른 문자와 다른 문자와 다른 문자가 있습니다.
[학생 질문 이해할 수없는] >> 그리고 도대체 - 예.
그것은 후드 아래에 마법입니다.
당신은을 통해 증가 유지.
이 시점에서, 당신은 실제로 문자로 일을 할 수있게되었습니다.
그럼 이제, 화면에이 일을 인쇄 할 수?
우리는 우리가 전에 사용했던 printf 일을 사용할 수 있습니다.
우리는 모든 학기를 사용 했어.
우리는 printf 호출 할 수 있습니다
우리는 그 같은 캐릭터 전달할 수 있습니다.
할 수있는 또 다른 방법은 오히려 printf 사용하고이 형식 문자열을 필요 미만인
우리는 또한 다른 기능 중 하나를 사용할 수 있습니다.
우리는 화면에 문자를 출력 fputc를 사용할 수 있습니다
우리는 fputc 보면 제외하고는 - 내가 조금 축소 보자.
우리는 어떤 좋은 건 우리가 fgetc를 사용하여 읽기하는 캐릭터 소요됩니다 참조
하지만 우리는 그것을에 인쇄 할 수있는 스트림을 제공해야합니다.
우리는 또한 표준 출력에 직접하게됩니다 putchar 함수를 사용할 수 있습니다.
그래서 우리는 인쇄에 사용할 수있는 다양한 옵션의 전체 무리가 있습니다.
그들은 표준 I / O 라이브러리의 잖아요.
인쇄 할 때마다 - 그래서 printf 기본적으로, 스트림 아웃 특별한 표준을 출력합니다
그 STDOUT이되는 것입니다.
그래서 그냥이 마법 가치, 여기에 STDOUT 종류로 참조 할 수 있습니다.
죄송합니다. 외부 세미콜론을 놔.
>> 여긴 새로운 펑키 많은 정보입니다.
이 많은이 코드이라는 관점에 입각하면 매우 관용어 법입니다
이 읽기 쉽게 읽을 수 깨끗해서 이런 식으로 작성하게된다.
그렇게하는 방법에는 여러 가지, 당신이 사용할 수있는 다른 기능이 있습니다
하지만 우리는 계속해서이 같은 패턴을 따라하는 경향이 있습니다.
다시 다시오고 같은 코드를 보면 놀라지하지 않습니다.
괜찮아요. 이 시점에서, 우리는 하루에 깨해야합니다.
와 주셔서 감사합니다. 사용자가 온라인이라면 시청 해 주​​셔서 감사합니다. 그리고 우리는 다음 주에 볼 수 있습니다.
[CS50.TV]