Nein, vorausgesetzt, Ihre Festplatte ist eine 1,44 M "Floppy" (80 Zylinder, 2 Köpfe/Zylinder, 18 Sektoren/Kopf, 512 Bytes/Sektor), diese Berechnungen sollten in Ordnung sein, wie mit dem folgenden Programm gezeigt:
#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;
}
dessen Ausgang ist:
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
ich bin ein wenig besorgt über die undefinierten Verhalten Natur:
if ((sector = (++sector % 18)) == 0)
Konstrukt, lieber so etwas wie:
if ((sector = (sector + 1) % 18)) == 0)
aber, wenn es die richtigen Werte gibt, sollte es okay sein. Sie müssen jedoch überprüfen, ob Ihnen die richtigen Werte in der Umgebung, in der Sie ausgeführt werden, gibt. Die Tatsache, dass es in meiner Version von gcc
tut bedeutet nicht, dass es in Ihrem Fall wird.
Oder Sie könnten einfach das vorgeschlagene Formular verwenden, über dem definiert ist.
Der Fehlerpunkt, den Sie haben, ist bei weitem nicht die Umschaltung zwischen Köpfen oder Zylindern, also denke ich nicht, dass es ein Wrapping-Problem ist, aber Sie sollten die Werte in Ihrer Umgebung nach Möglichkeit ausdrucken.
Wenn Sie sagen, dass Sie "über den vierten Sektor nicht lesen können", sollten Sie genau angeben was das bedeutet? Friert die Maschine ein, erhalten Sie einen Diskettenfehler, bringt es zurück, was Sie für Unsinn halten?
Es besteht die Möglichkeit, dass der Datenträger nicht korrekt formatiert ist oder dass er fehlerhaft ist, da es auch die Möglichkeit gibt, dass er nicht die Daten enthält, die Sie erwarten. Es kann sich lohnen, eine Diskette mit DOS/Windows/was auch immer zu formatieren und zu überprüfen, was das in Ihrem Programm macht.
Woah! Prä-ANSI C! Es ist eine Weile her, seit ich das gesehen habe ... –
Sehen Sie, ob das erste Codebeispiel in dieser Frage hilft. Er verweist auch darauf, was Sie möglicherweise eine Google-Suche durchführen möchten: http://cboard.cprogramming.com/cplusplus-programming/59310-reading-floppy-disk-sector.html –
@dietrichEpp: scheint angemessen in Anbetracht der Aufgabe zur Hand : D –