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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Peter B. (funkheld)


Bewertung
-1 lesenswert
nicht 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 :
DECLARE sub testar CDECL (byval a&, byval b&)

rem $dynamic 
dim array&(1 to 32000)

cls
for x% = 1  to 10
  array&(x%) = x% * 100
next

segi&=varseg(array&(1))
ofsi&=varptr(array&(1))

call testar(segi&,ofsi&)

print array&(5)


Turbo C:
far testar(long segadr, long ofadr)
{
 
  int x;
  
  for (x =1; x <=10; x++)
   {
      
   }
}

: Bearbeitet durch User
von cppbert (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Danke für die Info.

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

von cppbert (Gast)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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
DECLARE sub testar CDECL (byval a%, byval b%)

rem $dynamic 
DIM Array(1000)

FOR x% = 0 TO 100
  Array(x%) = 0
NEXT

segi%=varseg(array(0))
ofsi%=varptr(array(0))

call testar(segi%,ofsi%)

for a%=0 to 10
  print array(a%)
next


Turbo C : array.c
far testar(int segadr, int ofadr)
{ 
  int x;
  int* array;
  
  array = (int*)MK_FP(segadr,ofadr);
  
  for (x =0; x <=10; x++)
  {
    array[x]=x*50;
  }
 }

: Bearbeitet durch User
von cppbert (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.