Forum: PC-Programmierung Mit Turbo C 2 in ein Array schreiben von PDS-Basic.


von Peter B. (funkheld)


Lesenswert?

Hallo , guten Tag.

Wie kann man bitte in eine Array schreiben von PDS-Basic mit Turbo C 2.0
Es sollen bitte die ersten 10 Werte (Int) ersetzt werden von Turbo C.

Ich übergebe an Turbo C die Segment und  Ofs-Addr.

Danke.

Basic :
1
DECLARE sub testar CDECL (byval a&, byval b&)
2
3
rem $dynamic 
4
dim array&(1 to 32000)
5
6
cls
7
for x% = 1  to 10
8
  array&(x%) = x% * 100
9
next
10
11
segi&=varseg(array&(1))
12
ofsi&=varptr(array&(1))
13
14
call testar(segi&,ofsi&)
15
16
print array&(5)


Turbo C:
1
far testar(long segadr, long ofadr)
2
{
3
 
4
  int x;
5
  
6
  for (x =1; x <=10; x++)
7
   {
8
      
9
   }
10
}

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

-Jetzt wieder tc 2, letzter post war noch tc 3?
-long als seg und ofs macht keinen sinn, sind jeweils doch nur 16bit
-MK_FP hast du doch schon verwendet?

int* array;
...

array = (int*)MK_FP(seg,ofs);

....

array[0] ist dann dein 1. Eintrag

Btw: wenn es geht immer von 0 Anfangen in den Arrays, sonst macht man 
kleine blöde Fehler

von cppbert (Gast)


Lesenswert?

Also schreib eher

"Dim array(0 to 32000-1) as byte"

Oder besser

Dim array(32000) as byte

Entspricht dann einem

Unsigned char array[32000] in c

von Peter B. (funkheld)


Lesenswert?

Danke für die Info.

PDS kennt kein Byte-Format.
Es fängt bei Int an.

von cppbert (Gast)


Lesenswert?

Peter B. schrieb:
> Danke für die Info.
>
> PDS kennt kein Byte-Format.
> Es fängt bei Int an.

Was willst du denn mit den 32k machen?
grafikspeicherkopie wie in den letzten tests?

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Brauche ich später für die Grafik.
Damit es erstmal funktioniert nehme ich erstmal 1000.

Zur Zeit kommt unten die Fehlermeldung.

Was muss bitte in der linker.cmd evtl geändert werden oder anders wo?
Es fehlt ja bestimmt irgendeine LIb  die ich nicht kenne für die _MK_FP
Letztes mal wurde eine cs.lib eingebaut für LONG die ich nicht kannte.

Danke.



Build.bat :
-------------------------
BC xarray xarray xarray
tcc -c array.c
link @linker.cmd
--------------------------

linker.cmd :
---------------------------
xarray.obj +
array.obj
xarray.exe
xarray.lst
cs.lib +
brt71enr.lib
--------------------------


PDS-Basic: xarray.bas
1
DECLARE sub testar CDECL (byval a%, byval b%)
2
3
rem $dynamic 
4
DIM Array(1000)
5
6
FOR x% = 0 TO 100
7
  Array(x%) = 0
8
NEXT
9
10
segi%=varseg(array(0))
11
ofsi%=varptr(array(0))
12
13
call testar(segi%,ofsi%)
14
15
for a%=0 to 10
16
  print array(a%)
17
next


Turbo C : array.c
1
far testar(int segadr, int ofadr)
2
{ 
3
  int x;
4
  int* array;
5
  
6
  array = (int*)MK_FP(segadr,ofadr);
7
  
8
  for (x =0; x <=10; x++)
9
  {
10
    array[x]=x*50;
11
  }
12
 }

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

1. Ist es jetzt TC 2 oder TC 3?
2. Warum faengt dein x in c bei 1 an und immer noch dieses <= 10
Dein 1. Eintrag im array wird dadurch ignoriert
3. MK_FP ist ein Macro also keine Funktion die aus einer obj kommt
4. Du leitest die Ausgabe von build.bat immer noch nicht mit
Build.bat > out.txt 2>&1 in eine Textdatei um sondern postest wieder 
Screenshots
5. Immer noch keine vollstaendigen c und bas Dateien im Anhang
6. Deiner c funktion fehlt der rueckgabe typ, zumindest void

6 Punkte ergeben auch 6 antworten

von Michi (Gast)


Lesenswert?

Peter B. schrieb:
> Zur Zeit kommt unten die Fehlermeldung.

Guck mal hier, da findest Du vlt. was Passendes:

https://docs.microsoft.com/de-de/cpp/build/reference/compiler-controlled-link-options?view=vs-2019

von Michi (Gast)


Lesenswert?

cppbert schrieb:
> 2. Warum faengt dein x in c bei 1 an und immer noch dieses <= 10

Das wird wohl daran liegen, dass manche Arrays nullbasiert und andere 
wiederum 1-basiert anfangen. Man kann auch Speicherstellen außerhalb des 
definierten Bereichs verwenden, z.B. eine [11] nehmen, obwohl vlt. nur 
[10] definiert sind. Wichtig ist dann nur, dass es passieren kann, dass 
der letzte Wert dann auch falsch sein kann.

Es gibt eben halt auch Sprachen, die 1-basiert bei der Arrayindizierung 
beginnen.

cppbert schrieb:
> -Jetzt wieder tc 2, letzter post war noch tc 3?

Turbo C - das kenn ich noch von früher. Gibts ja ganricht mehr heute.

von Peter B. (funkheld)


Lesenswert?

- TC 2
- auf 0 gändert
- auf Void geändert ( weil keine Funktion)
- #include <dos.h> eingebaut

Jetzt funktioniert es . die dos.h hat gefehlt.
Ich habe die .h angefangen zu durchsuchen und bin bei der dos.h 
gelandet.


Ich suche erstmal eine PDF von Turbo 2.01 um zumindest die .h zu finden.

Danke.

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

Peter B. schrieb:
> - auf Void geändert ( weil keine Funktion)
> - #include <dos.h> eingebaut

Wie konnte der c code den kompilieren ohne die Aenderungen?

Deswegen IMMER die umgeleitete build.bat Ausgabe mit anhaengen

von Peter B. (funkheld)


Lesenswert?

Danke.

Die Fehlermeldung kam erst nachdem ich die Exe gestartet hatte.

"Build.bat > out.txt"  funktioniert nicht in der DosBox.

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

Peter B. schrieb:
> Die Fehlermeldung kam erst nachdem ich die Exe gestartet hatte.

Das macht absolut keinen Sinn was du schreibst, Die Fehlermeldung in 
deinem Screenshot kam doch vom Linker also bevor die exe existiert

> "Build.bat > out.txt"  funktioniert nicht in der DosBox.

Was bedeutet "funktioniert nicht" ganz genau

Warum funktioniert es bei mir? Und ohne 2>&1 macht es auch keinen Sinn
Sonst fehlen die Fehlerausgaben in der Textdatei oder die Datei ist 
einfach leer

von cppbert (Gast)


Lesenswert?

cppbert schrieb:
> Das macht absolut keinen Sinn was du schreibst, Die Fehlermeldung in
> deinem Screenshot kam doch vom Linker also bevor die exe existiert

Und dein c code war gar nicht kompilierbar, dos.h hat gefehlt, schreib 
lieber nichts als sachen die total verwirren oder sogar falsch sind

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

Wenn ich die dos.h rausnehme kommt wieder meine Fehlermeldung von oben.

Man muss nur auf den Zahlenwert des Array achten bei C und PDS, 
dementsprechend kommen die Werte mit Print:

PDS 7.1 :
DIM Array(1000)   Single
DIM Array&(1000)  Long
DIM Array%(1000)  Integer
usw...

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

Peter B. schrieb:
> Wenn ich die dos.h rausnehme kommt wieder meine Fehlermeldung von oben.

Wie kann dein tcc ohne die dos.h fehlerfrei kompilieren, die 
macrodefinition fehlt dann doch komplett, könnte sein das der tcc da ein 
bisschen magie walten laesst

Du hast immer nocht nicht geschrieben warum build.bat > out.txt 2>&1 
nicht funktioniert?

von Peter B. (funkheld)


Angehängte Dateien:

Lesenswert?

--------------------------
Wie kann dein tcc ohne die dos.h fehlerfrei kompilieren, die
--------------------------

??? Weiß ich nicht. Erst beim starten von der Exe kommt die 
Bildfehlermeldung. Vielleicht liegt es an der DosBox.
Werden morgen mal auf meinen alten Dos-Rechner testen.

Das out.txt hatte ich nicht gefunden weil es als  Datei : &1 
abgespeichert wird.

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Nun das ist doch eigendlich offensichtlich. TC compiliert auch dann wenn 
die include Datei fehlt. Es gibt aber Warnungen bezüglich nicht 
deklarierter Funktion.
TC setzt einfach MK_FP auf extern. Der Linker sucht dann die Funktion 
_MK_FP. Kann man gut daran erkennen weil der Unterstrich da ist.
Diese Funktion kann's aber nicht geben da MK_FP ein Makro ist.

Die Warnungen sieht er halt nicht ein direkter Aufruf tcc -c array.c 
würde das zeigen.
Alternativ könnte man die Meldungen in der Batch auch in ein c.log 
umleiten

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

Thomas Z. schrieb:
> Die Warnungen sieht er halt nicht ein direkter Aufruf tcc -c array.c
> würde das zeigen.

Sehe ich auch so

> Alternativ könnte man die Meldungen in der Batch auch in ein c.log
> umleiten

Die stderr umleitung klappt bei ihm nicht

von cppbert (Gast)


Lesenswert?

cppbert schrieb:
> Thomas Z. schrieb:
>> Die Warnungen sieht er halt nicht ein direkter Aufruf tcc -c array.c
>> würde das zeigen.
>
> Sehe ich auch so
>
>> Alternativ könnte man die Meldungen in der Batch auch in ein c.log
>> umleiten
>
> Die stderr umleitung klappt bei ihm nicht

ich dachte das ging mal?

2>&1 geht nicht, 2> ist einfach nur stdout

-noconsole schreibt auch keines stderr, stdout bei mir

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.