아니요, 디스크가 1.44M "플로피"(80 실린더, 2 헤드/실린더, 18 섹터/헤드, 512 바이트/섹터)라고 가정하면 다음 프로그램과 같이 계산할 수 있습니다.
#include <stdio.h>
int main (void) {
int blk, cyl, head, sector;
for (blk = 0; blk <= 18; blk++) {
cyl = ((blk*2)/18)/2;
head = ((blk*2)/18) % 2;
sector = (blk*2) % 18;
printf ("%2d (a) -> %2d %2d %2d", blk, cyl, head, sector);
if ((sector = (++sector % 18)) == 0)
if ((head = (++head % 2)) == 0)
cyl++;
printf (" (b) -> %2d %2d %2d\n", cyl, head, sector);
}
return 0;
}
의 출력은 다음과 같습니다
if ((sector = (++sector % 18)) == 0)
0 :
0 (a) -> 0 0 0 (b) -> 0 0 1
1 (a) -> 0 0 2 (b) -> 0 0 3
2 (a) -> 0 0 4 (b) -> 0 0 5
3 (a) -> 0 0 6 (b) -> 0 0 7
4 (a) -> 0 0 8 (b) -> 0 0 9
5 (a) -> 0 0 10 (b) -> 0 0 11
6 (a) -> 0 0 12 (b) -> 0 0 13
7 (a) -> 0 0 14 (b) -> 0 0 15
8 (a) -> 0 0 16 (b) -> 0 0 17
9 (a) -> 0 1 0 (b) -> 0 1 1
10 (a) -> 0 1 2 (b) -> 0 1 3
11 (a) -> 0 1 4 (b) -> 0 1 5
12 (a) -> 0 1 6 (b) -> 0 1 7
13 (a) -> 0 1 8 (b) -> 0 1 9
14 (a) -> 0 1 10 (b) -> 0 1 11
15 (a) -> 0 1 12 (b) -> 0 1 13
16 (a) -> 0 1 14 (b) -> 0 1 15
17 (a) -> 0 1 16 (b) -> 0 1 17
18 (a) -> 1 0 0 (b) -> 1 0 1
나는의 정의되지 않은 동작이 자연에 대한 작은 걱정 같은 것을 선호
구조는 : 그것은 당신에게 올바른 값을 제공하는 경우
if ((sector = (sector + 1) % 18)) == 0)
하지만, 괜찮아해야합니다. 그러나 은이 실행중인 환경에서 올바른 값인 을 제공하는지 확인해야합니다. 그것이 내 버전 gcc
에서 수행한다는 사실이 그것이 귀하의 경우에 해당된다는 것을 의미하지는 않습니다.
위의 제안 된 양식을 사용하거나 이 인 경우에만 사용할 수 있습니다.
당신이 가진 실패 지점은 헤드 나 실린더 사이의 전환점 근처에 있지 않으므로 랩핑 문제는 아닌 것으로 생각하지만 가능한 경우 사용자 환경의 값을 인쇄해야합니다.
"네 번째 섹터를 읽을 수 없습니다."라고 말하면 정확히을 지정해야합니다. 기계가 멈 춥니 다. 디스크 오류가 발생합니까? 쓰레기라고 생각하는 것을 반환합니까?
디스크가 올바르게 포맷되지 않았거나 결함이있을 가능성이 있습니다. 데이터가 예상대로 표시되지 않을 수도 있습니다. 플로피를 DOS/Windows /로 포맷하고 프로그램에서 무엇을하는지 확인하는 것이 가치가 있습니다.
와! Pre-ANSI C! 내가 그걸 본 이후로 꽤 오래되었습니다 ... –
이 질문의 첫 번째 코드 샘플이 도움이되는지보십시오. 그는 또한 당신이 구글 검색을 할 수 있습니다 무엇을 참조 할 수 있습니다 : http://cboard.cprogramming.com/cplusplus-programming/59310-reading-floppy-disk-sector.html –
@DietrichEpp : 적절한 작업을 감안할 때 적절한 것 같습니다 : D –