Miten tämän koodin saa toimimaan DOS-ympäristössä?

Anonyymi-ap

Eli vaikka tämä kysymys on Delphi-puolella niin en käytä Delphiä vaan FreePascalia ja kysyisin miten tämän koodin saisi toimimaan DOS-kääntäjällä? ppcross8086-ristiinkääntäjä ilmoittaa virheestä että jotain yksiköitä ei löydetä. Linuxilla ja Windows 32-bittisellä toimii tuo koodi mutta tuo pitäisi saada käännettyä myös MSDOSille:
-----------------------------------

program md5laskin;

{$mode objfpc}{$H+}

uses
{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, md5;
//{ you can add units after this };
var
PathToFile, S, FileHash: string;
begin
Readln(PathToFile);
FileHash := MD5Print(MD5File(PathToFile));
Writeln(FileHash, ' ' + PathToFile);
end.

22

507

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Tässä tarkemmat virheilmoitukset:
      -----------------------
      Fatal: Can't find unit system used by md5laskin
      Fatal: Compilation aborted

      • Anonyymi

        Delphi on viimeistelty tuote. Tarkoittaa sitä, että kun asennat Delphin, kaikki tarvittavat osat asentuvat automaattisesti, ja ne myös automaattisesti konfiguroidaan oikein.

        Freepascalista ei voi sanoa samaa.
        Tuo "Can't find unit system" on malliesimerkki tästä!

        system unit - sitä käyttää automaattisesti jokainen ohjelma (program), kirjasto (library) ja käännösyksikkö (unit).

        Se, ettei system unitia löydy, on viite siitä, että jokin konfiguraatiotiedosto on virheellinen - eli viite siihen hakemistoon, jossa on system unit, viite tuohon hakemistoon joko puuttuu kokonaan tai viittaa väärään hakemistoon.

        etsi ensin, missä sijaitsee:

        system.pas
        system.pp
        system.ppu
        system.o
        system.obj

        (kaikkia näistä ei löydy, mutta ainakin osan pitäisi löytyä).
        sen jälkeen, kun olet löytänyt, missä system unit sijaitsee, etsi fpc.cfg tai fpc.conf, ja tarkista ko. tekstitiedoston sisältö - sen tulee viitata hakemistoon, jossa 1 tai useampi system.* sijaitsee.

        Lisäksi:
        MS-DOS ei tue säikeitä.
        Niinpä unitia cthreads EI tule käyttää lainkaan !

        Samoin:
        Koska säikeitä ei tueta, niin jos koodisi yrittää käyttää luokkaa TThread tai proseduureja BeginThread ja/tai EndThread - aiheuttaa virheilmoituksen !

        En ole varma, onko FreePascal tässä asiassa yhtä tiukka kuin Delphi olisi, mutta JOS on, niin lisää ohjelmasi alkuun (kun kerran komentoriviohjelmasta on kyse):

        {$APPTYPE CONSOLE}

        FreePascal tukee useita eri käyttöjärjestelmiä ja prosessoreita.
        Valitettavasti tämä on toteutettu tavalla, joka tekee koko käännösprosessista monimutkaisemman.

        Joudut siis jokaisen käytetyn UNITin osalta selvittämään, missä hakemistossa tuo unit on, ja tavalla tai toisella kertomaan sen kääntäjälle.

        Koska SYSTEM unitia EI KOSKAAN saa mainita uses -lausessa, niin tuon system unitin osalta ainoa keino on käyttää joko viitettä fpc.cfg -tiedostossa tai sitten kertoa sen sijainti kääntäjälle komentoriviparametrilla.

        Muiden unitien osalta:

        Voit kokeilla, tukeeko FreePascal Delphi -tyylistä määritettä (sallittu VAIN program ja library - EI OLE sallittu unitissa):

        uses
        MyUnit in '\PATH\to\MyUnit.pas',
        SysUtils, Classes;

        siis KUN tuota uses -lausetta käytetään program tai library -tiedostossa, niin ainakin Delphi hyväksyy tuon "in 'jotakin' " itse unit -nimen jälkeen, ja tuolla syntaksilla kääntäjä tietää, mistä ko. unitia pitäisi etsiä.

        Tiedostopäätteistä:

        .pp = tämä on Freepascalille hieman sama kuin Delphille ".pas"
        .ppu = vastaa Delphin ".dcu". HUOM: FreePascal käsittääkseni tarvitsee myös .obj tai .o (riippuu käyttöjärjestelmästä / prosessorista, kumpi on oikein).

        Delphi taas ei tarvitse .o tai .obj koska Delphin .dcu sisältää myös käännetyn binäärisen koodin.


    • Anonyymi

      Eikö kukaan osaa neuvoa? Eli haluaisin tehdä tuosta md5laskin-ohjelmasta myös MSDOSissa toimivan version kun sellaista ei ole missään valmiina.

    • Anonyymi

      koita josko chatgpt osaisi

    • Anonyymi

      cthreads voi olla hankala dossilla?

      • Anonyymi

        Kokeilin poistaa tuo cthreads-kohdan ja muutin koodia muutenkin:

        program md5dos;

        {$mode objfpc}{$H+}

        uses
        {$IFDEF UNIX}
        cpui8086
        {$ENDIF}
        Classes, dos, md5;
        //{ you can add units after this };

        var
        PathToFile, FileHash: string;
        begin
        Readln(PathToFile);
        FileHash := MD5Print(MD5File(PathToFile));
        Writeln(FileHash, ' '+PathToFile);
        //Writeln(MD5File);
        //Writeln(MD5Print);
        end.

        Ei vaan silti onnistu käännös ppcross8086-ristikääntäjällä vaan herjaa edelleen:

        Fatal: Can't find unit system used by md5dos
        Fatal: Compilation aborted


      • Anonyymi
        Anonyymi kirjoitti:

        Kokeilin poistaa tuo cthreads-kohdan ja muutin koodia muutenkin:

        program md5dos;

        {$mode objfpc}{$H }

        uses
        {$IFDEF UNIX}
        cpui8086
        {$ENDIF}
        Classes, dos, md5;
        //{ you can add units after this };

        var
        PathToFile, FileHash: string;
        begin
        Readln(PathToFile);
        FileHash := MD5Print(MD5File(PathToFile));
        Writeln(FileHash, ' ' PathToFile);
        //Writeln(MD5File);
        //Writeln(MD5Print);
        end.

        Ei vaan silti onnistu käännös ppcross8086-ristikääntäjällä vaan herjaa edelleen:

        Fatal: Can't find unit system used by md5dos
        Fatal: Compilation aborted

        Ooops, muutin myös tuon kohdan jossa UNIX, kohdaksi DOS.


      • Anonyymi
        Anonyymi kirjoitti:

        Ooops, muutin myös tuon kohdan jossa UNIX, kohdaksi DOS.

        Kuulostaa lähinnä, että system unitti on jossain muussa hakemistossa eikä löydy. Lazarukseen pystyy lisäämään nuo automaattisesti. Peruskääntäjä löytää samassa hakemistossa olevat tiedostot eli jos unitin löytää sen voi pudottaa samaan hakemistoon lähdekoodin kanssa ja pitäisi kääntyä.


      • Anonyymi
        Anonyymi kirjoitti:

        Kuulostaa lähinnä, että system unitti on jossain muussa hakemistossa eikä löydy. Lazarukseen pystyy lisäämään nuo automaattisesti. Peruskääntäjä löytää samassa hakemistossa olevat tiedostot eli jos unitin löytää sen voi pudottaa samaan hakemistoon lähdekoodin kanssa ja pitäisi kääntyä.

        Kokeilin sitäkin mutta ei vaan käänny tuo md5laskin. Niin ja kokeilin tällaista helppoa ohjelmaa joka sekään ei käänny vaan tulee sama virheilmoitus:

        program hello;
        begin
        writeln('Hello');
        end.

        Eli tuokin herjaa
        Fatal: Can't find unit system used by hello
        Fatal: Compilation aborted


      • Anonyymi
        Anonyymi kirjoitti:

        Kuulostaa lähinnä, että system unitti on jossain muussa hakemistossa eikä löydy. Lazarukseen pystyy lisäämään nuo automaattisesti. Peruskääntäjä löytää samassa hakemistossa olevat tiedostot eli jos unitin löytää sen voi pudottaa samaan hakemistoon lähdekoodin kanssa ja pitäisi kääntyä.

        Lisäys: en voi käyttää tuossa käännöstyössä Lazarusta koska se kääntää vain sille ympäristölle jolle se on tarkoitettu, eli ristikäännös ei siis onnistu. Siksi koitin kääntää ppcross8086-ristikääntäjällä, koska halusin saada tuon md5laskin-ohjelman toimimaan myös MSDOSissa.


      • Anonyymi
        Anonyymi kirjoitti:

        Lisäys: en voi käyttää tuossa käännöstyössä Lazarusta koska se kääntää vain sille ympäristölle jolle se on tarkoitettu, eli ristikäännös ei siis onnistu. Siksi koitin kääntää ppcross8086-ristikääntäjällä, koska halusin saada tuon md5laskin-ohjelman toimimaan myös MSDOSissa.

        Jaa - olen kyllä kääntänyt Androidille omalla Lazaruksellani Linux-ympäristössä, mutta olen kai sitten erehtynyt..


      • Anonyymi
        Anonyymi kirjoitti:

        Jaa - olen kyllä kääntänyt Androidille omalla Lazaruksellani Linux-ympäristössä, mutta olen kai sitten erehtynyt..

        Ahaa, enpä tiennyt että moinen on mahdollista. Tai siis linuxympäristössä voi toki käyttää fp ide:tä jolloin kohdeympäristön voi määritellä, paitsi ei MSDOSia tietääkseni mutta Androidin voi laittaa. Sitä en kuitenkaan tiennyt että sama onnistuu myös Lazaruksen avulla.


      • Anonyymi
        Anonyymi kirjoitti:

        Jaa - olen kyllä kääntänyt Androidille omalla Lazaruksellani Linux-ympäristössä, mutta olen kai sitten erehtynyt..

        Joo nyt vasta huomasin että sellainen ominaisuus on piilotettu Projektinhallinnan asetuksiin, siis tuo että voi kääntää toiselle ympäristölle kuin mitä Lazarus itse on tehty.


      • Anonyymi
        Anonyymi kirjoitti:

        Joo nyt vasta huomasin että sellainen ominaisuus on piilotettu Projektinhallinnan asetuksiin, siis tuo että voi kääntää toiselle ympäristölle kuin mitä Lazarus itse on tehty.

        Kokeilin tuota Lazaruksen projektinhallinnan asetuksista laittaa kohteeksi MSDOS ja prossuksi i8086 mutta herjaa ettei ppu-tiedostoja löydy, mitä hittoa?

        Eli tuli tällainen herja:

        Projektin kohdekäyttöjärjestelmä=msdos ja CPU=i8086.
        Kohteelle ei löydy system.ppu tiedostoa FPC:n binaari-hakemistoista.
        Varmista että fpc on asennettu oikein tälle kohteelle ja että fpc.cfg:ssa on oikeat hakemistot.

        Miten tuolle fpc.cfg:lle määritellään oikeat hakemistot, voisko joku neuvoa ihan rautalangasta vääntäen?


      • Anonyymi
        Anonyymi kirjoitti:

        Kokeilin tuota Lazaruksen projektinhallinnan asetuksista laittaa kohteeksi MSDOS ja prossuksi i8086 mutta herjaa ettei ppu-tiedostoja löydy, mitä hittoa?

        Eli tuli tällainen herja:

        Projektin kohdekäyttöjärjestelmä=msdos ja CPU=i8086.
        Kohteelle ei löydy system.ppu tiedostoa FPC:n binaari-hakemistoista.
        Varmista että fpc on asennettu oikein tälle kohteelle ja että fpc.cfg:ssa on oikeat hakemistot.

        Miten tuolle fpc.cfg:lle määritellään oikeat hakemistot, voisko joku neuvoa ihan rautalangasta vääntäen?

        fpc.cfg, se on vähän kuin komentoriviltä käyttäisi. Unitit laitetaan "-Fu":n avulla.
        Tällainen kohta löytyy ainakin minulta:

        # searchpath for units and other system dependent things
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/*
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/rtl

        #ifdef cpui8086
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/$fpcsubarch-$fpcmemorymodel
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/*
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/rtl
        #endif
        Noita voi joutua muuttamaan, esim. jos asentaa kaksi versiota kääntäjästä ja toinen on kotihakemiston alla, pitää tehdä kaksi versiota em. tiedostosta ja vaihdella tarpeen mukaan. Targetteja ei välttämättä ole automaattisesti käännetty ts. "cpui8086" valinta edellyttää kääntäjän uudelleen kääntämistä, jolloin unitit kääntyy myös.
        Nuo unit-hakemistojen määrittelyt tuntuu yleensä riittävän - katsoo vaan, että ne menee olemassa olevaan hakemistoon ja tulee kolmen ryhmissä.


      • Anonyymi
        Anonyymi kirjoitti:

        fpc.cfg, se on vähän kuin komentoriviltä käyttäisi. Unitit laitetaan "-Fu":n avulla.
        Tällainen kohta löytyy ainakin minulta:

        # searchpath for units and other system dependent things
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/*
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/rtl

        #ifdef cpui8086
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/$fpcsubarch-$fpcmemorymodel
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/*
        -Fu/usr/lib/x86_64-linux-gnu/fpc/$fpcversion/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/rtl
        #endif
        Noita voi joutua muuttamaan, esim. jos asentaa kaksi versiota kääntäjästä ja toinen on kotihakemiston alla, pitää tehdä kaksi versiota em. tiedostosta ja vaihdella tarpeen mukaan. Targetteja ei välttämättä ole automaattisesti käännetty ts. "cpui8086" valinta edellyttää kääntäjän uudelleen kääntämistä, jolloin unitit kääntyy myös.
        Nuo unit-hakemistojen määrittelyt tuntuu yleensä riittävän - katsoo vaan, että ne menee olemassa olevaan hakemistoon ja tulee kolmen ryhmissä.

        Minulla on nuo kaikki mainitut rivit fpc.cfg tiedostossa mutta en silti onnistu kääntämään sitä Lazarus-ympäristössä, siksi käytän MSDOSille ppcross8086-ristikääntäjää.


    • Anonyymi

      Nyt kokeilin sitä että kopioin kaikki .a ja .ppu tiedostot samaan hakemistoon tuon lähdekoodin kanssa, siis 8086-huge-hakemistosta.
      Kyllä nyt kääntyy ohjelma mutta on ongelma, se laskee DOSBOXissa md5-tarkistussumman väärin eli jotain on edelleen pielessä. Pitäisikö yrittää ihan aidossa DOS-ympäristössä vai mikä on pielessä?

      • Anonyymi

        Niin osaako joku kertoa miksi tuo laskee tarkistussumman väärin kun on käännetty MSDOS-ympäristöön? Mitään samaa ei tapahdu linux-ympäristössä eikä Windowsilla eli niissä tuo md5laskin osaa laskea tarkistussumman ihan oikein.


      • Anonyymi
        Anonyymi kirjoitti:

        Niin osaako joku kertoa miksi tuo laskee tarkistussumman väärin kun on käännetty MSDOS-ympäristöön? Mitään samaa ei tapahdu linux-ympäristössä eikä Windowsilla eli niissä tuo md5laskin osaa laskea tarkistussumman ihan oikein.

        En mene vannomaan, mutta kyse voi olla String-tyypin käsittelystä väärin eli se pitäisi olla AnsiString:iksi tulkittu. DOS-puolella, jos tiedoston lukee väärässä moodissa se voi laukaista esim. ääkkösten konversion toiselle merkistölle. Eli pitäisi lukea raw-moodissa ilman konversioita streami.


      • Anonyymi
        Anonyymi kirjoitti:

        En mene vannomaan, mutta kyse voi olla String-tyypin käsittelystä väärin eli se pitäisi olla AnsiString:iksi tulkittu. DOS-puolella, jos tiedoston lukee väärässä moodissa se voi laukaista esim. ääkkösten konversion toiselle merkistölle. Eli pitäisi lukea raw-moodissa ilman konversioita streami.

        Ok, millaista muutosta ehdottaisit koodiin? Kokeilin tuota Ansistringiä mutta silti laski väärin.


      • Anonyymi
        Anonyymi kirjoitti:

        Ok, millaista muutosta ehdottaisit koodiin? Kokeilin tuota Ansistringiä mutta silti laski väärin.

        Vanhoissa Delpheissä on OK käyttää AnsiString -tyyppiä binääriseen dataan.

        Mutta uudemmissa Delpheissä ja FreePascalissa tuo voi aiheuttaa ongelmia.

        voit kokeilla:

        type
        TBytes = Array Of Byte;

        sitten:

        var
        Data : TBytes;

        begin
        SetLength(Data, 8192); // esimerkki !!!

        toinen asia: lukeminen binääritiedostosta:

        JOKO käytä TFileStream, ja sen propertyä Size sekä metodia ReadBuffer.

        TAI jos et halua käyttää TFileStream niin sitten:

        var
        BinaryFile : File;

        AssignFile(BinaryFile, 'filename.bin');
        Reset(BinaryFile, 1); // Tärkeä - oletuspuskurikoko on 128 !

        BlockRead(BinaryFile, Data[0], ByteCount);

        CloseFile(BinaryFile);


      • Anonyymi
        Anonyymi kirjoitti:

        Vanhoissa Delpheissä on OK käyttää AnsiString -tyyppiä binääriseen dataan.

        Mutta uudemmissa Delpheissä ja FreePascalissa tuo voi aiheuttaa ongelmia.

        voit kokeilla:

        type
        TBytes = Array Of Byte;

        sitten:

        var
        Data : TBytes;

        begin
        SetLength(Data, 8192); // esimerkki !!!

        toinen asia: lukeminen binääritiedostosta:

        JOKO käytä TFileStream, ja sen propertyä Size sekä metodia ReadBuffer.

        TAI jos et halua käyttää TFileStream niin sitten:

        var
        BinaryFile : File;

        AssignFile(BinaryFile, 'filename.bin');
        Reset(BinaryFile, 1); // Tärkeä - oletuspuskurikoko on 128 !

        BlockRead(BinaryFile, Data[0], ByteCount);

        CloseFile(BinaryFile);

        Okei, kokeilen noita.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Mies, näen sinua hetken

      ja olet mielessä ikuisuuden. Toisia näen ikuisuuden ja he eivät jää mieleen hetkeksikään. Muistan jokaisen kohtaamisen
      Ikävä
      24
      4392
    2. Riikka se jytkytti BKT:stä nyt 0,3 prosenttia pois

      Ja vain kolmessa kuukaudessa! Vuositasollahan tuo tarkoittaa reilun prosentin pudotusta. Pärjäisi varmaan lasketteluss
      Maailman menoa
      15
      4138
    3. Riikan perintö: ennätysvelka, ennätystyöttömyys ja ennätysverotus

      Tavallisen keskituloisen suomalaisen verotus on kireintä vuosikymmeniin, ja ensi vuonna palkansaajien käteen jää vieläki
      Maailman menoa
      229
      3789
    4. Antti Lindtman kiitti valtiovarainministeri Purraa

      Ministeri Purra kertoi ottavasa vastuun EU:n alijäämämenettelyyn joutumisesta. Hän myös sanoi tietävänsä, että Lindtman
      Perussuomalaiset
      27
      3058
    5. SDP haluaa LISÄÄ veroja bensa-autoille!

      Sdp:n vaihtoehtobudjetti esittää polttomoottoriautoille lisää veroja Sdp esittää tuoreessa vaihtoehtobudjetissaan verot
      Maailman menoa
      52
      2771
    6. Suomalaisten enemmistö on (ateisteja / fiksuja / sosialisteja)

      Tai jokin noiden yhdistelmä, koska S-ryhmän markkinaosuus päivittäistavarakaupasta on yli 50 prosenttia.
      Maailman menoa
      13
      2766
    7. Riikka Purra on ihana, jämpti

      Hän yrittää saada Suomen taas kuntoon. Sanoo asiat suoraan, eikä piiloudu kapulakielen taakse. Riikan kaltaisia päättä
      Maailman menoa
      108
      2718
    8. "Purra löylytti oppositiota", sanoi naistoimittaja Pöllöraadissa

      Kyllä, Purra tekee juuri sitä työtä mitä hänen tuossa asemassa pitää tehdä, hän antaa oppositiolle takaisin samalla mita
      Maailman menoa
      41
      2397
    9. Henkilökohtaisia paljastuksia Dubaista - Kohujulkkis Sofia Belorf on äitipuoli ja puoliso!

      Tiesitkö, että Sofia on äitipuoli ja rakastava puoliso? Sofia Belorf saa oman sarjan, jossa seurataan hänen Bling Bling
      Kotimaiset julkkisjuorut
      67
      2361
    10. K-kauppa on liian kallis. Ei voi S-ryhmäläinen siirtyä tuonne asiakkaaksi

      Hintatason ero K-kauppojen ja S-markettien välillä on niin suuri, että S-market ei juurikaan menetä asiakkaitaan K-ketju
      Maailman menoa
      100
      1910
    Aihe