Kürzeste Lösung für. Add,Ignore next lines until change

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von GlassJoe »

Der Titel sagt eigentlich schon alles.

Ich suche eine noch kürzere und noch leichter verständlichere Lösung, die ohne eine Backup Variable auskommt und weniger die CPU Beansprucht (ständiges Mod umgschalte ist zwar einfallsreicht :D muss aber nicht sein schätz ich) als die hier.

Code: Alles auswählen

  NewList x.s()
  
  For tmp_p = 65 To 90
    AddElement(x.s())
    x.s() = Chr(tmp_p)
    AddElement(x.s())
    x.s() = Chr(tmp_p)
    AddElement(x.s())
    x.s() = Chr(tmp_p)
    AddElement(x.s())
    x.s() = Chr(tmp_p)  
  Next 
  
  ; ForEach x.s()
    ; Debug x.s()
  ; Next
  ; 
  FirstElement(x.s())
  divisor = 2
  For tmp_p = 0 To ListSize(x.s()) -1
    SelectElement(x.s(),tmp_p)
    
    If x.s() <> b$
      Debug "add/set/change/execute/="+x.s() 
      tmp_old$ = x.s()
      divisor = 1 ;/ NOT SAME THEN WE SET THE DIVSOR TO 1. SO THE RYHTIM IS CHANGED 
    Else
      divisor = 2 ;/ WHEN SAME THEN WE SET THE DIVISOR TO 2. SO THAT THE RYHTM IS CHANGED AGAIN
      Debug "ignore="+b$
    EndIf 
    
    If Mod(tmp_p,divisor) = 0 
      b$ = tmp_old$
      ;Debug "HANS="+tmp_p 
    EndIf
    
  Next
Maps (geht nicht, da ich nur nach Path miteinander vergleichen kann, und nicht dran vorbei komme *)
Delete Element (geht nicht da zu jedem Path natürlich auch ein File in der structurierten Linked List gehört)
und ständiger Aufruf der Procedure durch sich selbst (so wie in Recursive Directory Scan examples) geht nicht, da der Code sowieso schon total nerviger Spagetti Code ist.
Und auf eigene komischen While und Repeat Experiemente hab ich kein Bock mehr :mrgreen:

Weil ich viel früher im Prog was bescheuert geschrieben hab, hat es sich viel später im Code (bin bei ~15000 Zeilen)
total beknackt ausgewirkt :bluescreen: und ich muss aus einer Liste die Entrys hat die ungefähr so sind.

Code: Alles auswählen

c:\dir1\blabla1.jpg
c:\dir1\blabla2.jpg
c:\dir1\blabla3.jpg
c:\dir2\blabla1.jpg
c:\dir2\blabla2.jpg
c:\dir2\blabla3.jpg
c:\dir3\blub.jpg
c:\dir4\blub.jpg
c:\dir5\blub1.jpg
c:\dir5\blub2.jpg
c:\dir6\blub.jpg
in eine andere die zusammengehörigen kopieren und die dort abarbeiten lassen, und dann die nächsten zusammengehörigen.

Dazu muss ich natürlich markieren, was zusammen gehört.

* und das aus diesem Grund.

Die Entrys in der Gadget List sind

c:\dir1\
c:\dir2\
c:\dir3\blub.jpg
c:\dir4\blub.jpg
c:\dir5\
c:\dir6\blub.jpg

und in der Linked List, hab ich die Files aus den Verzeichnissen, also so wie im Code Tag.

Was ich gemacht hab ist dir Verzeichnisse in der Gadget List sortieren zu lassen und oben zu plazieren, und die Files extra sortieren und unter den Foldern plazieren lassen (also so wie im Total Commander) so das es in der LL später immerhin halbwegs sinvoll sortiert ist, und es das einfacher macht.
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von NicTheQuick »

Tut mir Leid, ich hab absolut nicht verstanden, was du genau haben möchtest. Der Titel sagt mir überhaupt nicht alles. :D
Fang doch nochmal von vorne an und erklär, was da genau passieren soll. Aber wenn du Glück hast, versteht auch ein anderer hier, was du meinst, und kann dir dann helfen.
Bild
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von GlassJoe »

NicTheQuick hat geschrieben:Tut mir Leid, ich hab absolut nicht verstanden, was du genau haben möchtest. Der Titel sagt mir überhaupt nicht alles. :D
Fang doch nochmal von vorne an und erklär, was da genau passieren soll. Aber wenn du Glück hast, versteht auch ein anderer hier, was du meinst, und kann dir dann helfen.
:lol:

Ich brauche einen Code, der das nächste Element das anders ist als das vorherige, detecten tut, damit ich was damit anfangen kann, in der weiteren Abarbeitung.

Hintergrund:

Ich habe eine Liste mit zb 1000 jpg Files aus zb 5 Verzeichnissen.

Und ich muss die Joblist von einem Mini Thumbail Creator den ich geschrieben hab füttern (am besten durch eine eigene temporäre Linked List die dafür gefüllt wird) und kann dabei keinen Folder angeben der dann rekursiv durchsucht wird.
Die Liste hat ja schon alle Files drin, ist ja schon an anderer Stelle geschehen.

EDIT:

Entry001 | c:\Folder1\ <-- 10 jpg Files -> Draw 10 Files on 1 new jpg File -> Filename 000_Folder1.jpg
Entry002 | c:\Folder2\ <--20 jpg Files- > Draw 20 Files on 1 new jpg File -> Filename 001_Folder2.jpg
Entry003 | c:\Folder3\hans.jpg
Entry004 | c:\Folder3\hans2.jpg
Entry005 | c:\Folder3\hans3.jpg -> Draw 3 Files on 1 new jpg File -> Filename 003-005_Folder3.jpg
Entry006 | c:\Folder4\ <-- 10 Files -> Draw 10 Files on 1 new jpg File -> Filename 006_Folder1.jpg

Und in der Linked List hab ich natürlich nur alle Files drin. Und muss erst 10 füttern, danach 20, dann 3, danach wieder 10.
Es funzt ja auch alles, soweit, nur ist mein Code so abartig umständlich dafür (der im ersten Post ist noch sauber ! und kurz ! der im Programm springt ständig mit nextelement, und prev element hin und her :lol: )
das mir schlecht wird :lol:
Zuletzt geändert von GlassJoe am 23.08.2017 13:31, insgesamt 1-mal geändert.
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von NicTheQuick »

Meinst du so?

Code: Alles auswählen

NewList x.s()

For tmp_p = 65 To 90
	AddElement(x())
	x() = Chr(tmp_p)
	AddElement(x())
	x() = Chr(tmp_p)
	AddElement(x())
	x() = Chr(tmp_p)
	AddElement(x())
	x() = Chr(tmp_p) 
Next


Define *previous.String = FirstElement(x())
Debug "New element: " + x()
While NextElement(x())
	If *previous\s <> x()
		Debug "New element: " + x()
	Else
		Debug "Ignoring: " + x()
	EndIf
	*previous = @x()
Wend
Eine temporäre Variable ist trotzdem notwendig. Ich habe es jetzt aber mit Pointern gemacht, damit keine Strings kopiert werden müssen. Das ist so aber vermutlich die einfachste Möglichkeit.
Bild
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von GlassJoe »

NicTheQuick hat geschrieben:Meinst du so?

Code: Alles auswählen

NewList x.s()

For tmp_p = 65 To 90
	AddElement(x())
	x() = Chr(tmp_p)
	AddElement(x())
	x() = Chr(tmp_p)
	AddElement(x())
	x() = Chr(tmp_p)
	AddElement(x())
	x() = Chr(tmp_p) 
Next


Define *previous.String = FirstElement(x())
Debug "New element: " + x()
While NextElement(x())
	If *previous\s <> x()
		Debug "New element: " + x()
	Else
		Debug "Ignoring: " + x()
	EndIf
	*previous = @x()
Wend
Eine temporäre Variable ist trotzdem notwendig. Ich habe es jetzt aber mit Pointern gemacht, damit keine Strings kopiert werden müssen. Das ist so aber vermutlich die einfachste Möglichkeit.
Ja genau :praise: Danke.

Ich dachte mir schon das es mit while gehen könnte, und eigentlich ganz kurz und Banal ist, aber ich hab total probleme mit dem Verständniss von While Schleifen :lol: immer wenn es losgeht mit sowas wie ich benötige, passiert es das das erste Element nicht reingschmissen wird (oder endloss schleife)
Wenn ich es dann vor der Schleife reinwerfe, ist ja schon das nächste dran, daß dann aber irgendwie den Wert von etwas braucht das ausserhalb der SChleife war, um dann wieder das nächste das ja vl gleich das gleiche ist wie das von gerade eben, und desshalb .......... ach mein Gehirn steigt da schon wieder aus :lol: :lol: :lol:
ich kann sowas
https://postimg.org/image/pfvk1afhr/
in einer Std ganz locker zusammen schreiben, aber sobald Schleifen mit Dupe Detection in's Spiel kommen, steig ich aus :bounce:
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von Josh »

Für diesen Fall haben wir doch ForEach()

Code: Alles auswählen

NewList x.s()
Define *previous.String

For tmp_p = 65 To 90
  AddElement(x()) :  x() = Chr(tmp_p)
  AddElement(x()) :  x() = Chr(tmp_p)
  AddElement(x()) :  x() = Chr(tmp_p)
  AddElement(x()) :  x() = Chr(tmp_p) 
Next

*previous = LastElement (x())

ForEach x()
  If x() <> *previous\s Or ListSize (x()) = 1
    Debug "New element: " + x()
  Else
    Debug "Ignoring: " + x()
  EndIf
  *previous = @x()
Next
@NicTheQuick
Den ersten Eintrag außerhalb der Schleife abarbeiten zu lassen ist nicht unbedingt die feine Art und kann durch die notwendige Codeverdoppelung leicht zu Fehlern führen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von NicTheQuick »

Einfach das letzte Element für den ersten Vergleich nehmen ist falsch. Es funktioniert nicht, wenn alle Elemente in der Liste gleich sind.
Dann lieber so, ebenfalls ohne Dopplung. :wink:

Code: Alles auswählen

Define *previous.String = 0
ForEach x()
   If Not *previous Or *previous\s <> x()
      Debug "New element: " + x()
   Else
      Debug "Ignoring: " + x()
   EndIf
   *previous = @x()
Next
PS.: Kommt mir jetzt grad so vor als ob ich den Bug in deinem Avatar jage. :lol:
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von Josh »

Ja, ist mir nachträglich auch gekommen, dass da noch ein Hund drinnen ist.

P.S.: Wegen meinem Avatar haben sicher schon mehrer auf ihren Bildschirm geklatscht, aber meine Ameise erwischt du nie :D
NeoChris
Beiträge: 205
Registriert: 21.11.2013 21:17
Wohnort: Schweiz
Kontaktdaten:

Re: Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von NeoChris »

Josh hat geschrieben:P.S.: Wegen meinem Avatar haben sicher schon mehrer auf ihren Bildschirm geklatscht :D
Du schuldest mir einen neuen Bildschirm ich mein du schuldest mir eine neue Wohnung.

Wenn jemand den Witz nicht versteht:
Bild
Ob Spinne oder Fliege ist doch das gleiche :lol:
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Kürzeste Lösung für. Add,Ignore next lines until change

Beitrag von Josh »

NeoChris hat geschrieben:Ob Spinne oder Fliege ist doch das gleiche :lol:
Womit der Beweis erbracht wäre, dass ich unschuldig bin. Mein Avatar ist weder eine Fliege noch eine Spinne, es ist eine Ameise, genauer gesagt eine Martialis heureka :D
Antworten