Seite 4 von 6

Verfasst: 20.02.2005 21:12
von Lupo
Danke Andre :allright:

Sieht ja mächtig kompliziert aus und ist alles in Englisch /:-> , da muss ich wohl durch.

Danke

LUPO

Verfasst: 20.02.2005 21:16
von MVXA
ich bezeichne ASM gerne so: "primitives Basic auf mehrere zeilen verteilt" :mrgreen:. Wenn man raft wozu die befehle sind ist es eigentlich ganz einfach :lol:.

Verfasst: 20.02.2005 21:38
von Kaeru Gaman
ASM war schliesslich die allererste programmiersprache überhaupt.

es ging nur darum, den zahlen, die die CPU verarbeitet, Buchstabenkombinationen zuzuordnen,
damit menschen es besser verstehen.

alles was danach kam, bedeutete, gruppen von ASM-anweisungen in einen begriff zu packen.

da die 2nd-Generation-Languages
COBOL (COmmon Business Oriented Language) -> für die Wirtschaft
und
FORTRAN (FORmula TRANslation) -> für die Wissenschaft
sehr spezifisch waren, hat man einen
BASIC (Beginners All-purpose Symbolic Instruction Code) -> Allzweck-Anfängercode
entwickelt.

Häää

Verfasst: 04.12.2006 01:02
von Xaby
Ich hab folgendes ...

Structure Teebeutel

Taschentuch.s
Kannerbse.s

EndStructure

Paul.Teebeutel(100)

Es sind aber nur zehn Positionen von Paul beschrieben.

Ich wollte Paul nach Taschentuch sortieren lassen, aber trotzdem Paul für Bearbeitung Rückgängig erhalten.

Hab mir gedacht, am einfachsten wäre

Zwischen.Teebeutel
For x=0 to zehn
CopyStructureElementels(Paul(x), Zwischen(x))
Next

Nur nun kommt es ...
Wie müsste dieser Copy-Befehl aussehen?
Ich meine, stellt euch mal vor, ihr habt eine Liste, mit 100 Structures.

Am liebsten wäre mir ja ein zweidimensionales Array, aber da scheine ich beim Sortieren oder ReDimmen immer Fehler zu machen und ich kann mir auch nicht aussuchen, nach welcher ,,Spalte,, es sortiert werden soll.

Wie kann man eigentlich eine Structure erzeugen, die dynamisch ist?

Structure Peter
For x=0 to 30
CreateDings("Name_"+Str(x),s)
Next
EndStructure

CreateDings macht folgendes:

Erstellt Variable
Name_0.s

Und in der Schleife dann halt nach Vorschrift.

Denkbar wäre auch so eine Art:

Sturcture Heinz
Dings.s(10)
EndStructure

Aber kann ich dann den SortStructureArray-Befehl auch einzeln an meine einzelnen Felder anpassen? Ich glaube nein.

Oder muss ich, wenn ich Tabellen-Spalten sortieren will, gleich unumgänglich mit Datenbanken anfangen? Oder zu Fuß alle Structures eingeben, obwohl ich noch gar nicht weiß, wie viele Spalten ich benötige?

Kann es sein, dass die Befehle für PB nicht stabil sind?
Wenn ich gleiche Inhalte habe, dann dürfen die sich doch in der Position nicht verändern oder?


1: AA, BB
2: AB, CD
3: GD, BB

Wenn ich jetzt sortieren lasse nach AUFSTEIGEND und zweite Spalte

1: GD, BB
2: AA, BB
3: AB, CD

>> was soll ich dazu sagen? Ein Wort, das der hart ist und was in die Toieltte gehört.

Ich würde gern folgendes

1: AA, BB
2: GD, BB
3: AB, CD

>> Der Vorteil ist nämlich, sobald ich nach BB suche,
kommt mein Eintrag, der unsortiert oben als erstes war auch wieder als erstes.

Kann man irgendwas umstellen, dass die PB-Sortierung stabil wird?

Achso und habt ihr schon mal mit OpenOffice.org 2.0 Calc ...
Sortiert?

Das sortiert ohne zu fragen einfach andere Spalten ebenfalls mit.

Ist auch doof. Weiß jemand da vielleicht Rat?


Dank euch /:->

Mein Code

Verfasst: 04.12.2006 05:16
von Xaby

Code: Alles auswählen

maxrech.l=1000 ; Anzahl Positionen

Structure DB_RNG
  ArtNr.s
  LiefDatum.s
  KW_RechNr.s
  Anzahl.s
  Dateiname.s
EndStructure

Global Dim ArtRech.DB_RNG(maxrech);
Global RechPos.l

Wie ihr euer strukturiertes Array voll bekommt, wisst ihr sicherlich selbst am besten :D

Zuerst wird das Array nach ArtNr (Artikelnummer) sortiert.

ACHTUNG irgendwo muss ein Flüchtigkeitsfehler sein, bin aber schon etwas müde, vielleicht stoß ich drauf-

Code: Alles auswählen

Procedure SortRech()
  Redim ArtRech.DB_RNG(RechPos) ; Hab mein Array von 1 an erst beschrieben
  SortStructuredArray(ArtRech(),2,OffsetOf(DB_RNG\ArtNr),#PB_Sort_String)
  
  x.l=0
  Repeat
    y=1
    x+1
    While (ArtRech(x)\ArtNr=ArtRech(x+1)\ArtNr) And (x+1<RechPos)
      x+1
      y+1
      
    Wend
    If y>1
    Dim Zw.DB_RNG(y-1)  
      Debug "y :  "+Str(y)
      For i=0 To y-1
        Debug "i : "+Str(i)
        Debug "x : "+Str(x)
        Zw(i)\ArtNr=ArtRech(x-y+1+i)\ArtNr
        Zw(i)\LiefDatum=ArtRech(x-y+1+i)\LiefDatum
        Zw(i)\KW_RechNr=ArtRech(x-y+1+i)\KW_RechNr
        Zw(i)\Anzahl=ArtRech(x-y+1+i)\Anzahl
        Zw(i)\Dateiname=ArtRech(x-y+1+i)\Dateiname 
      Next
      SortStructuredArray(Zw(),2,OffsetOf(DB_RNG\LiefDatum),#PB_Sort_String)
      For i=0 To y-1
        ArtRech(x-y+1+i)\ArtNr=Zw(i)\ArtNr
        ArtRech(x-y+1+i)\LiefDatum=Zw(i)\LiefDatum
        ArtRech(x-y+1+i)\KW_RechNr=Zw(i)\KW_RechNr
        ArtRech(x-y+1+i)\Anzahl=Zw(i)\Anzahl
        ArtRech(x-y+1+i)\Dateiname=Zw(i)\Dateiname
      Next
      Dim Zw.DB_RNG(0)
    EndIf
    
  Until x>=RechPos-2 
 
EndProcedure
Danach wird die geordnete Liste durchsucht und die selben Artikelnummern werden Nachdatum sortiert.

Hinweis: mein Datum hat das folgende Fotmat: 2006|12|04
Wenn zuerst das Jahr kommt, dann Monat und danach der zweistellige Tag, ist eine Überprüfung einfacher.

Könnt ja mal versuchen:

Code: Alles auswählen

IF "01.12.2006" > "12.01.2006"
  Debug "Hallo"
EndIf
Hallo wird nicht angezeigt. Weil 01 kleiner als 12 ist.
Wie gesagt, wenn ihr die Positionen vertauscht, habt ihr es einfacher.

Code: Alles auswählen

IF "20061201" > "20060112"
  Debug "Hallo"
EndIf
Hoffe, dem ein oder anderen konnte der Code etwas helfen.
Er müsste eigentlich selbsterklärend sein.

Ansonsten schaust du hier:

AA, CD, BB
AA, QD, AC
BB, CD, BA
BB, DF, AA
BB, CD, BC

Array ist nach erster Spalte sortiert.

Nun schaut meine While-Schelife nach, wie oft der Artikel in der ersten Spalte steht. Im Beispiel wäre es jetzt 2 (AA)
Also ist y größer eins.

Jetzt wird ein Teil-Array erzeugt. Dieses wird wieder sortiert.
Und danach wieder zurück in den Haupt-Array geschrieben.

Den Code zwischendurch könnte man sicherlich noch kleiner machen, wenn es einen CopyStructuredArray(Quelle,Ziel,von, bis)
geben würde :shock:

Gruß (vor allem an Kiffi), Folker :allright:

Verfasst: 04.12.2006 11:08
von Xaby
Mir ist noch was eingefallen.

Vielleicht muss ich gar keine Kopie eines Teil-Arrays anlegen.

Kann es nur gleich nicht versuchen, denke aber, dass man dafür die optionalen Start und Ende-Parameter nutzen kann.

Eure Meinung?

:allright:

Verfasst: 04.12.2006 11:18
von Kaeru Gaman
> Ich wollte Paul nach Taschentuch sortieren lassen, aber trotzdem Paul für Bearbeitung Rückgängig erhalten.

am besten erstellst du ein Array Backup.Teebeutel,
in das du den kompletten Paul kopierst, egal wie voll er ist.
das kannst du dann für eine UNDO-funktion benutzen.

zu dem anderen problem:
> Der Vorteil ist nämlich
ist das ein vorteil?
der momentane vorteil dürfte sein, dass der algorithmus schnell und sauber ist.
wenn du nicht nach erster spalte sortierst, gibt es keinen grund,
warum die erste spalte in irgendeiner form sortiert sein sollte.

teste doch mal aus, ob das grundsätzlich so ist, dass eine alte subsortierung umgekehrt wird,
dann kannst du das ausnutzen, indem du zuerst absteigend nach
erster spalte sortierst und danach aufsteigend nach zweiter.

Verfasst: 04.12.2006 12:42
von Xaby
Versteh zwar nicht, was du so meinst :mrgreen:

Aber hier eine funktionierende Version, vielleicht werd ich ja auch mal im CodeArchive auftauchen :D

Code: Alles auswählen

Procedure SortRech()
  Redim ArtRech.DB_RNG(RechPos-1) ; Hängt damit zusammen, wie ich das Array beschreibe
  SortStructuredArray(ArtRech(),2,OffsetOf(DB_RNG\ArtNr),#PB_Sort_String) 
  x.l=-1
  Repeat
    y=0
    x+1
    While (ArtRech(x)\ArtNr=ArtRech(x+1)\ArtNr) And (x+1<RechPos)
      x+1
      y+1 
    Wend
    If y>0
      SortStructuredArray(ArtRech(),2,OffsetOf(DB_RNG\LiefDatum),#PB_Sort_String,x-1,x+y-1)
    EndIf
    
  Until x>=RechPos-2 
EndProcedure
Klappt prima. Liefert jetzt genau das selbe Ergebinis wie
OpenOffice.org 2.0 Calc
wenn ich dort erst nach ArtikelNummer, dann nach Lieferdatum sortiere.

An Kaeru,

die Frage ist ja nicht, ein BackUp zu machen, um eine Undo-Funktion zu haben, sondern einen Befehl, der mir mein Array kopiert.
Mach mal einen konstruktiven Vorschlag.

Denn wie ich das so in der Hilfe gelesen habe und im Forum mal gestöbert habe, gibt es einen Befehl, der ungefähr so aussehen könnte und das macht, was er verspricht nicht:

CopyStructuredArray(Quelle,Ziel,von, bis)

Und gibts einen, der CopyStructuredArray(Quelle,Ziel) das wenigstens kann?

Und wie gesagt, wie kann man flexibel variable die Stucture verändern?

Dank dir trotzdem :allright:


>> Für die Wunschliste

SortStructuredArrayMoreChoice(
(
ArrayName(), Option1, OffsetOf(Struktur\Feld), Typ1, Option2, OffsetOf(Struktur\Feld), Typ2, Option3, OffsetOf(Struktur\Feld), Typ3
[, Start, Ende]
)


Macht natürlich den Befehl lang und unübersichtlich.
Jetzt hätte man aber quasi die Sortierfunktion von einem Tabellenkalkulationsprogramm in einem Befehl.

Es könnte noch eine Option eingeführt werden:
4 : Sortiert nicht

Oder man regelt die Sache mit den Flags anders. Denn manchmal will man ja auch nur nach zwei Dingen sortieren.
5 : stabil-sort (slower, but cooler) /:->

Der Name des Befehls war jetzt ne spontane Eingebung. <)

Verfasst: 04.12.2006 12:51
von Kaeru Gaman

Code: Alles auswählen

Structure Teebeutel 
  Taschentuch.s 
  Kannerbse.s 
EndStructure 

Dim Paul.Teebeutel(100), Backup.Teebeutel(100)

; --- werteeingabe in paul

; Backup erstellen:
For n=0 to 100
  Backup(n) = Paul(n)
Next

; --- Paul neu sortieren

; UNDO
For n=0 to 100
  Paul(n) = Backup(n)
Next
> die Frage ist ja nicht, ein BackUp zu machen, um eine Undo-Funktion zu haben
hast du aber so ausgesagt
> Ich wollte Paul nach Taschentuch sortieren lassen, aber trotzdem Paul für Bearbeitung Rückgängig erhalten
so etwas nennt sich UNDO-funktion, und das macht man mit nem Backup.

> sondern einen Befehl, der mir mein Array kopiert
na das macht diese schleife in meinem code. das meinte ich mit
> in das du den kompletten Paul kopierst, egal wie voll er ist.

wo ist also deine schwierigkeit?

Verfasst: 04.12.2006 13:36
von Xaby
Ach Kaeru, ist schon nicht so einfach mit dir, was.

Solltest weniger versuchen mich zu belehren als Code zu schreiben, der funktioniert. Denn soweit war ich doch auch schon.

Um eine Kopie des Arrays zu machen, muss man jede einzelne
Structure-Untervariable (1.Array) einer Structure-Untervariable (Kopie) zuweisen.

Und das ist ätzend.

Schreib ruhig mal den Code, in einen Editor:

Code: Alles auswählen

Structure teebeutel
  x.l
  y.l
EndStructure

Dim paul.teebeutel(100)
Dim heinz.teebeutel(100)

For x=0 To 100
  heinz(x)=paul(x)
Next
Und dann sag mir was passiert ...


>>
Ansatz, vielleicht macht mal ein einziges Array, was doppelt so groß ist.
Aber auch das würde nicht das Problem lösen, dass es keinen
CopyStructuredField(Quelle, Ziel)
Befehl gibt.

Jetzt verstehst du mich vielleicht :? :allright: