Hallo, guten Tag. Wie macht das Borland Pascal 6.1 , das es 2 Array mit 64000Byte verkraftet? Wo ich mich als Anfänger bei dem TC 3.0 so gequält habe? Danke. GRuss ---------------------------------------- Ein Auszug: Virtual = Array [1..64000] of byte; VirtPtr = ^Virtual; ..... ..... VAR Virscr : VirtPtr; { Our first Virtual screen } VirScr2 : VirtPtr; { Our second Virtual screen } -------------------------------------
Weil vmtl 16-Bit System. Da ist in C ein einzelnes Array grösser als ca 32k chars spannend, weil
1 | &array[max+1] - &array[0] |
für gewöhnlich in "int" passen muss.
:
Bearbeitet durch User
Wo werden denn die Array abgelegt ? Dachte nach 64k ist schluss in dem Segment? Danke.
Peter B. schrieb: > Wo werden denn die Array abgelegt ? > Dachte nach 64k ist schluss in dem Segment? Auch Turbo-C verkraftet das. Da wird dann das Segmentregister umgeschrieben.
Peter B. schrieb: > ---------------------------------------- > Ein Auszug: > Virtual = Array [1..64000] of byte; > VirtPtr = ^Virtual; > ..... > ..... > VAR Virscr : VirtPtr; { Our first Virtual screen } > VirScr2 : VirtPtr; { Our second Virtual screen } > ------------------------------------- Das ist nur ein Array - wo siehst du zwei?
Peter B. schrieb: > Wo werden denn die Array abgelegt ? > Dachte nach 64k ist schluss in dem Segment? > > Danke. Mehrere Segmente z.B. mit dem Compact Memory Model
------------------------------------------ Das ist nur ein Array - wo siehst du zwei? ------------------------------------------ Es werden 2 64kb Bilder abgelegt zum umschalten im Programm .
Peter B. schrieb: > ------------------------------------------ > Das ist nur ein Array - wo siehst du zwei? > ------------------------------------------ > > Es werden 2 64kb Bilder abgelegt zum umschalten im Programm . Da irrst du dich aber. Zumindest dein Codefragment definiert nur ein array Zusätzlich gibt's zwei Pointer auf eben dieses array. Nochmal da du das offensichtlich noch nicht kapiert hast. Du kannst bei 16 Bit Compilern max 64k an globalen Daten nutzen wenn du mehr brauchst musst du malloc benutzen um Speicher vom Heap anzufordern. Auch dann gilt mehr oder weniger die 64k Grenze dann aber pro Anforderung.
Thomas Z. schrieb: > Peter B. schrieb: >> ------------------------------------------ >> Das ist nur ein Array - wo siehst du zwei? >> ------------------------------------------ >> >> Es werden 2 64kb Bilder abgelegt zum umschalten im Programm . > Da irrst du dich aber. Zumindest dein Codefragment definiert nur ein > array > Zusätzlich gibt's zwei Pointer auf eben dieses array. > > Nochmal da du das offensichtlich noch nicht kapiert hast. Du kannst bei > 16 Bit Compilern max 64k an globalen Daten nutzen wenn du mehr brauchst > musst du malloc benutzen um Speicher vom Heap anzufordern. Auch dann > gilt mehr oder weniger die 64k Grenze dann aber pro Anforderung. das stimmt nicht - wenn er mehrere Datensegmente hat kann er auch ohne malloc solche Arrays haben @Peter: Das mit den Speichermodels haben wir hier schon mehrfach gepostet - es ist blöd wenn du dann darauf nicht reagierst und 1 Woche später Fragen stellst die dadurch schon beantwortet wurden Tiny, Small, Compact, Huge, Large Bei Compact geht z.B. ein Codesegment (also nicht mehr als 64k Code, aber n Datensegmente)
http://www.c-jump.com/CIS77/ASM/Directives/D77_0030_models.htm Wenn du den englischen Text nicht lesen kannst musst du das sagen, sonst denke ich das du es verstanden hast
cppbert schrieb: > das stimmt nicht - wenn er mehrere Datensegmente hat kann er auch ohne > malloc solche Arrays haben Kannst du dafür ein Beispiel posten?
Thomas Z. schrieb: > cppbert schrieb: >> das stimmt nicht - wenn er mehrere Datensegmente hat kann er auch ohne >> malloc solche Arrays haben > > Kannst du dafür ein Beispiel posten? Hab gerade keines zur Hand aber frag dich einfach warum eine Exe mehrere Datensegmente haben kann, was ist der Sinn n 64K segmente zu haben wenn man die nicht nutze kann, ausserdem ist ein far pointer ob von malloc oder aus dem exe image ein far pointer da gibt es keinen Unterschied
OK hab's gefunden mit char huge arr1[70000L ] gehen auch mehr als 64k. Das war mir so nicht bewusst.
Thomas Z. schrieb: > OK hab's gefunden mit char huge arr1[70000L ] gehen auch mehr als > 64k. > Das war mir so nicht bewusst. ...du hast es nur verdrängt weils fiese langsam war, jeder index zugriff kann ein segmentwechsel verursache, also muss immer geprueft werden
Danke. Wie kann ich hier bei TPC den Large zb einstellen oder geht das nicht? Danke.
Ich setze mal das Programm vom TPC 6.1 hier rein und daraus diese 2 angeblichen 64000Byte Speicher die ich oben schon gemeldet hatte. Hier dieses bringt mich durcheinander: ------------------------------- Procedure SetUpVirtual; BEGIN GetMem (VirScr,64000); vaddr := seg (virscr^); GetMem (VirScr2,64000); vaddr2 := seg (virscr2^); END; ----------------------------
:
Bearbeitet durch User
Peter B. schrieb: > Danke. > > Wie kann ich hier bei TPC den Large zb einstellen oder geht das nicht? > > Danke. Das ging nur bei C, kann mich nicht erinnern bei Turbo Pascal das gesehen zu haben
Sind also hier jetzt 2 Segmente mit je 64kb? vaddr := seg (virscr^); Und die vaddr enthält die Segmentadresse? Danke.
:
Bearbeitet durch User
Peter B. schrieb: > Sind also hier jetzt 2 Segmente mit je 64kb? > > vaddr := seg (virscr^); > > Und die vaddr enthält die Segmentadresse? > > Danke. Könnte so sein, habe keine Ahnung wie der pascal kompiler das genau macht er verbirgt aber definitiv mehr von den details als der c compiler
cppbert schrieb: > Peter B. schrieb: >> Sind also hier jetzt 2 Segmente mit je 64kb? >> >> vaddr := seg (virscr^); >> >> Und die vaddr enthält die Segmentadresse? >> >> Danke. > > Könnte so sein, habe keine Ahnung wie der pascal > kompiler das genau macht er verbirgt aber definitiv mehr von den details > als der c compiler Technisch muessen es mind. zwei segmente darunter sein - und ja die segment adresse steht dann da drin
Nebenfrage vom Titel. Nimmt der Portbefehl vom TPC nur Byte oder auch zb unsigned Int? Port[$3c9] :=....
:
Bearbeitet durch User
Dann kann man jedes Array einfach auch wie malloc behandeln mit Getmem?
Peter B. schrieb: > Dann kann man jedes Array einfach auch wie malloc behandeln mit > Getmem? Der Satz ergibt keinen Sinn
Danke für Portw. Ich meine jedes kleine Array kann man mit Getmem dann ein eigenen Segment zuweisen wie bei C mit malloc. Nur das funktioniert hier bei TPC nicht: vaddr[10]:=65; bei C funktioniert es .
Pascal benutzt intern portb oder portw. Wenn du port benutzt entscheidet die Größe der var was benutzt wird. Benutzt du eigentlich auch Mal F1?
Peter B. schrieb: > Nur das funktioniert hier bei TPC nicht: > vaddr[10]:=65; bei C funktioniert es . vaddr ist als Word definiert wieso glaubst du daraus auf einmal ein array machen zu können?
:
Bearbeitet durch User
Peter B. schrieb: > Ich meine jedes kleine Array kann man mit Getmem dann ein eigenen > Segment zuweisen wie bei C mit malloc. Es wird keinem array ein segment zu gewiese, ein speicherbereich wird im heap manager reserviert, unter dos ist dieser reservierte bereich immer auf einer segmentadresse und diesen speicherbereich nutzt du dann mit array syntax/semantik, ob das per malloc, getmem oder fix in deinem programm allokiert ist ist voellig egal > Nur das funktioniert hier bei TPC nicht: > vaddr[10]:=65; bei C funktioniert es . Pascal syntax lernen?
Weil es hier heraus entstanden ist meine ich : Virtual = Array [1..64000] of byte; VirtPtr = ^Virtual; VAR Virscr : VirtPtr; GetMem (VirScr,64000); vaddr := seg (virscr^); vaddr[10]:=65; ?
:
Bearbeitet durch User
Peter B. schrieb: > Weil es hier heraus entstanden ist meine ich : > > Virtual = Array [1..64000] of byte; > VirtPtr = ^Virtual; > VAR Virscr : VirtPtr; > > GetMem (VirScr,64000); > vaddr := seg (virscr^); > > vaddr[10]:=65; ? In c wendest du doch nicht MK_SEG auf den malloc pointer an und versuchst den dann mit [] darauf zu zugreifen - schaur dir deinen code an
Pascal ist nicht C, C ist nicht Pascal. Pascal ist ein Lehrsprache. Damit sollen Konzepte der Programmierung und auch programmieren beigebracht werden. C ist von Profis (für sich selber), die wissen was sie tun. Die wollten sich die Arbeit leichter machen. C ist zwar einfach aufgebaut, hat aber genug Fallstricke, die beim 8086 nochmal verschärft sind. Pascal versteckt einiges vor dem Programmierer. Die Programme sind meist sicherer, weil man nicht so viel Mist machen kann. (Ein C-Compiler gibt da „nur“ Warnungen aus)
Dispose habe ich bei TPC 7 gefunden. Hatte es ersetzt für TPC 6 vor einer Stunde.
cppbert schrieb: > Gibt es schon New/Dispose in TP 6? In TP7 ja in TP6 weiß ich's nicht genau vermutlich aber auch. OOP würde ja mit TP5.5 eingeführt
nimms mir nicht übel aber vieleich soltest du mal mit was einfachem anfangen. Eine Einführung in C oder auch Pascal startet sicher nicht mit der Grafikprogrammierung und schon garnicht mit dem Schreiben in den Bildschirmspeicher. das ist fortgeschrittenes Wissen und heute sowas von obsolet.
:
Bearbeitet durch User
------------ obsolet. ------------ Man soll auch mal auf die kleinen Dinge achten die Vergangenheit waren. Un das tue ich. Ihr lebt manchmal am Leben vorbei und denkt nur an den Supergau und das macht euch Abhängig davon , ihr könnt kleine Dinge nicht mehr erkennen. Gönnt euch die mal , es bringt große Freude.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.