Array sortieren
-
Nenn mich jetzt naiv, aber spricht etwas dagegen, die Daten in-place zu sortieren?
-
Bei MS-DOS ärgerte die 64k Grenze doch ständig bei grösseren Programmen
Hast du die erfolgreich umschifft oder ist die für deinen Stress verantwortlich?
Wer kennt denn noch die Begrenzungen unter DOS?
a: 64k Blöcke -> kann man programmtechnisch umgehen
b: je nach Einträgen in den Startdateien und DOS-Version, pi * Daumen etwa 600kb freier Speicher auch, wenn in den Speicherbausteinen deutlich mehr vorhanden -> auch hier gab es Wege. Mit Nowel-DOS gab es da Lösungen. MS-Dos ohne Zusätze schaffte glaube ich nicht ganz soviel freien Speicher. Was PC-DOS konnte weiss ich nicht.
c: max. Festplattenpartitionengrössen abhängig von DOS-Version: 0MB, 32MB, 512MB
PC-DOS wurde zuletzt auch auf Rechnern mit grösseren Festplatten ausgeliefert. Ob die da mehr als die 512MB ansprechen konnten?Das ist aber schon ein paar Tage her. Deshalb solltet ihr eingehender nachforschen
MfG f.-th.
-
Ich benutze FreeDOS mit dem Emulator QEMU. Hab die Daten wie viel das FreeDOS schluckt nicht gefunden.
Bei MS-DOS ärgerte die 64k Grenze doch ständig bei grösseren Programmen
Hast du die erfolgreich umschifft oder ist die für deinen Stress verantwortlich?
Warscheinlich nicht. Ist hoffendlich das letzte Programm was ich für DOS schreiben muss...
Der malloc Versuch ging auch in die Hose: Error R6000: Stack Overflow war alles was er ausspucke. Ich benutze nmake zum kopilieren, gibt es auch einen Debuger dazu der mit weiterhelfen kann?
-
Stack overflow hat nichts mit malloc zu tun, du hast wahrscheinlich immer noch zu große lokale Variablen, etwa
int bla(void *fasel) { int a[1000000]; /* hier kann es leicht einen Stacküberlauf geben */ ... }
oder noch schlimmer die Variablen sogar global.
-
nmake ist das make-tool. Zu welchem Compiler das gehört weiss ich gerade nicht.
Das wurde mindestens mit Digital Mars, Microsoft und Watcom ausgeliefert.Also welchen Compiler hast du am Start und welchen Linker?
FreeDOS hab ich nicht so verfolgt - hat man da nicht versucht die Speichergrenzen zu erweitern?
MfG f.-th.
-
Binggi schrieb:
Ja schon, war auch mein erster ansatz aber das Problem ist, dass die Sortierten daten wieder in dem ursprünglich array kopiert werden müssen, da ich eine vorgegebe Funktion daten_schreiben(void) aufrufen muss. Und die schriebt den Array wider in ein Textfile. Ausserdem habe ich noch 6 integer strukturen, welche ich synchron Sortieren muss, da ich im nachhinein keinen Bezug mehr auf die Daten habe... Es ist auch nicht möglich das vordefinierte abzuändern. Verscuhe das ganze nochmals mit malloc.
ja, macht doch nichts. benutz doch das sortierte zeigerarray zum daten schreiben.
das mit den 6 int-strukturen kann ich jetzt nicht nachvollziehen.
warum kannst du das vordefinierte nicht ändern? kannst du es auch nicht um eine eigene schreibfunktion ergänzen?
-
ja, macht doch nichts. benutz doch das sortierte zeigerarray zum daten schreiben.
das mit den 6 int-strukturen kann ich jetzt nicht nachvollziehen.
warum kannst du das vordefinierte nicht ändern? kannst du es auch nicht um eine eigene schreibfunktion ergänzen?Nein leider nicht...
Ich habe eine Datei die ich in eine Strukur Array fülle, alles in allem 46kb gross. Nebenbei lese ich jedoch noch weitere 3 Dateien aus die in die jeweiligen int Array geschrieben werden. Wenn ich nun den struct array index 0 auf 2 verschiebe muss ich auch alle int array inex 0 auf 2 verschieben. Das ist recht schlecht gemacht aber nicht änderbar.
Wie gross dürfen denn alles globelen und lokalen Variablen gemeinsam gross sein?
Nicht mehr als 56kb?
-
Binggi schrieb:
Wie gross dürfen denn alles globelen und lokalen Variablen gemeinsam gross sein?
Nicht mehr als 56kb?56kb ist ja eigentlich nicht so viel aber wieviel FreeDos hergibt weiß ich auch nicht. Vllt. haben die ja die Funktion alloca (nicht standard) implementiert.
http://www.mkssoftware.com/docs/man3/alloca.3.asp
oder vllt. lässt sich die stackgröße wie bei ms dos in der config.sys festlegen? keine ahnung.
-
vllt. liegt es auch an der qemu konfiguration?
guckst du:
http://lists.gnu.org/archive/html/qemu-devel/2009-10/msg02211.html
-
Danke für eure Tipps, habe den Fehler gefunden.
Das Memorx Modell war auf Small eingestell. Bei Large habe ich die Probleme nicht mehr. Ausser malloc funktioniert nicht. '=' : defferent levels of indirection meint er. Aber der spinnt, ist alles korrekt.
Aber da des erste Problem behoben ist kann ich malloc wieder weglöschen.
Danke für eure Hilfe
Gruss Binggi
-
Unsinn.
Der Compiler hat immer Recht.
-
gcc sagt korrekt und der Compiler von FreeDOS (weiss den Namen nicht mehr) sagt Fehler. und gcc wurde mit pedantic compiliert. Die Frage ist wer hat mehr Recht?
-
Da er malloc ja nicht benötigt und die Fehlermeldung dort auftritt, wenn ich das richtig deute, kann es sein das er Glück hat.
Sollte der Quelltext für die Funktion des Programms unbedingt erforderlich sein und es funktioniert nicht wie erwartet, sollte man sich die Sache genauer ansehen.
Nach der Fehlermeldung haben ja schon einige gesucht
Ohne den Quelltext an der Stelle gesehen zu haben, vermute ich ein Zeigerproblem.
Das malloc nicht funktioniert kann an den genutzten Headern liegen. Abhängig vom Alter des Compilers oder dessen Lieferanten kann es sein das die Funktionen in verschieden benannten Headern sind. Manchmal ist auch der Dialekt ein wenig anders bei der Speicherreservierung.
MfG f.-th.
-
Da ich die Funktion nicht mehr zwingend benötige, kann ich das weglassen.
Aber nach ANSI C ist die Funktion ,bzw. der malloc richtig verwenden.
Habe den quelltext nicht gerade zur Hand, aber es hat etwa so ausgesehen:struct data *tmp_data[90]; for(iIndex=0;iIndex<90;iIndex++) { tmp_data[iIndex]=malloc(sizeof(data)); }
Er kopiliert das ganze schon, es ist nur eine Warung. Aber sobal ich das Programm starte stürtzt des MSDOS ab,xD. Da macht Programmieren noch Freude.
Wenn mich nicht alles täuscht heisst der Compiler auf dem FreeDOS qcc.
Ich habe es auch mit casten versucht, da kommt dann irgend eine warnung mit "far pointer", habe den genauen wortlaut nicht mehr im Kopf.