C/C++ Compiler für DOS

FastProg

Erfahrenes Mitglied
Hi Leute

Ich suche einen C/C++ Compiler den ich auch unter Dos nutzen kann nicht wie der VisualC++ Compiler von Microsoft, der erstellt nur Windows anwendungen!

Danke
 
Hi,
willst du den Compiler von der DOS-Promt aus starten, oder willst du Program-
me für DOS/Konsolenanwendungen schreiben?

Ein Compiler für DOS, da fällt mir auf Anhieb der Turbo C Compiler von Borland
ein.

Ansonsten kann Visual C++ auch Konsolenanwendungen schreiben, müsste da
irgendwo im "Neues Projekt"-Wizard versteckt sein.

Ich würde aber den Kostenlosen Compiler Dev-C++ von Bloodshed nehmen.

Ps: Noch ein Compiler für die Prompt: gcc unter CygWin!
 
Danke für deine schnelle Antwort.

Das Programm soll unter DOS zu Starten sein, keine Konsolen anwendung.

Wo bekommt man den von Borland her, und ist der Kostenlos?
 
Der Turbo C Compiler ist zwar schon nahezu antik. Aber eben aus diesem Grund wird er auf der Borland Website kostenlos zum Download angeboten.
 
Wieso kann ich das nicht mit Turbo C++ erstellen?

Code:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

int main(int argc, char* argv[])
{
if(argc<4) 
{
	printf("\n*** Fehler ***\n");

	
} else {

	struct fattype
	{
		char name[260];
		long filesize;
		short start;
		short killafter;
	} fatentry;
	_fmode=0x8000;
	FILE* he=fopen(argv[1],"a");
	assert(he);
	fatentry.filesize=0;
	fatentry.start=0;
	strcpy(&(fatentry.name[0]),argv[2]);
	FILE* it;
	if(strcmp(argv[4],"d")!=0&&strcmp(argv[4],"D")!=0)
	{
		it=fopen(argv[2],"r");
		assert(it);
		rewind(it);
		int dummy=0;
		while (feof(it)==0) 
		{
			dummy=getc(it);
			fatentry.filesize++;
		};
		rewind(it);
		if(argc>3)
		{
			if(strcmp(argv[3],"n")==0) fatentry.start=1;
			if(strcmp(argv[3],"m")==0) fatentry.start=2;
			if(strcmp(argv[3],"M")==0) fatentry.start=3;
			if(strcmp(argv[3],"h")==0) fatentry.start=4;
			if(strcmp(argv[3],"c")==0) fatentry.filesize=-1;
		}
	}
	fatentry.killafter=0;
	if(argc>4)
	{
		if(strcmp(argv[4],"k")==0) 
		{
			fatentry.killafter=1;
		} 
		else if(strcmp(argv[4],"w")==0)
		{
			fatentry.killafter=2;
		}
		else if(strcmp(argv[4],"d")==0)
		{
			fatentry.killafter=4;
		}
		else if(strcmp(argv[4],"D")==0)
		{
			fatentry.killafter=3;
		}
	}
	fwrite(&fatentry,sizeof(fatentry),1,he);
	if(fatentry.killafter<3&&fatentry.filesize!=-1)
	{
		while (feof(it)==0) 
		{
			putc(255-getc(it),he);
		}
	}
}
return 0;
}
 
OK 4 Sachen...

1.) Gibts dazu auch Fehlermeldungen?
2.) Hast du den library path angepasst?
3.) Denkst du dran das es im Realmode FAR und NEAR pointer gibt?
4.) die dateifunktionen zum bearbeiten von FILE* beginnen allesamt mit f also, bitte fgetc bzw. fputc benutzen ;-). Außerdem wurde im Realmode soweit ich weiß aufgrund des geringen verfügbaren Speichers gerne auf FILE* verzichtet und stattessen die lowlevel IO routinen _open() _read() _write() und andere benutzt, in io.h

Denk bitte auch daran das du in DOS nur maximal 640kB Speicher benutzen kannst, im unteren Speicherbereich, für alles andere musst du Speichertreiber benutzen oder in den Unrealmode wechseln. wie das funktioniert hab ich irgendwo schon mal in Assembler gezeigt.
 
Zuletzt bearbeitet:
Leider kann ich dort nicht mit halten, habe nur bis jetzt unter VisualC++ programmiert und dort geht es wenn ich noch die Header #include <windows.h> einsetze!
 
n wirst du dich jetzt erstmal n wenig umstellen müssen...

Denn wenn du bisher einen Pointer hattest war klar, Pointer = Pointer egal was kommt.

Das stimmt im KernelMode und RealMode nicht mehr so, hier gibt es nämlich 2 typen von Pointern. Zum einen gibt es NEAR pointer, Die sind in etwa mit den pointern vergleichbar die du bisher schon kennst von Windows. einfach ein Offset vom anfang eines Segmentes.

beispiel: char NEAR *myNearPtr;

Dann gibt es auch noch dir FAR Pointer, auf die du in Windows aber keinen zugriff hast. Sie werden benutzt wenn man ein anderes Speichersegment Addressieren will.

beispiel: char FAR *myFarPtr;

so nun ist es so, das du im Realmode in einem Speichersegment maximal 64kB unterbringen kannst, das reicht aber in den meisten Fällen nicht aus, daher wirst du um FAR pointer nicht rum kommen. Sie zeigen auf ein Segment und einen Offset.

Näheres zu Pointertypen gibt im Datenblatt i386 von Intel.

Außerdem stellt dir großteils nicht C sondern DOS dein API, such dazu mal nach informationen zum them int 21h

Das sind die Hauptunterschiede.

Außerdem musst du wenn du das C API benutzen willst dem compiler sagen wo er die librarys findet... guck mal in die doku ;-)
 
Zurück