Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Type Rang sortieren.
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 30.08.2013, 09:41    Titel: Antworten mit Zitat

wie schon von mir gefragt: wieso sortierst du nicht das array komplett?

dann hast du doch was du brauchst?!

rang1 = index1, rang 2 = index2, rang3 = index3 usw.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 30.08.2013, 10:00    Titel: Antworten mit Zitat

Ich verstehe nicht warum du so einen Aufwand machst. Wie ThePuppetMaster es sagte, benutze doch einfach Pointer. Es gibt einen kleinen Unterschied. Bei meiner Sortierung wird bei gleichen zahlen nicht der gleiche rang vergeben, sondern das erste obj im ausgangs array hat immer den höheren rang, bzw. wenn merhere Elemente die gleiche Zahl haben würden diese mehre ränge bekommen, nach Ausgangsposition.


Code:

Randomize Timer


Type Tobj
   zahl As Integer
   zahl_temp As Integer
   rang As Integer
End Type

' --- Deine Version --
Sub Sort1(obj() As Tobj, counter As Integer)
Dim _timer As Single
Dim counts As Integer

counts = 0
_timer = Timer
   
Do   
   Dim tpos As Integer
   Do
      If tpos = counter Then Exit Do
      If obj(tpos).zahl_temp > obj(tpos + 1).zahl_temp Then
         Swap obj(tpos).zahl_temp, obj(tpos + 1).zahl_temp
         If tpos > 0 Then tpos -= 1
      Else
         tpos += 1
      EndIf
   Loop
   
   
   For i As Integer = 0 To counter
      For ii As Integer = 0 To counter
         If obj(i).zahl = obj(ii).zahl_temp Then
            obj(i).rang = ii
         EndIf
      Next
   Next
   
   counts += 1
      
Loop Until (Timer > _timer + 1)
   
Print counts
End Sub


' --- Meine Version mit Pointer Array --
Sub Sort2(obj() As Tobj, pobj() As Tobj Ptr,counter As Integer)
Dim _timer As Single
Dim counts As Integer

counts = 0
_timer = Timer
   
Do   
   Dim tpos As Integer   
   Do
      If tpos = counter Then Exit Do
      If pobj(tpos)->zahl > pobj(tpos + 1)->zahl Then
         Swap pobj(tpos), pobj(tpos + 1)
         If tpos > 0 Then tpos -= 1
      Else
         tpos += 1
      EndIf
   Loop


   For i As Integer = 0 To counter         
      pobj(i)->rang = i
   Next

   
   counts += 1      
Loop Until (Timer > _timer + 1)
   
Print counts
End Sub


' Hauptptogramm
Dim counter As Integer = 30
Dim obj(counter) As Tobj
Dim obj2(counter) As Tobj
Dim pobj2(counter) As Tobj ptr


Dim _timer As Single
_timer = Timer
Dim counts As Integer


Do     
   counts += 1   
Loop Until (Timer > _timer + 1)

Print counts


counts = 0
_timer = Timer


'Generiere Zufällige Wert
For i As Integer = 0 To counter
   obj(i).zahl = Int(Rnd * 100)
   obj(i).zahl_temp = obj(i).zahl
   
   obj2(i).zahl = obj(i).zahl
   obj2(i).zahl_temp = obj(i).zahl   
   pobj2(i) = @(obj2(i))
Next

Print "Deine Sortierung:";
Sort1 obj(),counter
Print "Meine Sortierung:";
Sort2 obj2(),pobj2(),counter   

Sleep

'Vergleiche beide Versionen
Print "Vergleiche:"
For i As Integer = 0 To counter
   Print obj(i).zahl;obj(i).rang,
   Print obj2(i).zahl;obj2(i).rang
Next   
sleep

'Mein Array sortiert ausgeben
Print
Print "Mein Array sortiert ausgeben"
For i As Integer = 0 To counter
   Print pobj2(i)->zahl; pobj2(i)->rang   
Next   

Sleep


Zuletzt bearbeitet von RockTheSchock am 30.08.2013, 12:09, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 30.08.2013, 11:55    Titel: Antworten mit Zitat

Das mit den Pointern sieht auch gut aus!
Nur das die normale z_var ja nicht immer umsortiert werden darf da sonnst ja die obj die ich ausgebe umherzucken da sie immer mit der sortierten z arbeiten. z_soll ja nicht geändert werden ich brauch nur den index...

Glaub bin zu blöd mit dem Kopf durch die Mauer wollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 30.08.2013, 12:04    Titel: Antworten mit Zitat

Warum willst du das Array selbst nicht umsortieren?


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 30.08.2013, 12:15    Titel: Genauere Infos Antworten mit Zitat

@0oFreako0:
Wenn du uns etwas mehr Infos zukommen lässt, was diese Objekte genau machen sollen, wäre es auch einfacher dir genaue Antworten zu geben

In welchem Kontext stehen diese Objekte. Sind es Art Fenster/Ebenen mit unterschiedlicher Größe, die Übereinander dargestellt werden sollen? Is es ein Z-Buffer für 3d objekte im Raum, um nicht sichbare / überlagerte Objekte vom Rendern auszuschließen?

In welchem Kontext brauchst du die Z-Liste der Objekte. Was sind das für Objekte? Über wie viele Objekte reden wir hier? Wie viele Objekte pro sekunde sollen verändert werden?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 30.08.2013, 15:54    Titel: Antworten mit Zitat

@OoFreakoO:
Da du warscheinlich Grafik-Objekte in einer 3D-Umgebung Ausgeben willst
hilft Dir vielleicht dieser Link hier weiter.
http://de.wikipedia.org/wiki/Depth-Sort-Algorithmus
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 03.09.2013, 09:15    Titel: Antworten mit Zitat

Habs hinbekommen war nur zu blöd die anderen koordinaten von den objekten mit an die verschobene stelle im array mit zu verschieben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 03.09.2013, 09:18    Titel: Antworten mit Zitat

Meine Frage an die ASM experten

Code:


Type Tpunkt
   
   x As Integer
   y As Integer
   
End Type

Dim punkt(2) As Tpunkt

Asm
   
   
End Asm




For i As Integer = 0 To 2
   Print punkt(i).x
   Print punkt(i).y
Next


Sleep
End




Wie kann ich die weiteren arrays ansteuern in asm um so sachen dort in asm zu verändern?

Bei einem UDT Objekt kann man ja mit zb:

mov esi, [punkt]
mov eax,10
mov [esi], eax
mov esi, [punkt+4]
mov [esi], eax

jeweilt x und y mit einem Wert belegen.
Doch wie steuer ich das in einen mehrfach Array an?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 03.09.2013, 10:28    Titel: Antworten mit Zitat

Code:
Type Tpunkt
  x As Integer
  y As Integer
End Type

Dim punkt(2) As Tpunkt
Dim As Integer b = SizeOf(Tpunkt)
Asm
  mov eax, 10
  mov ecx, 20
  mov [punkt], eax      'punkt(0).x
  mov [punkt+4], ecx    'punkt(0).y
  mov ebx, [b]
  mov [punkt+ebx], eax  'punkt(1).x
  mov [punkt+ebx+4], ecx'punkt(1).y
  Add ebx, [b]
  mov [punkt+ebx], eax  'punkt(2).x
  mov [punkt+ebx+4], ecx'punkt(2).y
End Asm

For i As Integer = 0 To 2
  Print punkt(i).x
  Print punkt(i).y
Next

Sleep

oder
Code:
Type Tpunkt
  x As Integer
  y As Integer
End Type

Dim punkt(2) As Tpunkt
Dim As Integer b = SizeOf(Tpunkt)
Asm 
  mov eax, 10
  mov ecx, 20
  lea esi, [punkt]
  mov [esi], eax      'punkt(0).x
  mov [esi+4], ecx    'punkt(0).y
  Add esi, [b]
  mov [esi], eax      'punkt(1).x
  mov [esi+4], ecx    'punkt(1).y
  Add esi, [b]
  mov [esi], eax      'punkt(2).x
  mov [esi+4], ecx    'punkt(2).y
End Asm

For i As Integer = 0 To 2
  Print punkt(i).x
  Print punkt(i).y
Next

Sleep

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 04.09.2013, 11:29    Titel: Antworten mit Zitat

Danke Volta lächeln

Kurze Frage noch, wenn ich ein mehrfach verschachteltes array in asm ansteuern will wie mache ich das dann?

hier mein code:

Code:


Dim _test(0,1) As p

Dim b As Integer = SizeOf(p)



Asm
   
mov eax, 10
mov ecx, 20
lea esi,[_test]
mov [esi],eax   
mov [esi+4],ecx   

   
End asm


'test(0,0).x = 10
'test(0,0).y = 20

Print _test(0,0).x
Print _test(0,1).y

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 04.09.2013, 16:55    Titel: Antworten mit Zitat

Code:
Type p
  x As Integer
  y As Integer
End Type
Dim _test(2,1) As p

Dim b As Integer = SizeOf(p)

Asm
  mov eax, 10
  mov ecx, 0
  lea esi,[_test]
  mov [esi],eax   '_test(0,0).x
  mov [esi+4],ecx '_test(0,0).y
  Add esi, [b]
  inc ecx
  mov [esi],eax   '_test(0,1).x
  mov [esi+4],ecx '_test(0,1).y
  Add esi, [b]
  inc ecx
  mov [esi],eax   '_test(1,0).x
  mov [esi+4],ecx '_test(1,0).y
  Add esi, [b]
  inc ecx
  mov [esi],eax   '_test(1,1).x
  mov [esi+4],ecx '_test(1,1).y
  Add esi, [b]
  inc ecx
  mov [esi],eax   '_test(2,0).x
  mov [esi+4],ecx '_test(2,0).y
  Add esi, [b]
  inc ecx
  mov [esi],eax   '_test(2,1).x
  mov [esi+4],ecx '_test(2,1).y
End Asm


For i As Integer = 0 To 2
  Print _test(i,0).x, _test(i,0).y, _test(i,1).x, _test(i,1).y
Next

Sleep
das ist aber weder schneller noch einfacher als
Code:
_test(0,0).x =10
_test(0,0).y =0
_test(0,1).x =10
_test(0,1).y =1
...

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 04.09.2013, 17:22    Titel: Antworten mit Zitat

Lass das Optimieren sein, bist du mit der Software fertig bist und sie stabil läuft.

Normalerweise kannst du durch Assembler Optimierung die Ausführunggeschwindigkeit maximal vervierfachen bis verachtfachen. Das liegt daran, dass das Rechnen in Registern optimiert werden kann, dadurch dass statt 1x32 Bit Berechnung pro Takt z.b. 4x32 Bit genutzt werden. Das ist abhängig vom Prozessor. Spezifische Prozessoren kann man sicher auch noch viel mehr optimieren, aber dieser Code würde dann z.B. auf einem älteren Prozessor nicht mehr laufen oder auf einem anderen langsamer laufen.

Das wird erreicht indem man SSE Befehle mit größeren Registern nutzt oder aber, indem man mehrere Speicherzellen und Register, die nicht von einander direkt abhängen in den Berechnungen verwendet, sodass moderne Prozessoren automatisch mehrere Berechnungen parallel durchführen. Entscheidend dabei ist dann die richtige Reihenfolge der Befehle, sodass der Prozessor nicht seine interne Verarbeitung unterbrechen muss, um auf eine Berechnung oder einen Speicherzugriff zu warten. http://de.wikipedia.org/wiki/Pipeline_%28Prozessor%29
Auf modernen Mehrkernprozessoren ist es meist besser die Berechnungen auf mehrere Threads zu verteilen, statt alles auf einen Thread zu optimieren.

Du könntest versuchen den "-gen gcc" und "-O" Switch von fbc verwenden.
Ein guter Compiler ist in jedem Fall besser als ein Amateur-Programmierer.

Letztlich ist das Optimieren durch schnelleren Code der allerletzte Schritt in einer Anwendung. Oft ist es viel effektiver am Algorithmus Verbesserungen zu machen. Das bringt oft das 10 bis 100 fache an Geschwindigkeit.
Jede Berechnung die nicht durchgeführt werden muss, ist letzlich schneller als eine, die sehr schnell durchgeführt wird.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 05.09.2013, 10:44    Titel: Antworten mit Zitat

Ok also hätte ich kaum Vorzüge wenn ich arrays in asm ansprechen würde ?
Da ich ja viel im Pixel Bereich code finde ich aber wenn ich Pixel mit asm auf dem screen ausgebe schneller als mit pset. Wo lohnt es sich den im Bereich Gfx coding noch asm einzusetzen?
Ich weiss opengl ist dafür besser ausgelegt fürs gfxing nur ich bin halt nen Oldschool fan.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 05.09.2013, 12:59    Titel: Antworten mit Zitat

PSET ist eine verhältnismäßig langsame Funktion (liegt meines Wissens an den diversen Prüfungen, die durchgeführt werden, um nicht auf falsche Datenbereiche zuzugreifen). Da ist ein direkter Speicherzugriff schneller, aber natürlich auch fehleranfälliger. Ob der direkte Speicherzugriff über ASM allerdings wesentlich schneller ist als der direkte Speicherzugriff über FB-eigene Berechnung, weiß ich nicht; ich denke nicht, dass da der Unterschied übermäßig groß ist. Was Berechnungen angeht, optimiert der Compiler schon ziemlich gut; wichtiger ist, wie RockTheSchock schon sagte, die Berechnungsalgorithmen selbst dahingehend zu optimieren, dass keine überflüssigen Berechnungen stattfinden, also z. B. dass Werte, die eigentlich schon bekannt sind, nicht immer wieder neu berechnet werden.

Äh, ja ... was ich mit diesem Posting eigentlich sagen wollte: du kannst den Geschwindigkeitsgewinn bei PSET nicht vergleichen mit dem Geschwindigkeitsgewinn bei Variablen- oder Speicherzugriffen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz