Bereich in Bereich kopieren

    • Bereich in Bereich kopieren

      Ich hab mal wieder ein ganz banales Problem: ich will einen Bereich in einen anderen kopieren. Dabei ist der Zielbereich großer als der Quellbereich und jener soll auch nicht an den Anfang kopiert werden. Gibts da profaneigene Mittel oder muss ich auf APIs zurückgreifen? Ich hab in der Hilfe nichts gefunden. APIs sind kein Problem, es wäre mir aber lieber das mit hauseigenen Mitteln zu lösen.
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/64TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.1, 12/2017)
      http://jacdelad.bplaced.net
    • Bei den Bereichs-Funktionen/Befehlen hast du doch das Offset :
      Also so :


      Quellcode

      1. Declare Memory bereich, bereich1, bereich2
      2. Cls
      3. Dim bereich, 100
      4. Dim bereich1, 4
      5. Dim bereich2, 15
      6. Long bereich1, 0 = 100
      7. String bereich2, 0 = "Hello World !"
      8. Long bereich, 10 = Long(bereich1, 0)
      9. String bereich, 20 = String$(bereich2, 0)
      10. Print Long(bereich, 10)
      11. Print String$(bereich, 20)
      12. Waitkey
      Alles anzeigen
      An 11. Stelle steht dann die 100 und ab der 21. Stelle der String.

      Außerdem kann man ja auch noch mit Strukturen, Unions und Arrays
      von Bereichen arbeiten. Das geht evtl. etwas leichter.

      Oder meinst du jetzt was ganz anderes ?

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von H.Brill ()

    • Naja, ist String$() auch geeignet wenn der Bereich andere Daten enthält?

      Ich hätte sonst RtlMoveMemory oder RtlCopyMemory oder wie die API heißt genommen. Oder auch Ltr..., falls das schneller ist.
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/64TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.1, 12/2017)
      http://jacdelad.bplaced.net
    • Ja ich weiß, aber ich könnte mir vorstellen, dass die Geschwindigkeit drunter leidet. Soweit ich weiß sind Operationen mit Strings recht langsam. Ich glaube ich jutze einfach die API, das ist schnell gemacht.

      Danke für die Mühe.
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/64TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.1, 12/2017)
      http://jacdelad.bplaced.net
    • Ich hab grad geschaut, die API CopyMemory kopiert einen Bereich in einen anderen, aber das geht nicht mit Offset. Weiß jemand wie das geht?
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/64TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.1, 12/2017)
      http://jacdelad.bplaced.net
    • Und möchtest du mich an deiner Weisheit teilhaben lassen?
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/64TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.1, 12/2017)
      http://jacdelad.bplaced.net
    • Ach so, das war ernst gemeint....
      CopyMemory ist mit XProfan so nicht ohne weiteres nutzbar. Was du stattdessen nutzen solltest, ist RtkMoveMemory.

      Microsoft schrieb:

      Remarks

      This function is defined as the RtlCopyMemory function. Its implementation is provided inline. For more information, see WinBase.h and WinNT.h.
      If the source and destination blocks overlap, the results are undefined. For overlapped blocks, use the MoveMemory function.

      MoveMemory schrieb:

      Remarks
      This function is defined as the RtlMoveMemory function. Its implementation is provided inline. For more information, see WinBase.h and Winnt.h.
      Die Adresse einer Bereichvariablen ist Variable#. Will du den Bereich 4 Bytes ab dem Offset haben, ist das Variable# + 4.
      ________________________________________________________

      PPFScanner PPFS Android MisterXMail@web.de
      Mfg AHT
    • Die Bereiche überlappen sich nicht, wo ist da der unterschied zwischen Copy und Move?
      Außerdem hatte ich nicht damit gerechnet zur Adresse des Bereichs einfach was zu addieren. Das erschien nur zu einfach.
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/64TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.1, 12/2017)
      http://jacdelad.bplaced.net
    • HM, ok. Macht ja dann eh keinen Unterschied.
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/64TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.1, 12/2017)
      http://jacdelad.bplaced.net
    • Jo, ich weiß. Da ist auch die Richtung entscheidend. Aber hab ja geschrieben, dass es 2 Bereiche sind. Da ists eigentlich egal.
      XProfan-Semiprofi (XProfan X4+XPIA+LemonEd) :thumbsup:
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/64TB HDD+256GB Samsung 960 EVO (3.2GB/lesen, 1.9GB/s schreiben :top: )
      XBox Classic 10GB/360S 500GB/One S 2TB/One X Scorpio Edition/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG :-D
      Samsung Galaxy S6 edge pearlwhite mit 128GB und Nexus ROM/XGOSP (Android 8.1, 12/2017)
      http://jacdelad.bplaced.net
    • Quellcode

      1. $H "C:\XProfan\Include\Windows.ph"
      2. ' *************************************
      3. ' bool = Move_Mem( pointer Ziel, Quelle [, long Anzahl] )
      4. ' Speicherinhalte kopieren
      5. ' Der angegebene Quellbereich wird in den Zielbereich kopiert.
      6. Proc Move_Mem
      7. Declare long PC
      8. PC = %PCount
      9. Declare pointer Ziel, Quelle, long zLen, qLen, Anzahl
      10. If PC = 2
      11. Parameters pointer Ziel2, Quelle2
      12. Ziel = Ziel2
      13. Quelle = Quelle2
      14. Else
      15. Parameters pointer Ziel3, Quelle3, long Anzahl3
      16. Ziel = Ziel3
      17. Quelle = Quelle3
      18. Anzahl = Anzahl3
      19. EndIf
      20. Case (Ziel = 0) or (Quelle = 0) : Return 0
      21. zLen = SizeOf_Mem( Ziel )
      22. qLen = SizeOf_Mem( Quelle )
      23. Case zLen < qLen : qLen = zLen
      24. CaseNot qLen : Return 0
      25. CaseNot Between(Anzahl, 1, qLen) : Anzahl = qLen
      26. ~MoveMemory( Ziel, Quelle, Anzahl )
      27. Return 1
      28. EndProc
      29. ' *************************************
      30. ' long SizeOf_Mem( long pMem )
      31. ' Größe des belegten Speichers ermitteln
      32. ' Ermittelt die Speichergröße auf die der Speicherzeiger zeigt.
      33. ' Liefert die Größe des Bereiches zurück.
      34. Proc SizeOf_Mem
      35. Parameters pointer pMem
      36. Declare handle hMem
      37. Var long Size = 0
      38. CaseNot pMem : Return 0
      39. hMem = ~GlobalHandle( pMem )
      40. If hMem
      41. Size = ~GlobalSize( hMem )
      42. CaseNot Size : ~GetLastError()
      43. EndIf
      44. Return Size
      45. EndProc
      Alles anzeigen
      Programmieren, das spannendste Detektivspiel der Welt.