Forum: PC-Programmierung TPC 6.1 macht 2 Array mit 64000 Byte


von Peter B. (funkheld)


Lesenswert?

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 }
-------------------------------------

von vn nn (Gast)


Lesenswert?

Wie kommst du auf die Idee, dass C es "nicht verkraftet"?

von (prx) A. K. (prx)


Lesenswert?

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
von Peter B. (funkheld)


Lesenswert?

Wo werden denn die Array abgelegt ?
Dachte nach 64k ist schluss in dem Segment?

Danke.

von Dirk B. (dirkb2)


Lesenswert?

Pascal versteckt viel vor dem Programmierer.

von Dirk B. (dirkb2)


Lesenswert?

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.

von cppbert (Gast)


Lesenswert?

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?

von cppbert (Gast)


Lesenswert?

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

von Peter B. (funkheld)


Lesenswert?

------------------------------------------
Das ist nur ein Array - wo siehst du zwei?
------------------------------------------

Es werden 2 64kb Bilder abgelegt zum umschalten im Programm .

von Thomas Z. (usbman)


Lesenswert?

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.

von cppbert (Gast)


Lesenswert?

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)

von cppbert (Gast)


Lesenswert?

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

von Thomas Z. (usbman)


Lesenswert?

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?

von cppbert (Gast)


Lesenswert?

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

von Thomas Z. (usbman)


Lesenswert?

OK hab's gefunden mit char huge arr1[70000L ] gehen auch mehr als 64k. 
Das war mir so nicht bewusst.

von cppbert (Gast)


Lesenswert?

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

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Danke.

Wie kann ich hier bei TPC den Large zb einstellen oder geht das nicht?

Danke.

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

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
von cppbert (Gast)


Lesenswert?

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

von Thomas Z. (usbman)


Lesenswert?

Getmem ist das gleiche wie malloc in c.

von cppbert (Gast)


Lesenswert?

Thomas Z. schrieb:
> Getmem ist das gleiche wie malloc in c.

Was war die Frage?

von Peter B. (funkheld)


Lesenswert?

Sind also hier jetzt 2 Segmente mit je 64kb?

vaddr := seg (virscr^);

Und die vaddr enthält die Segmentadresse?

Danke.

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

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

von cppbert (Gast)


Lesenswert?

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

von Peter B. (funkheld)


Lesenswert?

Nebenfrage vom Titel.
Nimmt der Portbefehl vom TPC nur Byte oder auch zb unsigned Int?

Port[$3c9] :=....

: Bearbeitet durch User
von Peter B. (funkheld)


Lesenswert?

Dann kann man jedes Array einfach auch wie malloc behandeln mit Getmem?

von cppbert (Gast)


Lesenswert?

Peter B. schrieb:
> Dann kann man jedes Array einfach auch wie malloc behandeln mit
> Getmem?

Der Satz ergibt keinen Sinn

von cppbert (Gast)


Lesenswert?

PortW

von Peter B. (funkheld)


Lesenswert?

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 .

von Thomas Z. (usbman)


Lesenswert?

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?

von Thomas Z. (usbman)


Lesenswert?

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
von cppbert (Gast)


Lesenswert?

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?

von Peter B. (funkheld)


Lesenswert?

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
von cppbert (Gast)


Lesenswert?

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

von cppbert (Gast)


Lesenswert?

Gibt es schon New/Dispose in TP 6?

von Peter B. (funkheld)


Lesenswert?

Mem [vaddr:10]:=20; ist der Befehl um Daten zuzuweisen.

von Dirk B. (dirkb2)


Lesenswert?

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)

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Dispose habe ich bei TPC 7 gefunden.
Hatte es ersetzt für TPC 6 vor einer Stunde.

von Thomas Z. (usbman)


Lesenswert?

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

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

In TPC6 auch.
Habe es mal in der DosBox abgelichtet.

von Thomas Z. (usbman)


Lesenswert?

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
von Peter B. (funkheld)


Lesenswert?

------------
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
Noch kein Account? Hier anmelden.