2012-04-05 26 views
0

Ich brauche eine Diskette aus einem Pre O Zustand zu lesen, und ich habe eine Funktion zu lesen, aber es kann nicht über den vierten Sektor zu lesen scheint ...Wie liest man Blöcke von einer Diskette mit Sektoren?

void get_block(blk, buf) int blk; char buf[] 
{ 
    int cyl, head, sector; 

    cyl = ((blk*2)/18)/2; 
    head = ((blk*2)/18) % 2; 
    sector = (blk*2) % 18; 

    // Read first sector <<Dies here if blk > 2>> 
    diskr(cyl, head, sector, buf); 

    // Increment 
    if ((sector = (++sector % 18)) == 0) 
     if ((head = (++head % 2)) == 0) 
     cyl++; 

    // Read second sector <<Dies here if blk == 2>> 
    diskr(cyl, head, sector, buf+512); 
} 

Jede Idee, warum? Ändere ich die Blöcke falsch?

+2

Woah! Prä-ANSI C! Es ist eine Weile her, seit ich das gesehen habe ... –

+1

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 –

+0

@dietrichEpp: scheint angemessen in Anbetracht der Aufgabe zur Hand : D –

Antwort

0

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.

+0

"Ich bin ein wenig besorgt über die: Wenn ((Sektor = (++ Sektor% 18)) == 0) Konstrukt" - Sie sollten viel darüber besorgt sein. Auch wenn es ihm und Ihnen heute richtige Werte gibt, wird es morgen nicht sein. Oder wer weiß, vielleicht hat es ihm heute keine richtigen Werte gegeben und vielleicht ist das sein Problem. –

+0

Daher mein Kommentar, um sie zu überprüfen. Ich kann nicht nachsehen, ob das wegen des Fehlens eines Sequenzpunktes undefiniert ist, da es leicht durch die besser lesbare Version (IMNSHO) korrigiert werden kann (ob benötigt oder nicht). Aber ich bin nicht allzu besorgt darüber, dass es morgen nicht funktioniert (auf einem späteren Compiler), da es K & R-artige Nicht-Prototyp-Funktionen verwendet :-) – paxdiablo

+0

OK, ich dachte, es war augenblicklich klar, dass es zwei Aufgaben ohne Sektor gab Sequenzpunkt dazwischen. K & R hat nicht gesagt, welche Aufgabe "gewinnen" würde. –