いいえ、ディスクが 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;
}
その出力は次のとおりです。
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 % 18)) == 0)
次のようなものを好みます。
if ((sector = (sector + 1) % 18)) == 0)
しかし、正しい値が得られれば問題ありません。ただし、実行している環境で正しい値が得られることを確認する必要があります。私のバージョンの でそれが行われるという事実は、あなたの場合になるという意味ではありません。gcc
または、上記で定義されている提案されたフォームを使用することもできます。
あなたが持っている障害点は、ヘッドまたはシリンダー間の切り替えの近くにないため、ラッピングの問題ではないと思いますが、可能であれば環境の値を出力する必要があります.
「第 4 セクターを超えて読めない」と言うとき、それが何を意味するのかを正確に指定する必要がありますか? マシンがフリーズしたり、ディスク エラーが発生したり、ゴミと思われるものを返したりしますか?
ディスクが正しくフォーマットされていないか、ディスクに障害がある可能性があります。また、期待するデータがそこにない可能性もあります。フロッピーを DOS/Windows などでフォーマットし、それがプログラムで何をするかをチェックする価値があるかもしれません。