Hallo , guten Tag. Ich habe hier 2 Malloc-Adressen. Wie rechne ich die jetzt bitte in Segm und Offs um. Ich habe mit Large kompiliert. Ich weiß das sie sich ändern, wollte nur bitte das Rechenschema. Das haut nicht hin: seg1=*p/16; offs1=*p-seg1; Danke.
:
Bearbeitet durch User
Ich bin mir nicht sicher, ob ich die Frage richtig verstanden habe, der Screenshot ist nicht wirklich aussagekräftig. Könntest du nicht ein Video machen, wo das Problem genauer erklärt wird?
foobar schrieb: > Ich bin mir nicht sicher, ob ich die Frage richtig verstanden > habe, der > Screenshot ist nicht wirklich aussagekräftig. Könntest du nicht ein > Video machen, wo das Problem genauer erklärt Ich werde alt...
#include dos.h MK_SEG und MK_OFS Macros seg = MK_SEG(ptr);
Unabhängig vom Rechenweg, sind die Adressen viel zu groß, um verlustfrei in Segment und Offset aufgeteilt zu werden.
Und wie immer: nicht ohne Beispiel? Es ist nicht klar ob du vielleicht deinen ptr falsch castest oder sowas und deswegen komische Ergebnisse kommen... MK_FP erzeugt einen far pointer Also sollte etwas in der Form funktionieren
1 | int far* cptr = ... malloc oder sonstiger far pointer |
2 | assert(MK_FP(cptr),MK_OFS(cptr))==cptr); |
cppbert schrieb: > Und wie immer: nicht ohne Beispiel? > > Es ist nicht klar ob du vielleicht deinen ptr falsch castest oder sowas > und deswegen komische Ergebnisse kommen... > > MK_FP erzeugt einen far pointer > > Also sollte etwas in der Form funktionieren > int far* cptr = ... malloc oder sonstiger far pointer > assert(MK_FP(cptr),MK_OFS(cptr))==cptr); Auf dem Tablet tippen ist muell... assert(MK_FP(MK_SEG(cptr),MK_OFS(cptr))==cptr);
Was ist eine Malloc-Adresse? Die Adresse der Funktion malloc im Speicher? Meinst du nicht vielleicht einfach einen Pointer?
Wenn das ein far-pointer ist, sind das zwei 16 Bit Werte für Segment und Offset, die Zusammen in einem 32 Bit Wert gehalten werden. Highword ist Segment, Lowword ist Offset. Als Hexwert ist das besser zu erkennen.
Hallo,guten Tag.
Ich möchte mit "movedata" den bestimmten Bereich aus malloc jeweils in
den VGA-Bereich kopieren.
movedata(segment,offset,0xa000,0,64000);
-----------------------------------------------
Meinst du nicht vielleicht einfach einen Pointer?.......
----------------------------------------------
Wenn der Wert dann so genannt wird : ja.
> Es ist nicht klar ob du vielleicht deinen ptr falsch castest oder sowas
Das mit dem Poken funktioniert ja:
---------------------------------------------
void mal_vga1(unsigned char* p)
{
unsigned short y;
for (y = 0; y <=63999; y++)
{
pokeb (VIDEO_SEGMENT, y,*(p+y));
}
}
void mal_vga2(unsigned char* pp)
{
unsigned short y;
for (y = 0; y <=63999; y++)
{
pokeb (VIDEO_SEGMENT, y,*(pp+y));
}
}
---------------------------------------------
Das ist mein Programm welches nicht funktioniert:
--------------------------------------------
#include <dos.h>
#include <conio.h>
#include <io.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <mem.h>
#define VIDEO_SEGMENT 0xA000
#define SCREEN_WIDTH 320
unsigned char *p;
unsigned char *pp;
void SetTextMode ()
{
_AH = 0;
_AL = 0x03;
geninterrupt (0x10);
}
void SetMode13h ()
{
_AH = 0;
_AL = 0x13;
geninterrupt (0x10);
}
void vga_cls ()
{
long y;
for (y = 0; y <= 64000; y++)
{
pokeb (VIDEO_SEGMENT, y, 0);
}
}
void voll(unsigned char* p, unsigned char* pp)
{
unsigned short y;
for (y = 0; y <=63999; y++)
{
*(p+y)=117;
*(pp+y)=45;
}
}
int main ()
{
char cmd;
p = malloc(64000 * sizeof(char));
pp = malloc(64000 * sizeof(char));
SetMode13h ();
do
{
cmd = toupper(getch());
switch (cmd)
{
case 'Q':
voll(p, pp);
break;
case 'W':
movedata(segment,offset,0xa000,0,64000);
break;
case 'S':
movedata(segment1,offset1,0xa000,0,64000);
break;
case 'C':
vga_cls ();
break;
}
} while (cmd != 'E');
SetTextMode();
}
---------------------------------------
:
Bearbeitet durch User
So sieht es nach meinen nicht korrekten Berechnungen aus wenn ich die erste Farbe aus dem 1. malloc-bereich nach VGA kopiere. Die 2. Farbe reagiert dann nicht mehr. Kann aber nach dem drücken von "E" zum Textmodus zurückschalten. Programm ist nicht abgestürtz. Gruss
Dafür sind die Makros FP_OFF und FP_SEG (aus dos.h) da. (Ich habe hier ein Buch für Quick-C 2.0. Da steht, dass die Makros auch in Turbo-C 2 existieren.)
1 | movedata(FP_SEG(pp),FP_OFF(pp),0xa000,0,64000); |
Bedenke, dass du dafür far-Pointer brauchst. Die kann man explizit definieren oder ein entsprechendes Speichermodell verwenden.
Peter B. schrieb: > for (y = 0; y <= 64000; y++) // macht 64001 Durchläufe > .... > for (y = 0; y <=63999; y++) // macht 64000 Durchläufe Du solltest dir endlich mal den C-Style aneignen
1 | for (y = 0; y < 64000; y++) // macht 64000 Durchläufe |
Weil in der Bedingung die 64000 steht, sieht man sofort ohne Nachrechnen wieviele Durchläufe es sind. Beachte auch, dass dort nur ein < steht (kein <=).
:
Bearbeitet durch User
Danke für die Info und Hilfe. Gruss
https://en.wikipedia.org/wiki/Far_pointer Mit dem MK_FP Makro ist das aber besser. Da ist auch noch ein Link zu https://en.wikipedia.org/wiki/Intel_Memory_Model
------------------------- Mit dem MK_FP Makro ist das aber besser. ------------------------- Wobei ist jetzt bitte der Vorteil bei meiner Grafikübertragung? Gruss
Peter B. schrieb: > ------------------------- > Mit dem MK_FP Makro ist das aber besser. > ------------------------- > > Wobei ist jetzt bitte der Vorteil bei meiner Grafikübertragung? > > Gruss Hier nicht direkt. Aber man könnte das Makro für eine andere Architektur ändern und der Code würde trotzdem funktionieren.
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.