Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » [HILFE] Programm stürtzt ab

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.09.2004, 11:15 Uhr
~fasmat
Gast


Hi,

Ich brauch eure Hilfe . Ich hab hier eine Funktion geschrieben, die alle Sektoren auf der Diskette (Drive) lesen soll und dann in der Datei image speichern soll. Aber sobald ich das Programm ausführe (compiliert mit DJGPP), hängt sich das Programm mit einem "nicht zulässigen Zugriff" auf.

Hier der Kode:

C++:
int fdrw(int operation, char * image, int drive)
{
        void * buffer;
        FILE * file;
        int status;
        int head;
        int track;

        status = biosdisk(RESET, drive, 0, 0, 0, 0, buffer);

        if(status)
                Error(status);

        if(operation == READ)
        {
                file = fopen(image, "wb");

                for (track = 0; track <= 80; track++)
                        for (head = 0; head <= 1; head++)
                        {
                                biosdisk(READ, drive, head, track, 1, 18, buffer);
                                fwrite(buffer, 512, 18, file);
                        }

                fclose(file);
        }
        else
        {

        }

        return 1; // Success
}


Bitte hilft mir.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.09.2004, 11:25 Uhr
virtual
Sexiest Bit alive
(Operator)


Buffer zeigt nirgendwohin, ist das gewünscht (kenne non ANSI Funktion biosdisk nicht)?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.09.2004, 11:40 Uhr
~fasmat
Gast


Erstmals danke, dass du mir helfen willst .
Hab die Funktion biosdisk von nem Programm namens Helppc. Hier die Beschreibung dazu:


Zitat:

TC: int biosdisk( int cmd, int drive, int head, int track,
int sector, int nsects, void *buffer )

- prototype in bios.h

- issues interrupt 0x13 for BIOS disk operations
- drive = (0=A:, 1=2nd floppy, 0x80=drive 0, 0x81=drive 1
- cmd = 0 reset diskette system (hard disk drive reset)
1 return status of last disk operation, ignore parms
2 read nsects disk sectors, with starting sector
defined by head, track, & sector, reading 512 bytes
per sector into buffer
3 write nsects disk sectors, with starting sector
defined by head, track, & sector, writing 512 bytes
per sector from buffer
4 verify nsects disk sectors, with starting sector
defined by head, track, & sector
5 format a track defined by head & track, where buffer
points to a table of sector headers to be written



Und was meinst du damit, dass buffer nirgendwohin zeigt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.09.2004, 11:53 Uhr
virtual
Sexiest Bit alive
(Operator)


mach mal aus

C++:
void* buffer;


ein

C++:
char buffer[512*18];


bei deinem code ist buffer nämlich einfach ein uninitialisierter zeiger, dem kein seicher zugeordnet ist. das scheint aber erforderlich zu sein.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.09.2004, 11:57 Uhr
~fasmat
Gast


Ich glaub ich hab das Problem gelöst:


C++:
int fdrw(int operation, char * image, int drive)
{
        char * buffer;
        FILE * file;
        int status;
        int head;
        int track;
        
        buffer = (char *)malloc(18 * 512);

        status = biosdisk(RESET, drive, 0, 0, 0, 0, buffer);

        if(status)
                Error(status);

        if(operation == READ)
        {
                file = fopen(image, "wb");

                for (track = 0; track <= 80; track++)
                {
                        for (head = 0; head <= 1; head++)
                        {
                                printf("Track: %d, Head: %d\r", track, head);
                                status = biosdisk(READ, drive, head, track, 1, 18, buffer);

                                if (status)
                                        Error(status);

                                fwrite(buffer, 512, 18, file);
                        }
                }

                fclose(file);
        }
        else
        {

        }

        return 1; // Success
}



Aber ich hab ein neues Problem: Das eingelesene Image ist 1458 KB statt 1440 KB (wie normalerweise auf einer Diskette) groß. Außerdem zeigt er mir, wenn ich das Image einlese immer für Head 0 an.
Bitte helft mir
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.09.2004, 12:13 Uhr
~fasmat
Gast


Ich hab das Problem mit der Größe des Images gelöst .
Ich hab einfach:

C++:
for (track = 0; track <= 80; track++)


in

C++:
for (track = 0; track < 80; track++)


geändert .

Aber das Problem mit der Anzeige von Head kann ich einfach nicht lösen(???)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.09.2004, 21:15 Uhr
(un)wissender
Niveauwart


Also erstmal produzierst du ein Memoryleak, da du malloc ohne korrespondierendes free verwendest.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: