OPTLINK Error 42

Hallo, ich wollte ein C-Programm schreiben was auf DOS läuft.

Es soll einfach nur den Inhalt eines Ordners lesen.
Unter MinGW läuft das kompilieren gut, aber MinGW kann ja nicht für DOS kompilieren.

Ich benuzte jetzt DigitalMars aber der Linker gibt mir Error 42 aus.

Mein Programmcode:
_________________________________________________
#include
#include
int main(void)
{
DIR *d;
struct dirent *dir;
d = opendir(".");
if (d)
{
while ((dir = readdir(d)) != NULL)
{
printf("%s\n", dir->d_name);
}

closedir(d);
}

return(0);
}
_________________________________________________

Der Compiler:
_________________________________________________
D:\Dokument\KDos\progs\dm\bin>dmc -mtd kdos
link ct+kdos,kdos/noi;
OPTLINK ® for Win32 Release 8.00.5
Copyright © Digital Mars 1989-2009 All rights reserved.
http://www.digitalmars.com/ctg/optlink.html
OPTLINK : Warning 23: No Stack
kdos.obj(kdos)
Error 42: Symbol Undefined _closedir
kdos.obj(kdos)
Error 42: Symbol Undefined _readdir
kdos.obj(kdos)
Error 42: Symbol Undefined _opendir

— errorlevel 3

D:\Dokument\KDos\progs\dm\bin>
_________________________________________________

Ich brauche also Hilfe (Ich bin 12 Jahre alt)

Hi Hacker,
das Problem besteht zunächst einmal darin, das optlink die Befehle closdir, readdir und opendir nicht unterstützt.
Versuchs entweder mit der Win32API, also Findfirst, Findnext… wobei ich leider kein Beispiel parat habe.
Oder versuchs mal mit DJGPP (http://www.delorie.com/djgpp), dieser Compiler sollte die „Aliase“ kennen.
MfG DV

Geht das auch mit DOS?
Denn die WIN32API ist ja nur für Windows

Wenn Du Commandline von Windows mit „DOS“ meinst, dann ist das kein Problem. Verwendest Du aber z.B. FreeDOS, dann funktioniert die Win32API natürlich nicht.

Wie installiert man DJGPP?

Da kann ich Dir auf anhieb leider auch nicht helfen. Aber auf der Seite gibt es sicher eine Anleitung dazu.

Gibt es auch noch ein anderen Compiler?

Das Programm soll auf einen DOS-System laufen.

DJGPP krieg ich nicht installiert(gibt gar kein Installer außerden sind das ganze viel zu viele ZIP-Dateien)

Um Dir wirklich helfen zu können, müsste ich erstmal wissen was Du genau für eine Arbeitsumgebung nutzt. Windows*, Linux…

Um Dir wirklich helfen zu können, müsste ich erstmal wissen
was Du genau für eine Arbeitsumgebung nutzt. Windows*,
Linux…

Ich benutze Windows und die Anwendung soll auf DOS laufen

Soweit habe ich Dich verstanden…aber meinst Du mit DOS die Commandline von Windows oder z.B. FreeDOS?

Soweit habe ich Dich verstanden…aber meinst Du mit DOS die
Commandline von Windows oder z.B. FreeDOS?

Eigentlich wollte ich die Command.com von meinem MS-DOS-USB-STICK gegen mein eigendes Programm ersetzen.

Eigentlich sollte es erstmal ja auch nur den Inhalt des Ordners anzeigen.

Also benutzt Du Windows. MinGW gibt es auch für Windows und sollte die Befehle entsprechend übersetzen können.

Also benutzt Du Windows. MinGW gibt es auch für Windows und
sollte die Befehle entsprechend übersetzen können.

Aber eigentlich soll das ja eine .com sein

Also eine DOS-Application

Also benutzt Du Windows. MinGW gibt es auch für Windows und
sollte die Befehle entsprechend übersetzen können.

Ich hab minGW.
das generiert aber keine ms-dos com datei

Die Dateiendung sorgt nicht dafür, das Du ein DOS Programm schreibst. Das liegt an den verwendeten Bibliotheken.

Compilierst Du also eine EXE-Datei und verwendest keine „graphischen“ (Windows-Fenster usw.) Bibliotheken, dann hast Du eine Anwendung die ein Konsolenfenster öffnet.

COM-Dateien sind zwar für DOS vorgesehen, das heißt aber nicht, das Du die Datei so benennen musst.

Dos sagt aber: This program cannot be run in DOS mode.

Habe bei mir gerade MinGW installiert und Deinen Quellcode kompiliert: g++ -o name name.c
(wobei „name“ durch den Programmnamen zu ersetzen ist).

Es wird eine Datei „name.exe“ erstellt, diese ist ausführbar und zeigt den Inhalt des Verzeichnisses.

Das prog soll ja aber auf DOS16 laufen

Und nicht auf der Windows-CMD

Also, der Code sieht vernünftig aus. Mit deinem Compiler habe ich keine Erfahrung, aber ich könnte mir vorstellen, dass es genügt, statt

int main(void)

folgendes zu schreiben:

int main(argc, argv[])

Viel Erfolg

R. Sommer

Hi,
sorry ich kann dir nicht konkret weiterhelfen, da ich noch nie versucht hab ein C Prog für Dos zu kompilieren.
Ich versuche es aber trotzdem mal, vielleicht hilft es dir ja weiter.
Der Compiler sagt: Error 42: Symbol Undefined _closedir
Das heißt also er kennt den Befehl nicht! Wieso?
Nun ja, mit „include“ bindest du ja Bibliotheken bzw. Frameworks und ähnliches in dein Prog. ein. Diese Bibliotheken sind Sammlungen von Befehlen, mit denen dein Computer (dein C-Compiler) etwas anfangen kann, beispielsweise „scanf“. Diesen Befehl bindest du mit der „Standart Imput Outpu“ Bibliothek ein, das hast du ja gemacht „#include “.
Nun findet dein Compiler die Befehle closedir, opendir,… nicht, das kann nun daran liegen, dass du sie falsch geschrieben hast, die falsche Bibliothek eingebunden hast(sie sind nicht in den eingebundenen Bibliotheken enthalten) oder dein Linker findet die Bibliotheken auf deinem PC nicht und damit auch die Befehle.
Hoffe das hilft etwas weiter!

Gruß Meho