[alg] fraaiste prog voorbeelden.

Pagina: 1 2 Laatste
Acties:
  • 1.151 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Het [rml][ alg] slechtste prog voorbeelden.[/rml] topic is een daverend succes. Kennelijk kunnen veel bezoekers uitstekend slechte code signaleren (met name van anderen uiteraard ;) ). Ik neem aan dat ze dan ook fraaie code kunnen herkennen (met name van zichzelf natuurlijk ;) ).

Uiteraard zijn we altijd geinteresseerd in schoonheid. Lelijke zaken probeer je te verstoppen en ga je zeker niet tentoonstellen. Graag zou ik dus een topic willen zien waarbij het "slechte programmeervoorbeelden" topic totaal weggevaagd wordt qua aantal posts :+ .

Na u :*) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

* D2k gaat achter Martin staan

en jij gaat de code beoordelen zeker? :+

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Het lijkt me lastig om een fraai stukje code in een paar regels kwijt te kunnen. Meestal zit er wel een vrij gecompliceerde gedachte achter en dan moet je redelijk thuis zijn in die materie.

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

pff, als ik naar mbravenboers standaarden, mooie code moet gaan maken, kom ik er niet vrees ik, ik kan alleen maar slecht programmeren :)

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Nou nou, niet zo verlegen allemaal :D .
edit:
Ik hoop toch dat schoonheid ook in andere terreinen dan whitespace nog te vinden is ;) .

[ Voor 62% gewijzigd door mbravenboer op 08-04-2003 13:48 ]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Blijft briljant:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define _ F-->00 || F-OO--;
long F=00,OO=00;
main(){F_OO();printf("%1.3f\n", 4.*-F/OO/OO);}F_OO()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
       _-_-_-_-_-_-_-_-_
            _-_-_-_
}
...berekent Pi.
Ben benieuwd ;)

[ Voor 11% gewijzigd door Rataplan op 08-04-2003 13:45 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#ifdef s
                                z
                               r(
                              ){z
                             k=0,l
                            =0,n,x
                           XQueryPointer(i
                    ,XRootWindow      (i,j),&m,
              &m,&o,&p,&n,&n,(               ghj)&n),(o
                            >=s(g)||s(o
                           )<=0)&&(k=1),
                          (p>=h||p<=0)&&
                         (l=1),(e==1)&&(
                        c=o,d=p,e=0,1)||(
                           (k==0&&o-c-(z)(a+y
                          (a)*.5)!=0)&&(a=o-c
                         ),(l^-1==-1&&p-d-(z)(
                 b+y(b)*.5)!=0)&&(b=p-d),a/=f,b/=f
             ,k=0,l=0);(o      >=s(g)||o<=0)&&(a=-a),(
       p>=h||s(p)<=0)                 &&(b=-b),c=o,d=p,I(XWarpP
                     ,ointer)(i,None,None,0,0,s
                    (g),h,(z)(a+y(a)*.5),(int)(
                       b+y(b)*.5 JJ(float B;int)C,D;
                      #else/*Egads! something has */
                     #include<X11/Xlib.h>/*taken a*/
                    #include<stdio.h>/*huge bite o-*/
                   #include<stdlib.h>/*ut of the m-*/
                  #include<time.h>/*ouse pointer!!!*/
                 #define H(a, b) (((a)&(7<<3*(b)))>>3*(b))
        #define G(c,d)  ((H(c,d)<<3*(d+1))|((H(c,d+1)<<3*d)|/*
     _XSetPointer(display,     screen,GREASY|BOUNCY)*/c&~(63<<3*(d))))
#define                       s(e) (G(G(G(G(G(G(e,(z)0),1),2),1),0),1))
                 typedef int z;float a=0,b=0,c,d,f=1.03;z e
                      =s(512),g,h,j;
                      Display/**/*i;
                  #define y(X)((X>0)-(X<0))
            #define x        o,p; Window m;
          #define ghj               unsigned  int*
    #define                         I(aa,bb)aa##bb
                       #define JJ(X)\
                       ));return 0;}X
                      z r();int main
                      (z X,char**Y){
                     clock_t q=0;(X
               ==2)&&(f=atof(Y[1])),((i
          =XOpenDisplay(0)      )==0)&&(exit(1
    ),1),j=I(Defa,                  ultScreen)(i),
                   g=s(I(Display,
                   Width)(i,j)-1)
                  ,h=I(DisplayH,
                  eight)(i,j)-1;
                 for(;;((I(clo,
                 ck)()-q)*100>(
                CLOCKS_PER_SEC
         ))&&(r(),q=clock()));}
   #include __FILE__
#endif

:P

Acties:
  • 0 Henk 'm!

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Misschien toch maar ff een topic uit [search=obfuscated] halen en daarin verder gaan :? :P


Journalism is printing what someone else does not want printed; everything else is public relations.


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10:39
Nogal "trots" op m'n eigen quicksort routine (die mijn eigen LinkedList sorteert):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
template <class OBJ>
void sort(Item<OBJ> * start, Item<OBJ> * end)
{
    Item<OBJ> * i = start;
    Item<OBJ> * j = end;
    OBJ temp;

    while (i != j)
    {
        while (i != j && i->CurrItem <= end->CurrItem)
        {
            i = i->NextItem;
        }

        while (i != j && j->CurrItem >= end->CurrItem)
        {
            j = j->PrevItem;
        }

        temp = j->CurrItem;
        j->CurrItem = i->CurrItem;
        i->CurrItem = temp;
    }

    temp = end->CurrItem;
    end->CurrItem = j->CurrItem;
    j->CurrItem = temp;

    if (start != i && start->NextItem != i)
        sort(start, i->PrevItem);

    if (end != j && end->PrevItem != j)
        sort(j->NextItem, end);
}

Sorry voor het gebrek aan commentaar O-)

[ Voor 13% gewijzigd door riezebosch op 08-04-2003 22:21 . Reden: arrrg, sorteert moet natuurlijk met een T ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Nu online

TeeDee

CQB 241

Dit is in SQL, maar dat mag ook wel lijkt me? :) (Zo niet, haal ik het gewoon weg :))

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
CREATE PROCEDURE dbo.GetJaartotals
@jaar INT
AS
SELECT *, Tot_aantal_kaart_orders + Tot_aantal_kaart_blanco as Totaal_aantal_kaarten , 
Tot_aantal_order_orders + Tot_aantal_order_blanco as Totaal_aantal_orders FROM
(SELECT 

(SELECT COUNT(*) from dbo.TblOrders 
    WHERE (Status='1' OR status='2') AND YEAR(Bezorgdatum) = @jaar) 
    as Tot_aantal_kaart_orders,

(SELECT COUNT(*) from dbo.TblBlancoCards 
    WHERE (Status='1' OR status='2') AND YEAR(Bezorgdatum) = @jaar) 
    as Tot_aantal_kaart_blanco,
(SELECT COUNT(DISTINCT(UID)) from dbo.TblOrders 
    WHERE (Status='1' OR status='2') AND YEAR(Bezorgdatum) = @jaar) 
    as Tot_aantal_order_orders,
(SELECT COUNT(DISTINCT(UID)) from dbo.TblBlancoCards 
    WHERE (Status='1' OR status='2') AND YEAR(Bezorgdatum) = @jaar) 
    as Tot_aantal_order_blanco,
(SELECT ROUND(SUM(PostZegels),0)
    FROM (SELECT UID, Bezorgdatum, COUNT(*) as Aantal_Kaarten, PostZegels
        FROM (SELECT Bezorgdatum, CONVERT(float, PostZegels) 
        as PostZegels, UID
            FROM TblBlancoCards
            WHERE (Status = '2' OR Status = '1') 
            AND YEAR(Bezorgdatum) = @jaar) DERIVEDTBL
    GROUP BY UID, Bezorgdatum, PostZegels)SubTotalsMaand)  As Tot_aantal_zegels,
(SELECT COUNT(*)
    FROM (SELECT UID, Bezorgdatum
        FROM (SELECT Bezorgdatum, UID
            FROM tblOrders
            WHERE (Status = '2' or Status = '1') 
            AND YEAR(Bezorgdatum) = @jaar)DERIVEDTBL
            GROUP BY UID, Bezorgdatum
            HAVING COUNT(*)=1) DERIVEDTBL) as SWP, 

    (SELECT COUNT(*)
    FROM (SELECT UID, Bezorgdatum
        FROM (SELECT Bezorgdatum, UID
            FROM tblOrders
            WHERE (Status='2' OR Status='1') 
            AND YEAR(Bezorgdatum) = @jaar) DERIVEDTBL
            GROUP BY UID, Bezorgdatum
            HAVING COUNT(*)>1)DERIVEDTBL) as Bibit) DERIVEDTBL

Dit is van mij. En ja, ik ben er behoorlijk trots op!
Het gaat hier uiteraard om een Sproc, die 2 compleet verschillende Tabellen koppelt en in 1 result waardes teruggeeft.

Dit heeft me 3 dagen gekost, en dit kwam voornamelijk omdat ik het niet voor elkaar kreeg om @'s door te geven.

Verder is de indent een beetje rot, maar anders bleef er helemaal niks van de layout over! :)

Nogmaals, er zullen mensen zijn die dit een slecht voorbeeld vinden, maar zelf ben ik er trots op! Gezien het feit ik meestal alleen maar aan een simpele SELECT, INSERT of UPDATE genoeg had!

[ Voor 5% gewijzigd door TeeDee op 08-04-2003 13:56 . Reden: code=asp toegevoegd ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

Verwijderd

In c is een keer een mastermind algoritme geschreven in samen werkiing met een aantal studenten en docenten (was ook op een forum). Bedoeling was in zo min mogelijk regels het aantal op de goede plek en het aantal goede getallen telde, maar dan wel zonder dubbel tellingen. Dit was het resultaat:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
int a[4] ={1,2,4,2}, //het goede antwoord

    b[4] ={2,1,1,3}, //antwoord van de gebruiker

    e[2] = {0,0};    //e[0] = juisteplek, e[1] = juiste getal



for (int i = 0; i < 4; i++){ 
  e[0] += a[i] == b[i]; 
  for (int j = 0; j < 4; j++) 
   e[1]+= (i != j) && (a[i] == b[j]) && !(a[j]=0); 
} 

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
Ik ben het wel eens met Alarmnummer. Het is moeilijk om in een paar regels een stukje code te laten zien dat goed in elkaar steekt, maar hell, ik doe een poging.

Ik heb m'n IRC bot als volgt geschreven:
- de bot zelf zit in een DLL.
- om de bot aan te sturen heb ik een Windows programma geschreven waarin je de bot mee kunt laten inloggen, waarmee je kunt zien wat er allemaal op het kanaal verschijnt, etc....

Om in m'n windows-app te laten zien wat er allemaal op het kanaal verschijnt (een soort log dus), maak ik gebruik van het observer pattern.

Zie hier een code-snippet. (De irrelevante code is eruit geknipt).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class AbstractIrcBot
{
    protected string        _message;

    protected ArrayList     _observers;

    protected string PutMessage
    {
       set
       {
          _message = value;
          this.NotifyObservers();
       }
    }

    private void NotifyObservers()
    {
       foreach( IBotObserver bo in _observers )
       {
           bo.Update();
       }
    }
}


In m'n windows programma heb ik dan volgende code:
code:
1
2
3
4
5
6
string nickname = txtNick.Text;
string descr = txtDescr.Text;
bot = new MyBot( nickname, descr);
bot.ChannelName = txtChannel.Text;
bot.AddObserver(new WindowsLogObserver(bot, txtLog));
bot.Connect(txtServer.Text, Convert.ToInt32(txtPort.Text));

De WindowsLogObserver ziet er ongeveer als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class WindowsLogObserver : IBotObserver
{   
   private RichTextBox  _txtLogScreen;
   private AbstractIRCBot   _subject;
    
   public WindowsLogObserver( AbstractIRCBot subject, RichTextBox viewer)
   {
      _txtLogScreen = viewer;
      _subject          = subject;
   }
        
   public void Update()
   {
     _txtLogScreen.AppendText(_subject.Message + "\r\n");
   }
}

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Beetje borstklopperij, dit topic. Da's on-Nederlands ;)

In m'n eigen applicaties heb ik al heel vaak een procedure geschreven die ini-bestandjes kan lezen en schrijven. Na verloop van tijd werd ik er zat van, en dat resulteerde in een functie die een form bekijkt, en alle editboxen, listboxen, checkboxen, etc. netjes in een ini-bestandje zet. Als je een nieuwe instelling op het preferences-scherm maakt, dan komt dat automatisch ook in het .ini-bestandje.

De code geef ik niet. Die is niet origineel, iedereen kan 't bedenken en het is ook niet eens mooi. De schoonheid zit 'm in de zeer bruikbare aard.

Onderstaand stukje code is eerlijk gezegd ook niet mooi. Het is ook niet geavanceerd. Ik heb een eigen muziek-speel programma gemaakt, en de 'volgende' track wordt gekozen uit een lijst met kandidaten. De best passende wordt vervolgens daadwerkelijk gespeeld. De procedure die de best-passende track selecteerd vind je hieronder:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function TSongSelector.CalcScore(Q:TQuery):integer;
var i:integer;
    Ratio:double;
    Verschil:integer;
    TempScore:integer;
    Resultaat:Extended;
begin
// Er is een record met laatstetrack(s).
//  Hiermee kan vergeleken worden met het record in Q
//  -> punten toekennen op basis van instellingen.
   Resultaat:=0;
   for i:=1 to CompareWith.Value do begin
      TempScore:=0;
      if (Q.Fields[3].AsInteger>0) and (LastList[i].GenreID>0) then begin //score voor genre
         Verschil:=Abs(Q.Fields[3].AsInteger-LastList[i].GenreID);
         if Verschil=0 then inc(TempScore,GenreScore[4].Value)
         else if Verschil<256 then inc(TempScore,GenreScore[3].Value)
         else if Verschil<65536 then inc(TempScore,GenreScore[2].Value)
         else if Verschil<16777216 then inc(TempScore,GenreScore[1].Value);
      end;
      Resultaat:=Resultaat+LastList[i].Weight*TempScore;      
      TempScore:=0;
      if Q.Fields[1].AsInteger=LastList[i].AlbumID then inc(TempScore,AlbumEqual.Value);
      if Q.Fields[2].AsInteger=LastList[i].BandID  then inc(TempScore,BandEqual.Value);
      Resultaat:=Resultaat+TempScore;
   end;
   if Q.Fields[4].AsInteger+Q.Fields[5].AsInteger=0 then begin //ratio van -1..1
      Ratio:=0;
   end else begin
      Ratio:=(2*Q.Fields[4].AsInteger/(Q.Fields[4].AsInteger+Q.Fields[5].AsInteger))-1;
   end;
   Resultaat:=Resultaat+Ratio*RatioScore.Value+                 //Ratio
                        Q.Fields[4].AsInteger*PlaysScore.Value; //Playcount
   Result:=Round(Resultaat);
end;

Bij nader inzien denk ik niet dat er iemand is die iets snapt van deze code :P . Q is een dataset, met daarin een lijst met kandidaten. LastList is een array, met daarin de tracks die recent gespeeld zijn. Alle kandidaten uit Q krijgen een score op basis van instellingen (blabla.Value) en de recent gespeelde liedjes. De procedure wordt voor ieder record in Q 1 keer aangeroepen.

offtopic:
Ik denk niet dat iemand de genialiteit van dit in zal zien ;-)

[ Voor 12% gewijzigd door Varienaja op 08-04-2003 14:46 ]

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Dit vind ik dus minder elegant, een boolean bij een numerical optellen.
C:
1
e[0] += (a[i]==b[i])?1:0;
doet hetzelfde, is formeel juister. "Kort" is niet altijd hetzelfde als fraai... Doe het zelf trouwens ook fout, hoor ;)
C:
1
 !(a[j]=0); 
Dit snap ik niet :) Moet er niet == staan? En waarom moet er een (beperkte, ook nog) rangecheck op het goeie antwoord? Volgens mij evalueert wat er nu staat altijd naar true...


Journalism is printing what someone else does not want printed; everything else is public relations.


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

*ziet die rare belg weer met zijn abstract classes* :)

Je kunt het beste een interface gebruiken voor die IRCBot, en daar een convenience abstract implementatie van maken die andere classes kunnen hergebruiken. Hierdoor zit je niet vast aan een implementatie (vrijheid) en toch re-use (gemak).

Wat bv het nut van een interface is in jouw geval, is dat je een soortement van controlerende condoom om jouw irc-bot kan plaatsen om bv allerlei loggings/controles uit te voeren (proxy design pattern).

[ Voor 4% gewijzigd door Alarmnummer op 08-04-2003 14:38 ]


Acties:
  • 0 Henk 'm!

  • himlims_
  • Registratie: Juni 2000
  • Niet online

himlims_

🐧 Linux HOoligan

:+
PHP:
1
echo "GoT"; // Geeft de tekst 'GoT' als output


Nou wat is daar aan mis :)

[ Voor 15% gewijzigd door himlims_ op 08-04-2003 14:44 ]

⭐Game Profiles: 🕹️Steam - 🎮PSN - 🇪🇦 GoT_Hollandhards


Acties:
  • 0 Henk 'm!

Verwijderd

Rataplan schreef op 08 April 2003 @ 14:36:
[...]
Dit vind ik dus minder elegant, een boolean bij een numerical optellen.
C:
1
e[0] += (a[i]==b[i])?1:0;
doet hetzelfde, is formeel juister. "Kort" is niet altijd hetzelfde als fraai... Doe het zelf trouwens ook fout, hoor ;)
Het ging ook om zo min mogelijk regels
[...]
Dit snap ik niet :) Moet er niet == staan? En waarom moet er een (beperkte, ook nog) rangecheck op het goeie antwoord? Volgens mij evalueert wat er nu staat altijd naar true...
Nope, niet als een eerdere voorwaarde false is, dan wordt de rest niet geevalueerd

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Scarecrow schreef op 08 April 2003 @ 14:41:
:+
PHP:
1
echo "GoT"; // Geeft de tekst 'Got' als output


Nou wat is daar aan mis :)
Mijn timmermansoog zegt dat je niet netjes bent ingeprongen en je commentaar klopt niet.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 17:16

Dido

heforshe

Verwijderd schreef op 08 april 2003 @ 14:43:
Nope, niet als een eerdere voorwaarde false is, dan wordt de rest niet geevalueerd
Maar wat doet dat stuk daar nou :?
%@*!& ik ziet 'm |:( hijs fijn :)

[ Voor 9% gewijzigd door Dido op 08-04-2003 14:47 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Haskell:
1
2
3
4
5
6
7
8
showTime :: Integer -> String
showTime t = stringImplode ", " . map fromJust . filter isJust . zipWith f ["day","hour","minute","second","millisecond","microsecond","nanosecond","picosecond"] . reverse . g t $ [1,10^3,10^6,10^9,10^12,60 * 10^12,3600 * 10^12,24 * 3600 * 10^12]
  where f _ 0 = Nothing
        f s 1 = Just $ "1 " ++ s
        f s n = Just $ show n ++ ' ' : s ++ "s"
        g t (a:b:r) = mod t b `div` a : g t (b:r)
        g t [c]     = [t `div` c]
        g _ []      = []

geeft een tijdsduur in picoseconden 'mooi' weer: "1 day, 6 hours, 27 seconds, 427 nanoseconds"
(zou het nog korter kunnen?)

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

Verwijderd

Dido schreef op 08 April 2003 @ 14:46:
[...]

Maar wat doet dat stuk daar nou :?
Zorgen dat er niet dubbel getelt wordt, als de elementen hetzelfde waren zetten we waarde op 0 zodat deze niet meer vergeleken kan worden...

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Procedure om een B-tree, opgeslagen in een bestand op het scherm te tekenen, zodat je mooi kan zien of ie een beetje gebalanceerd is. Ik heb de procedure in 1x geschreven, en hij was meteen goed. Zo'n vlaag van genialiteit heb ik sindsdien nooit meer gehad :D .

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TekenBoom(var F:AJVF;B:integer;C:TCanvas;X,Y,N,O,Up:integer);
var Tree:BoomT;
begin
   if B<>0 then begin
      Seek(F.F,B);
      Tree:=RdBoom(F);

      if Tree.Kleiner<>0 then begin
         C.MoveTo(O,Y);
         C.LineTo(O-(X div 4),Y+N+10);
         TekenBoom(F,Tree.Kleiner,C,X div 2,Y+N+10,N+1,O-(X div 4),B);
      end;
      if Tree.Groter<>0 then begin
         C.MoveTo(O,Y);
         C.LineTo(O+(X div 4),Y+N+10);
         TekenBoom(F,Tree.Groter,C,X div 2,Y+N+10,N+1,O+(X div 4),B)
      end;
   end;
end;


Resultaat (3 bomen door elkaar heen in dit geval):
Afbeeldingslocatie: http://www.cs.utwente.nl/~verstoep/GPics/BBoom.gif

[ Voor 9% gewijzigd door Varienaja op 08-04-2003 14:55 ]

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 17:16

Dido

heforshe

Ik had 'm nét ge-edit :)

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
Alarmnummer schreef op 08 April 2003 @ 14:37:
*ziet die rare belg weer met zijn abstract classes* :)

Je kunt het beste een interface gebruiken voor die IRCBot, en daar een convenience abstract implementatie van maken die andere classes kunnen hergebruiken. Hierdoor zit je niet vast aan een implementatie (vrijheid) en toch re-use (gemak).

Wat bv het nut van een interface is in jouw geval, is dat je een soortement van controlerende condoom om jouw irc-bot kan plaatsen om bv allerlei loggings/controles uit te voeren (proxy design pattern).
Ik zag gewoon het nut niet in van een interface in dat geval. (Mijn observer implementeert dan weer wel een interface, en erft niet over van een abstracte class).
M'n abstracte class bevat heel wat 'sealed' methods, er zitten ook data-members in, dus nog eens een interface schrijven die dan geimplementeerd wordt door m'n abstracte class vind ik gewoon overkill.

Je mag zo niet geilen op interfaces Alarmnummer. :+

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01 11:03

Lorn

I have a bad feeling...

Varienaja schreef op 08 April 2003 @ 14:43:
[...]

Mijn timmermansoog zegt dat je niet netjes bent ingeprongen en je commentaar klopt niet.
_/-\o_ je hebt wel gelijk...

Acties:
  • 0 Henk 'm!

Verwijderd

Ah, dus op deze manier komt martin aan elegante dingen huh? ;)

Mijn pogingen in .NET. Niet veel code, maar ik neem aan dat dat niet uit maakt? :)

[ Voor 6% gewijzigd door Verwijderd op 08-04-2003 16:37 ]


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Scarecrow schreef op 08 April 2003 @ 14:41:
:+
PHP:
1
echo "GoT"; // Geeft de tekst 'GoT' als output


Nou wat is daar aan mis :)
Geen single quotes gebruikt.

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

+ als dat ze mooiste code is vrees ik met grote vrezen voor stukken code > 5 regels

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 16-09 20:14
Hieronder een PHP functie om een HTML tabel aan te maken. En ga nou niet aankomen met XSLT en template parsers, de functie is gewoon geniaal ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
function build_table($cols, $rows) {
/* Deze functie bouwt aan de hand van de opgegeven arrays een tabel op
 $cols = 2 dimensionaal array met namen en breedte van de kolommen
 $cols[0]['name'] = <naam kolom 1>
 $cols[0]['width'] = <breedte kolom 1>
 $cols[0]['colspan'] = eventueel aantal kolommen om te mergen
 $cols[0]['align'] = eventueel uitlijning default = left

 $rows = 3 dimensionaal array (rij,kolom) met rij informatie
 $rows[0][0]['data'] = Data rij 1 kolom 1
 $rows[0][0]['width'] = Breedte rij 1 kolom 1
 $rows[0][0]['colspan'] = eventueel aantal kolommen om te mergen voor rij 1 kolom 1
 $rows[0][0]['align'] = eventueel uitlijning default = left
*/

    if ( (!is_array($cols)) && (!is_array($rows)) ) {
        return('');
    }

    // Maak table heads aan
    $temp = "<table border='0' cellpadding='5' cellspacing='1'><tr>";
    for ($i = 0; $i < count($cols); $i++) {
        if ( (isset($cols[$i]['name'])) && (isset($cols[$i]['width'])) ) {
            // Check alignment en colspan
            if (!isset($cols[$i]['colspan'])) {
                // Default colspan = 0
                $cols[$i]['colspan'] = 0;
            }

            if (!isset($cols[$i]['align'])) {
                // Default align = left
                $cols[$i]['align'] = 'left';
            }
            
            // Maak table head cell aan
            $temp .= '<th bgcolor="#336699" width="' . $cols[$i]['width'] . '" align="' . $cols[$i]['align'] . '" colspan="' . $cols[$i]['colspan'] . '">' . $cols[$i]['name'] . '</th>';
        }
    }
    
    $temp .= '</tr>';

    // Maak tabel rijen aan
    $color = 0;
    $bgcolor[0] = '#E0DDDD';
    $bgcolor[1] = '#eeeeee';
    for ($i = 0; $i < count($rows); $i++) {
        // Maak elke kolom aan voor elke rij
        $temp .= '<tr>';
        for ($j = 0; $j < count($rows[$i]); $j++) {
            if ( (isset($rows[$i][$j]['data'])) && (isset($rows[$i][$j]['width'])) ) {
                // Check alignment en colspan
                if (!isset($rows[$i][$j]['colspan'])) {
                    // Default colspan = 0
                    $rows[$i][$j]['colspan'] = 0;
                }
    
                if (!isset($rows[$i][$j]['align'])) {
                    // Default align = left
                    $rows[$i][$j]['align'] = 'left';
                }

                if (!isset($rows[$i][$j]['color'])) {
                    $rows[$i][$j]['color'] = $bgcolor[$color];
                }
            
                // Maak table cell aan
                $temp .= '<td valign="top" bgcolor="' . $rows[$i][$j]['color'] . '" width="' . $rows[$i][$j]['width'] . '" align="' . $rows[$i][$j]['align'];
                $temp .= '" colspan="' . $rows[$i][$j]['colspan'] . '">' . $rows[$i][$j]['data'] . '</td>';
            }
        }

        $color = $color ^ 1;
        $temp .= '</tr>';
    }
    
    $temp .= '</table>';
    return($temp);
}

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
Als ik een applicatie heb, waarin ik bv. een lijstscherm heb met daarop bv. allemaal klanten, en een detailscherm die alle gegevens van een geselecteerde klant toont en waar je ze eventueel kunt in bijwerken, dan zorg ik er altijd voor dat de gegevens op het lijstscherm als volgt geupdated worden:

Code om het detailscherm vanaf het lijstscherm te openen.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TfrmLstKlanten.OpenButtonClick(Sender: TObject);
var
  frmDetail        : TfrmDetKlant;
  SelItem          : TListItem;
begin  // of OpenButtonClick
  inherited;
  SelItem := ListView.Selected;

  if SelItem <> nil then begin
    frmDetail           := TfrmDetKlant.Create (Self);
    frmDetail.DoAfterOK := UpdateListItem;
    frmDetail.Execute (Integer(SelItem.Data));
  end;

end;   // of OpenButtonClick


DoAfterOk is dus een property van het type TNotifyEvent (in Delphi) op m'n detailscherm. Aan die property ken ik dus een method toe die ik in m'n lijstscherm heb gedefinieerd.
Op die manier kan je dat detailscherm ook nog hergebruiken bij andere lijstschermen, of zonder lijstscherm. Je zorgt er dus voor dat het detailscherm iets uitvoert, maar dat het niet expliciet gekoppeld is met het lijstscherm.

De UpdateListItem method (die dus aan de DoAfterOk toegekend werd), ziet er als volgt uit:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TfrmLstKlanten.UpdateListItem(Sender: TObject);
var
  SelKey           : Integer;
  SelItem          : TListItem;
begin  // of UpdateListItem

  SelKey  := TfrmDetKlant(Sender).PrimKey;
  SelItem := ListView.Selected;

  if (SelItem = nil) or (Integer(SelItem.Data) <> SelKey) then begin
    SelItem := ListView.FindData(0, Pointer(SelKey), True, False);
  end;

  SelItem.Caption     := TfrmDetKlant(Sender).CodeDBEdit.Text;
  SelItem.SubItems[0] := TfrmDetKlant(Sender).NaamDBEdit.Text;   

end;   // of UpdateListItem


Natuurlijk moet die method ook nog uitgevoerd worden. Om dat te verwezenlijken zit de volgende code onder de ApplyButton van m'n detailscherm:
Delphi:
1
2
3
if Assigned (DoAfterOk) then begin
  DoAfterOk (Self);
end;


Zoiets heb ik trouwens hier ook al eens uitgelegd. (In C# dan wel).

[ Voor 4% gewijzigd door whoami op 08-04-2003 15:15 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • momania
  • Registratie: Mei 2000
  • Laatst online: 17-09 07:50

momania

iPhone 30! Bam!

Ik heb ooit nog eens een query van ongekende lengte (ben er zelf iig wel trots op :) )
Het is een query die een totaal laat zien van het aantal coupures, pasmunt en overige waardes(cheques etc) die binnen zijn gekomen in een geld tel centrale van een bank.
Uitgesplitst per coupure soort (tientjes, twintigjes, etc) en valuta)
Het resultaat kon ook zo in z'n geheel in een tabel gegoten worden, zonder verdere opmaak en liet dan evengoed een duidelijk overzicht zien.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
WITH TIMES AS(  
    SELECT 
        MAX(SUB.TIMESTAMP) AS TIME
    FROM
        DBORC01.ORCT046 SUB
    WHERE
        SUB.TIMESTAMP BETWEEN ? AND ?
    GROUP BY
        SUB.DEELSTROOM_ID,
        SUB.COUPURE_ID
),
SUB_TEL AS (    
    SELECT
        X.DEELSTROOM_ID     AS DEEL_ID,
        X.DEELSCOUPTEL_ID   AS ID,
        X.COUPURE_ID        AS COUP_ID,
        DEEL.STORTING_ID    AS STORT_ID
    FROM
        (TIMES T
            JOIN    DBORC01.ORCT046 X ON T.TIME = X.TIMESTAMP
            JOIN DBORC01.ORCT038 DEEL ON X.DEELSTROOM_ID = DEEL.DEELSTROOM_ID)
),
STORT AS (
    SELECT 
        STORT_ID    AS ID
    FROM 
        SUB_TEL
    GROUP BY
        STORT_ID
)

SELECT
    VALUTA.VAL_ISO_CD                   AS VALUTA,
    SUM(DEELCOUPTEL.DEELSCOUPTELANT)            AS AANTAL,
    'X'                         AS "X",
    COUPURE.WAARDE                      AS COUPURE,
    COUPURE.PRIORITEIT                  AS VOLGORDE,
    '='                         AS "=",
    SUM(DEELCOUPTEL.DEELSCOUPTELANT * COUPURE.WAARDE)   AS TOTAAL,
    INTEGER(SUM(DEELCOUPTEL.DEELSCOUPTELANT)) / 
INTEGER(COUPURE.BATCHAANTAL)            AS AANTALBATCHES,
    MOD(INTEGER(SUM(DEELCOUPTEL.DEELSCOUPTELANT)),  
INTEGER(COUPURE.BATCHAANTAL))           AS LOSSECOUPURES

FROM 
    SUB_TEL,
    DBORC01.ORCT046 DEELCOUPTEL,
    DBORC01.ORCT009 COUPURE,
    DBORC01.ORCT030 VALUTA,
    DBORC01.ORCT038 DEELSTR
WHERE
    SUB_TEL.ID          = DEELCOUPTEL.DEELSCOUPTEL_ID   AND
    SUB_TEL.COUP_ID         = COUPURE.COUPURE_ID        AND
    COUPURE.VALUTA_ID       = VALUTA.VALUTA_ID      AND
    DEELCOUPTEL.DEELSTROOM_ID   = DEELSTR.DEELSTROOM_ID AND
    (   SELECT 
            MAX(GETELD_JN) 
        FROM 
            DBORC01.ORCT038 TMP 
        WHERE 
            TMP.STORTING_ID = DEELSTR.STORTING_ID) = 'J'    
GROUP BY
    VALUTA.VAL_ISO_CD,
    COUPURE.WAARDE,
    COUPURE.PRIORITEIT,
    COUPURE.BATCHAANTAL
UNION

SELECT 
    VALUTA.VAL_ISO_CD           AS VALUTA,
    COUNT(DEELSTROOM.GETELD_BEDRAG) AS AANTAL,
    'X'                 AS "X",
    0                   AS COUPURE,
    99                  AS VOLGORDE,
    '='                 AS "=",
    SUM(DEELSTROOM.GETELD_BEDRAG)   AS TOTAAL,  
    SUM(0)                  AS AANTALBATCHES,
    SUM(0)                  AS LOSSECOUPURES
FROM
    (DBORC01.ORCT024 STOR
        JOIN DBORC01.ORCT038 DEELSTROOM ON STOR.STORTING_ID = DEELSTROOM.STORTING_ID
        JOIN    DBORC01.ORCT030 VALUTA ON DEELSTROOM.VALUTA_ID = VALUTA.VALUTA_ID)
WHERE   
    STOR.GETELD_TIMESTAMP BETWEEN ? AND ? AND
    DEELSTROOM.SOORT_DEELST_ID  = 2             AND
    (   SELECT 
            MAX(GETELD_JN) 
        FROM 
            DBORC01.ORCT038 TMP 
        WHERE 
            TMP.STORTING_ID = STOR.STORTING_ID)  = 'J'
GROUP BY
    VALUTA.VAL_ISO_CD

UNION

SELECT 
    VALUTA.VAL_ISO_CD           AS VALUTA,
    COUNT(DEELSTROOM.GETELD_BEDRAG) AS AANTAL,
    'X'                 AS "X",
    0                   AS COUPURE,
    100                 AS VOLGORDE,
    '='                 AS "=",
    SUM(DEELSTROOM.GETELD_BEDRAG)   AS TOTAAL,  
    SUM(0)                  AS AANTALBATCHES,
    SUM(0)                  AS LOSSECOUPURES
FROM
    (DBORC01.ORCT024 STOR
        JOIN DBORC01.ORCT038 DEELSTROOM ON STOR.STORTING_ID = DEELSTROOM.STORTING_ID
        JOIN    DBORC01.ORCT030 VALUTA ON DEELSTROOM.VALUTA_ID = VALUTA.VALUTA_ID)
WHERE   
    STOR.GETELD_TIMESTAMP BETWEEN ? AND ? AND
    DEELSTROOM.SOORT_DEELST_ID  = 3             AND
    (   SELECT 
            MAX(GETELD_JN) 
        FROM 
            DBORC01.ORCT038 TMP 
        WHERE 
            TMP.STORTING_ID = STOR.STORTING_ID)     = 'J'
GROUP BY
    VALUTA.VAL_ISO_CD
ORDER BY    
    VALUTA,  
    VOLGORDE,
    COUPURE
FOR READ ONLY;


Deze query werd afgeschoten op een DB2 server en deed er ongeveer 2 sec. over om met resultaat te komen :)

Neem je whisky mee, is het te weinig... *zucht*


Acties:
  • 0 Henk 'm!

Verwijderd

JonkieXL schreef op 08 April 2003 @ 15:13:
Hieronder een PHP functie om een HTML tabel aan te maken. En ga nou niet aankomen met XSLT en template parsers, de functie is gewoon geniaal ;)

[snip]
Maar minder generiek ;)

[ Voor 86% gewijzigd door Verwijderd op 08-04-2003 15:20 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Mooi geneste code is niet lelijk.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  private void closure2() {
    int size = this.size;
    boolean[] done = new boolean[size];
    boolean[] busy = new boolean[size];
    int[] index = new int[size];
    int[] bitpos = new int[size];
    int ndone = 0;
    while (ndone < size) {
      if ((rows[ndone] != null) && !done[ndone]) {
        int stackpos = 0;
        index[0] = ndone;
        bitpos[0] = 0;
        busy[ndone] = true;
        BitVector current = rows[ndone];
        while (stackpos >= 0) {
          if (bitpos[stackpos] < 0) {
            if (stackpos > 0) {
              rows[index[stackpos-1]].or(rows[index[stackpos]]);
              current = rows[index[stackpos-1]];
            }   
            done[index[stackpos]] = true;
            busy[index[stackpos--]] = false;
          } else {
            int nextbitpos = current.getLowestSetBit(bitpos[stackpos]);
            if (nextbitpos < 0 || nextbitpos >= size) bitpos[stackpos] = -1;
            else {
              bitpos[stackpos] = nextbitpos+1;
              if (rows[nextbitpos] != null) {
                if (done[nextbitpos]) {
                  rows[index[stackpos]].or(rows[nextbitpos]);
                } else {    
                  if (!busy[nextbitpos]) {
                    busy[nextbitpos] = true;
                    index[++stackpos] = nextbitpos;
                    bitpos[stackpos] = 0;
                    current = rows[index[stackpos]];
                  } else {
                    if (index[stackpos] != nextbitpos) {
                      int tempsp = stackpos-1;
                      BitVector cyclicmask = new BitVector(size);
                      do {
                        bitpos[tempsp] = -1;
                        rows[index[stackpos]].or(rows[index[tempsp]]);
                        cyclicmask.set(index[tempsp]);
                      } while (index[tempsp--] != nextbitpos);
                      current = (BitVector)current.clone();
                      current.andNot(cyclicmask);
                      bitpos[stackpos] = 0;
                    }
                  }
                }
              }
            }
          }
        }
      }
      ndone++;
    }
    reflexive = true;
  }

/me is van stiekem fan van diep geneste code ;)

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Eerlijk gezegd vind ik niets fraais aan lange SQL's of grote lappen code.

Niets is zo geniaal als de formele specificatie van Quicksort:

code:
1
2
3
sort x:xs = (sort kleintjes) ++ x ++ (sort groten)
            where kleintjes = [ k | k<-xs ; k<x]
                  groten    = [ g | g<-xs ; g>=x]

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verwijderd schreef op 08 April 2003 @ 15:22:
Mooi geneste code is niet lelijk.
Mooi geneste code idd niet ;)

Dit ding moet je gewoon opsplitsen in een aantal methodes. Ik kom zelden meer dan 2 nivo`s diep.

Acties:
  • 0 Henk 'm!

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Wat ik toch een van de mooiste stukjes code vind is RSA decryptie en encryptie in drie regels Perl:
Perl:
1
2
3
#!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj
$/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1
lK[d2%Sa2/d0$^Ixp"|dc`;s/\W//g;$_=pack('H*',/((..)*)$/)

http://www.cypherspace.org/~adam/rsa/story2.html
Knap gedaan vindt ik.
Had thuis volgens mij nog een iets nettere versie van iemand anders... strax ff posten.

[ Voor 12% gewijzigd door SWfreak op 08-04-2003 15:43 ]


Acties:
  • 0 Henk 'm!

  • himlims_
  • Registratie: Juni 2000
  • Niet online

himlims_

🐧 Linux HOoligan

ik moet zeggen;
verrektes interresant topic
ik ben nog een beginnende php'er (ja zo'n doxa dude :))
maar wil 't wel echt leren, hier vind je toch toch de uitleg (soms) om toch 't .'je op de I te zetten ;)

⭐Game Profiles: 🕹️Steam - 🎮PSN - 🇪🇦 GoT_Hollandhards


Acties:
  • 0 Henk 'm!

  • InZane
  • Registratie: Oktober 2000
  • Laatst online: 16:42
riezebosch schreef op 08 april 2003 @ 13:53:
Nogal "trots" op m'n eigen quicksort routine (die mijn eigen LinkedList sorteerd):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
template <class OBJ>
void sort(Item<OBJ> * start, Item<OBJ> * end)
{
    Item<OBJ> * i = start;
    Item<OBJ> * j = end;
    OBJ temp;

    while (i != j)
    {
        while (i != j && i->CurrItem <= end->CurrItem)
        {
            i = i->NextItem;
        }

        while (i != j && j->CurrItem >= end->CurrItem)
        {
            j = j->PrevItem;
        }

        temp = j->CurrItem;
        j->CurrItem = i->CurrItem;
        i->CurrItem = temp;
    }

    temp = end->CurrItem;
    end->CurrItem = j->CurrItem;
    j->CurrItem = temp;

    if (start != i && start->NextItem != i)
        sort(start, i->PrevItem);

    if (end != j && end->PrevItem != j)
        sort(j->NextItem, end);
}

Sorry voor het gebrek aan commentaar O-)
Da's toch een doodgewone 'bubble sort' :)
Een iets minder efficiente manier van sorteren, maar werkt verder wel oke..

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:36

Creepy

Tactical Espionage Splatterer

InZane schreef op 08 April 2003 @ 16:30:
[...]


Da's toch een doodgewone 'bubble sort' :)
Een iets minder efficiente manier van sorteren, maar werkt verder wel oke..
Bubblesort? Dan vraag ik me toch af wat die recursieve aanroep in z'n code doet ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Mijn LR(k) parser. :P Parst mbv een action/goto table tokenstreams. action/goto tables zijn gegenereerd met eigen parser generator. Layout is erg breed, sue me ;)

De parser generator bevat ook veel leuke routines, maar om die allemaal te posten wordt wat veel ;)

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/// <summary>
/// Parses the tokens supplied using the LR(k) algorithm by using the action and the goto tables.
/// When the parser reduces a rule, it will call the handler corresponding to the non-terminal on the
/// left hand side of the rule. All stack entries popped from the stack are passed along to the handler.
/// </summary>
/// <returns>The last stack entry from the parsestack which holds the reduce info of the 0-production rule.</returns>
public ParseStackEntry ParseLR()
{
    ParseStackEntry pseToReturn, pseToPush;

    pseToReturn.EmitterResult=null;
    pseToReturn.Type = ParseStackEntryType.Unknown;
    pseToReturn.State=0;
    pseToReturn.NonTerminalReduced=0;
    pseToReturn.TokenScanned=null;

    // push on the stack the state 0.
    pseToPush = new ParseStackEntry();
    pseToPush.EmitterResult=null;
    pseToPush.Type = ParseStackEntryType.Unknown;
    pseToPush.State=0;
    pseToPush.NonTerminalReduced=-1;
    pseToPush.TokenScanned=null;
    m_stkParseStack.Push(pseToPush);

    try
    {
        // for each token in the queue, use the action table to perform actions. Use the
        // goto table to produce states when reducing non-terminals.
        // set accepted flag to false so we can see at the end of the loop if we should do
        // error recovery or not.
        bool    bTokenStreamAccepted=false;
        while(m_qTokenList.Count > 0)
        {
            // grab the token from the queue
            IToken toToken = (IToken)m_qTokenList.Peek();

            // With the current state on the stack and the Token read from the queue, we can determine an
            // action in the action table. Parser will crash when a wrong actiontable is passed into
            // this engine and/or wrong tokenid's. 
            ActionGotoTableEntry agteToExecute = m_arrActionTable[toToken.TokenID, ((ParseStackEntry)m_stkParseStack.Peek()).State];

            // check what to do
            switch((ActionGotoTableEntryType)agteToExecute.Type)
            {
                case ActionGotoTableEntryType.Accept:
                    // done. Pop stack object from stack, which should hold the complete parse result or at least
                    // info to retrieve the complete parse result in the special parser

                    // Call the rule handler and store it into the stackitem to return
                    pseToReturn.EmitterResult = ReduceRule(agteToExecute);
                    pseToReturn.Type = ParseStackEntryType.RuleReduceResult;
                    pseToReturn.NonTerminalReduced = -1;
                    pseToReturn.TokenScanned = null;

                    // pop the token from the queue. By definition this is an EOF token and by definition this can be ignored.
                    toToken=(IToken)m_qTokenList.Dequeue();

                    bTokenStreamAccepted = true;
                    break;
                case ActionGotoTableEntryType.Error:
                    // remove the token from the token stream
                    toToken=(IToken)m_qTokenList.Dequeue();

                    // Push the token as an Error onto the stack. When the stack elements are reduced, this
                    // element is taken into account and passed along to the specialized parser.
                    pseToPush = new ParseStackEntry();
                    pseToPush.EmitterResult=null;
                    pseToPush.Type = ParseStackEntryType.Error;
                    // Copy the state located currently onto the stack, so this error will have no effect on the
                    // further execution of the LR(0) parser.
                    pseToPush.State = ((ParseStackEntry)m_stkParseStack.Peek()).State;
                    pseToPush.NonTerminalReduced=-1;
                    pseToPush.TokenScanned = toToken;

                    // push the token onto the tack
                    m_stkParseStack.Push(pseToPush);
                    break;
                case ActionGotoTableEntryType.Goto:
                    // bad action table
                    throw new ApplicationException("Internal Error: bad action table: goto statement in action table.");
                    // no break statement needed.
                case ActionGotoTableEntryType.Reduce:
                    ProductionRule prToReduce = (ProductionRule)m_alGrammar[agteToExecute.Value];
                    object oReduceResult = ReduceRule(agteToExecute);

                    // Read from the Goto table the new state to push onto the stack. We use the current
                    // top state on the stack and the lefthand side of the reduced production rule. LeftHandSide id's are 1 based (0 is reserved for 'S', the start symbol)
                    // and therefor we have to decrease that number for indexing into the 0-based gototable
                    ActionGotoTableEntry gtteNewState = (ActionGotoTableEntry)m_arrGotoTable[prToReduce.LeftHandSide-1, ((ParseStackEntry)m_stkParseStack.Peek()).State];

                    if(gtteNewState.Type == ActionGotoTableEntryType.Goto)
                    {
                        // add new state to stack
                        pseToPush = new ParseStackEntry();
                        pseToPush.EmitterResult = oReduceResult;
                        pseToPush.State= gtteNewState.Value;
                        pseToPush.TokenScanned = null;
                        pseToPush.Type = ParseStackEntryType.RuleReduceResult;
                        pseToPush.NonTerminalReduced = prToReduce.LeftHandSide;
                        m_stkParseStack.Push(pseToPush);
                    }
                    else
                    {
                        // error in goto table
                        throw new ApplicationException("Internal Error: wrong goto table.");
                    }
                    break;
                case ActionGotoTableEntryType.Shift:
                    // remove the token from the token stream
                    toToken=(IToken)m_qTokenList.Dequeue();

                    // Perform the shift
                    pseToPush = new ParseStackEntry();
                    pseToPush.State = agteToExecute.Value;
                    pseToPush.TokenScanned = toToken;
                    pseToPush.Type = ParseStackEntryType.TerminalShift;
                    pseToPush.NonTerminalReduced = -1;          // will be ignored, since IsResultOfReduce is false.
                    pseToPush.EmitterResult = null;
                    m_stkParseStack.Push(pseToPush);
                    break;
            }
        }
        if(!bTokenStreamAccepted)
        {
            // the stack is still filled with elements and due to some error the
            // parsing was stopped, and the final rule can't be reduced. Do a recovery, reduce
            // the complete stack as the rule number 0 and call the rule 0 handler. Return the result
            // of that handler. 
            pseToReturn.EmitterResult = ReduceRule(0, m_stkParseStack.Count-1, false);
            pseToReturn.Type = ParseStackEntryType.RuleReduceResult;
            pseToReturn.NonTerminalReduced = -1;
            pseToReturn.TokenScanned = null;
        }
        return pseToReturn;
    }
    catch(Exception ex)
    {
        // bubble
        throw new Exception("Internal Error occured in LR(1) engine.", ex);
    }
}

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
riezebosch schreef op 08 April 2003 @ 13:53:
Nogal "trots" op m'n eigen quicksort routine (die mijn eigen LinkedList sorteerd):
(code)
Sorry voor het gebrek aan commentaar O-)
Lijkt wel erg op de quicksort van Sedgewick

[edit]Dat is dus niet zo. Die van Sedgewick zie ik nu is ong de helft qua grootte ;)

[ Voor 24% gewijzigd door EfBe op 08-04-2003 17:06 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Varienaja schreef op 08 April 2003 @ 15:23:
Niets is zo geniaal als de formele specificatie van Quicksort:
code:
1
2
3
sort x:xs = (sort kleintjes) ++ x ++ (sort groten)
            where kleintjes = [ k | k<-xs ; k<x]
                  groten    = [ g | g<-xs ; g>=x]
Ja, die is inderdaad erg mooi. En het mooiste is nog dat je dit letterlijk in Haskell kan intikken en dan werkt het :o
Haskell? WTF is Haskell? Een erg mooi functioneel taaltje: www.haskell.org Met gratis interpreter.

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Nu online
Scarecrow schreef op 08 april 2003 @ 14:41:
:+
PHP:
1
2
3
<?php
    echo "GoT"; // Geeft de tekst 'GoT' als output
?>


Nou wat is daar aan mis :)
Zo, stuk netter :P

|>


Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
WildernessChild schreef op 08 April 2003 @ 17:12:
[...]

Ja, die is inderdaad erg mooi. En het mooiste is nog dat je dit letterlijk in Haskell kan intikken en dan werkt het :o
Haskell? WTF is Haskell? Een erg mooi functioneel taaltje: www.haskell.org Met gratis interpreter.
[insectensex]

in haskell moet het net even anders:
Haskell:
1
2
3
sort (x:xs) = (sort kleintjes) ++ [x] ++ (sort groten)
            where kleintjes = [ k | k<-xs , k<x]
                  groten    = [ g | g<-xs , g>=x]

of in 1 regel:
Haskell:
1
sort (m:xs) = [ x | x <- xs , x < m] ++ m : [ x | x <- xs , x >= m]

[/insectensex]

in dezelfde categorie (oneliners) valt ook de volgende methode om alle priemgetallen in een lijst te zetten:
Haskell:
1
priemGetallen = filter (\p -> [f | f <- [1..p], p `mod` f == 0] == [1,p]) [1..]

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik zit me zo nu en dan af te vragen of ik wel in het juiste topic zit! ;)

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
Ik vraag me af of er wel mensen zijn die uberhaupt al die lappen code doornemen. :o

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
Alarmnummer schreef op 08 april 2003 @ 17:33:
Ik zit me zo nu en dan af te vragen of ik wel in het juiste topic zit! ;)
Als ik me niet vergis, hebben we nog geen code van jou gezien. ;) :P

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

10 print "Alarmnummer is cool"
20 goto 10

:P

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

* ACM denkt dat er een af en toe 'mooi' met 'knap' verward wordt :+

Een perl-one-liner vind ik zelden tot nooit mooi. Het is wel enorm knap dat iemand zoiets kan bedenken :)

Alarmnummer: goto's worden toch als "vies" beschouwd? :P

Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Dit is trouwens ook nog een heel leuk stukje code:

code:
1
2
3
record List<Alpha>{
    List<List<Alpha>> _field;
}


En nou maar hopen dat alles een beetje lui is ;)

Acties:
  • 0 Henk 'm!

  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 16:23
wat ik niet snap is dat mensen soms hun variabele _ voorzetten. Waarom eigenlijk?? Ik zie dat bij alarmnummer en bij whoami stukjes code :)

Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 16-09 20:14
Volgens mij om aan te geven dat een variabele een private oftewel een member variabele van een class is. Ik gebruik zelf altijd de m_ prefix

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Wat ik zelf wel aardig gevonden vind en in de praktijk ook best nuttig is een enumerator die filtert op bepaalde waardes. Dit betekent dat een client-programmere van je library zeer gemakkelijk door 'verschillende' lijsten kan enumeraten, terwijl deze in feite in 1 lijst staan (en hierdoor de integriteit wordt bewaard en de rest van het programma veel simpeler werkt)

De onderstaande code is eigenlijk in C# geschreven, maar de C# tag ondersteunt geen syntax-coloring :'(
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class ContactList : Hashtable
{
            /// <summary>
            /// Enumerating through this list will only process contacts which are on your forward list:
            /// these are the contacts on YOUR contactlist.
            /// </summary>
            public class ForwardListEnumerator : ContactList.ListEnumerator
            {
                public ForwardListEnumerator(IDictionaryEnumerator listEnum)
                    : base(listEnum)
                {
                }

                /// <summary>
                /// Used by the foreach language structure
                /// </summary>
                /// <returns>True when there are still items left</returns>
                public override bool MoveNext()
                {                   
                    while(baseEnum.MoveNext())
                    {
                        // filter on the forward boolean
                        if((((Contact)baseEnum.Value).lists & MSNList.ForwardList) > 0)
                            return true;
                    }
                    return false;
                }
            }

}


En dan verderop een public property. Programmeurs kunnen dan dus:
foreach(Contact contact in contactList.ForwardList) { .. }
intikken
Java:
1
2
3
4
public ContactList.ForwardListEnumerator ForwardList
        {
            get { return new ContactList.ForwardListEnumerator(contacts.GetEnumerator()); }
        }


En tja mooie code is zeer subjectief (lelijke code is meestal gewoon een feit ;))
Wat ik zelf belangrijk vind is als een 3rd party component of library intuitief werkt en dat je het idee hebt dat ze het niet moeilijker proberen te maken dan het feitelijk is.
Maar dit valt misschien eerder onder mooi 'ontwerp'

Acties:
  • 0 Henk 'm!

  • marcelk
  • Registratie: December 2000
  • Niet online
Afleiding door ir W.H.J. Feijen _/-\o_
www.cs.olemiss.edu/~hcc/reports/feijen_cubes.pdf
afleiding van een programmaatje dat de machten van n^3 berekent, voor n=0,..,99, zonder gebruik te maken van vermenigvuldigen o.i.d. , alleen optellen. En dit in een O(n) algoritme !

Zie pagina 8 in het PDF bestand voor het complete programmaatje.

[ Voor 12% gewijzigd door marcelk op 08-04-2003 20:20 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
Just_a_Gamer schreef op 08 April 2003 @ 19:45:
wat ik niet snap is dat mensen soms hun variabele _ voorzetten. Waarom eigenlijk?? Ik zie dat bij alarmnummer en bij whoami stukjes code :)
Ik doe dat gewoon om aan te geven dat een variabele een member-variabele (of field) is van die class.
De properties die die variabelen accessen hebben dan dezelfde naam als die member-variabele, behalve dan zonder underscore, en beginnend met een hoofdletter.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
persoonlijk was ik hier wel blij mee: (bepaalt adhv een gegeven int value voor unix-style bestandspermissies of een HTML checkbox al dan niet "CHECKED" moet zijn, en de juiste "caption" bij de checkboxes zet. ja nee het gaat "nergens" over, maar IK was er blij mee :P

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
define("SUB_OTHER_EXECUTE",1 << 0); 
define("SUB_OTHER_WRITE"  ,1 << 1);
define("SUB_OTHER_READ"   ,1 << 2);
define("SUB_GROUP_EXECUTE",1 << 3); 
define("SUB_GROUP_WRITE"  ,1 << 4);
define("SUB_GROUP_READ"   ,1 << 5);
define("SUB_OWNER_EXECUTE",1 << 6); 
define("SUB_OWNER_WRITE"  ,1 << 7);
define("SUB_OWNER_READ"   ,1 << 8);

..

class SUB_PermissionsField extends SUB_FormField
{
    ..

    function setPermissionCheckBoxes($iPermissions)
    {
        $aCaptions = array("X", "W", "R");
        $m = 0;
        for($n = SUB_OTHER_EXECUTE; $n <= SUB_OWNER_READ; $n <<= 1)
        {
            $this->m_aPermissions[$n] = ($iPermissions & $n) ? "CHECKED" : "";
            $this->m_aCaptions[$n] = $aCaptions[$m];
            $m = ($m < count($aCaptions)-1) ? $m+1 : 0;     
        }
    }
}

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
Ik heb hier ook nog ergens een UML liggen van een errorlogger waar ik een aantal maanden geleden mee bezig was. Het bijhorende topic kan je hier ook nog wel vinden.

Afbeeldingslocatie: http://users.pandora.be/fgzone/schema5.jpg

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15:24

Robtimus

me Robtimus no like you

marcelk schreef op 08 April 2003 @ 20:17:
Afleiding door ir W.H.J. Feijen _/-\o_
www.cs.olemiss.edu/~hcc/reports/feijen_cubes.pdf
afleiding van een programmaatje dat de machten van n^3 berekent, voor n=0,..,99, zonder gebruik te maken van vermenigvuldigen o.i.d. , alleen optellen. En dit in een O(n) algoritme !

Zie pagina 8 in het PDF bestand voor het complete programmaatje.
Aangezien ik al 4 jaar lang les van Wim Feijen, Rob Hoogerwoord en wijlen Netty van Gasteren (de volgers van Dijkstra) heb gehad, moet ik zeggen dat dit eigenlijk vrij basic is. Het verbaast me alleen wel dat Feijen het zo eenvoudig opschrijft, maar dat komt omdat ik zovaak heb gewerkt met Hoare tripples en zo. Bij ons op de TU/e vertelt ie hetzelfde in de helft van de pagina's of zo :)

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Ik vind react wel een mooi framework. Maar dat ga ik niet posten hier :P

Ook de RML parser zullen jullie moeten ontberen :+ zo ook de Disector en de xml-output generator.

Saai he? :+

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
Hoe kan dat nu chem. :?
Hoe kan je nu PHP rijmen met 'fraaie code'? :+

tot zover deze flame

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

whoami schreef op 08 April 2003 @ 21:16:
Hoe kan dat nu chem. :?
Hoe kan je nu PHP rijmen met 'fraaie code'? :+

tot zover deze flame
Fraaie code is wat anders dan een degelijk framework. Alhoewel natuurlijk sterk gerelateerd :)

De mooiste oplossingen kunnen helaas niet in PHP.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
Waar blijft de topicstarter trouwens met zijn voorbeelden? :P

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Wie komt er met een functie die voor elke preconditie, elke mogelijke postcoditie realiseerd? ;)

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Acties:
  • 0 Henk 'm!

  • marcelk
  • Registratie: December 2000
  • Niet online
IceManX schreef op 08 april 2003 @ 21:11:
[...]
...Hoare tripples en zo. Bij ons op de TU/e vertelt ie hetzelfde in de helft van de pagina's of zo :)
Bij mij op de TU/e ook ;) . Ik moest alleen effe snel een URL neerzetten. Het klopt inderdaad dat Feijen dat spul produceert als ware het proza ;) , kort en bondig.

offtopic:
IceManX, heb je nu ook Multiprogramming ?

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15:24

Robtimus

me Robtimus no like you

marcelk schreef op 08 April 2003 @ 23:18:
offtopic:
IceManX, heb je nu ook Multiprogramming ?
offtopic:
al gehaald met een 7, maar vraag me niet hoe... ik kon niet eens het vraagstuk oplossen

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:59

crisp

Devver

Pixelated

Uiteraard ben ik trots op de code waarmee ik deze contest (zo goed als) gewonnen heb. Is iets teveel code om hier te plaatsen, maar de laatste versie (inclusief nog wat verbeteringen tov de originele ingezonden code) is hier te vinden.
Een preview is echter misschien nog leuker: http://therealcrisp.xs4all.nl/contest/dno.php?method=display

klein stukje copy-paste dan van de javascript implementatie van de iteratieve floodfill (waarvan het origineel trouwens niet helemaal van mezelf is; ik heb 'm enkel verbeterd):

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function lookUp(y,x,color) {

  var block = new Array([y,x]);
  var count = 0;
  var i = 0;
  var u,d;
  sy = y;
  ey = y;
  sx = x;
  ex = x+1;

  do {

    y = block[i][0];
    x = block[i][1];
    u = 1;
    d = 1;

    while (grid[y][--x] === color);

    if (++x < sx) sx = x;

    while (grid[y][x] === color) {

      grid[y][x] = 0;
      gridDisplay[y][x].backgroundColor = colors[9];
      count++;

      if (grid[y-1][x] !== color) u=1;
      else if (u) {
        block[i++] = [y-1, x];
        u = 0;
        if (y === sy) sy--;
      }
      if (grid[y+1][x] !== color) d=1;
      else if (d) {
        block[i++] = [y+1, x];
        d = 0;
        if (y === ey) ey++;
      }

      x++;

    }

    if (x > ex) ex = x;

  } while (i--);

  return count;

}

[ Voor 10% gewijzigd door crisp op 09-04-2003 22:14 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Stukje om bit 0 met 15 te wisselen, 1 met 14, 2 met 13 enz...
code:
1
2
3
4
a = ((a&0xFF00)>>8) | ((a&0x00FF)<<8)
a = ((a&0xF0F0)>>4) | ((a&0x0F0F)<<4)
a = ((a&0xCCCC)>>2) | ((a&0x3333)<<2)
a = ((a&0xAAAA)>>1) | ((a&0x5555)<<1)

Niet zelf verzonnen, stond een keer in een linux login

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


Acties:
  • 0 Henk 'm!

Verwijderd

wisseltruukjes zijn ook leuk ja, bijvoorbeeld de waardes van 2 vars omwisselen zonder de declaratie van een derde:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int x = 5;
int y = 2;

x = x - y;
y = x + y;
x = y - x;

//of 
y = x ^ y 
x = x ^ y 
y = x ^ y

//of

x ^= y ^= x ^= y

Acties:
  • 0 Henk 'm!

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 16:52
Dit zijn twee stored procedures die handig zijn voor sql tree structuren.
Er wordt geen gebruik gemaakt van recursie, aangezien je maar 200 geneste stored procedures kan hebben.

Er wordt gebruik gemaakt van temp tables die elke keer opnieuw wordt opgebouwd als er veranderingen komen in de tabel Nodes.

Code die het pad van en naar nodes in een tabel zet
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
ALTER PROCEDURE cu_Nodes_BuildParentTable
( 
    @Start Int,
    @End Int
) 
AS

SET NOCOUNT ON

DECLARE @Parent INT
DECLARE @SortID INT

SELECT @SortID = 1
SELECT @Parent = @End

DELETE FROM NodeParents WHERE FromNodeID = @Start AND ToNodeID = @End

INSERT INTO NodeParents VALUES
(
    @Start,
    @End,
    @End,
    @SortID
)
    

WHILE @Parent <> @Start AND NOT @Parent IS NULL
BEGIN
    SELECT @SortID = @SortID + 1
    SELECT @Parent = ParentNodeID
    FROM Nodes
    WHERE NodeID = @Parent
        
    INSERT INTO NodeParents VALUES
    (
        @Start,
        @End,
        @Parent,
        @SortID
    )
    
END

SELECT     NodeParents.NodeID, Nodes.NodeTypeID, Nodes.ParentNodeID, Nodes.NodeName, Nodes.NodeDesc, Nodes.Publish, Nodes.CreationDate, 
                      Nodes.PublishDate, Nodes.LastModified, Nodes.CreatedByUserID, Nodes.PublishedByUserID, Nodes.LastModifiedByUserID, Nodes.StartDocumentID, 
                      NodeParents.FromNodeID, NodeParents.ToNodeID
FROM         Nodes INNER JOIN
                      NodeParents ON Nodes.NodeID = NodeParents.NodeID
WHERE     (NodeParents.FromNodeID = @Start) AND (NodeParents.ToNodeID = @End)
ORDER BY SortID DESC

SET NOCOUNT OFF


Code die alle childs van een node ophaalt
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
ALTER PROCEDURE cu_Nodes_BuildChildTable
(
    @NodeID int
)
AS

SET NOCOUNT ON

DECLARE @curNodeID int
DECLARE @curParentNodeID int
DECLARE @TreeLevel int
DECLARE @NodeCount int
DECLARE @NodeName varchar(50)

SET @NodeCount = 0

CREATE TABLE #stack (stkNodeID int, stkParentNodeID int, TreeLevel int)
DELETE FROM NodeChilds WHERE NodeID = @NodeID

--Insert the first record
INSERT NodeChilds
    SELECT @NodeID, NodeID, ParentNodeID, 1, @NodeCount
    FROM Nodes
    WHERE NodeID = @NodeID


INSERT #STACK
    SELECT NodeID, ParentNodeID, 1
    FROM Nodes
    WHERE ParentNodeID = @NodeID
    ORDER BY NodeID DESC
    
    SELECT @TreeLevel = 1
    
    WHILE @TreeLevel > 0
        BEGIN
            IF EXISTS (SELECT TOP 30000 * FROM #stack WHERE TreeLevel = @TreeLevel ORDER BY stkNodeID DESC)
                BEGIN
                    
                    SELECT @curNodeID = stkNodeID, @CurParentNodeID = stkParentNodeID
                    FROM #stack
                    WHERE TreeLevel = @TreeLevel
                    ORDER BY stkNodeID DESC
                    
                    INSERT NodeChilds VALUES(@NodeID, @curNodeID, @curParentNodeID, @TreeLevel, 0)
                    UPDATE NodeChilds SET Children = Children + 1 WHERE ChildNodeID = @curParentNodeID
                    
                    DELETE FROM #stack
                    WHERE TreeLevel = @TreeLevel
                    AND stkNodeID = @curNodeID
                    
                    INSERT #stack
                    SELECT NodeID, ParentNodeID, @TreeLevel+1
                    FROM Nodes
                    WHERE ParentNodeID = @curNodeID
                    ORDER BY NodeID DESC
                    
                    IF @@rowcount > 0
                        SELECT @TreeLevel = @TreeLevel+1
                    
                    SET @NodeCount = @NodeCount + 1
                END
            ELSE
                BEGIN
                    SELECT @TreeLevel = @TreeLevel-1
                END
        END


Geen comments.....komt nog...

some credits go to Raptorix :D

Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 13:29
Sinds ik het 'Nested Set model' ken om trees in een dbms op te slaan, maak ik bijna nooit meer gebruik van het 'Adjacency model'.
Het voordeel is dat bovenstaande stored procedures door 1 query vervangen kunnen worden. Het invoegen van nodes is iets meer werk dan normaal, maar lang niet zoveel werk als de sp's hierboven.
Ik liep tegen deze fraaie datastructuur aan op webgoeroe.net.

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Sjaaky: dat is een structuur ooit bedacht door Joe Celko, een van de SQL-standaardisatie commissieleden. Hij heeft dit uitgebreid uitgelegd in de sql newsgroups. Het is inderdaad een zeer slimme vondst die goed de kracht van sql benut (set based).

(zie o.a.: http://www.google.com/gro...1%40nnrp1.deja.com&rnum=9 )

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10:39
[...]

Da's toch een doodgewone 'bubble sort' :)
Een iets minder efficiente manier van sorteren, maar werkt verder wel oke..
Bedankt voor het compliment dat je de routine er net zo eenvoudig uit vindt (?) zien als een bubblesort ;) Okok, ik heb hem niet zelf bedacht, maar wel zelf gesnapt en ook zelf gemaakt :*) En kan 'm nog uitleggen ook. Als daar liefhebbers voor zijn... Of snapt iedereen de quicksort al?

edit:

Het was niet mijn bedoeling om gelijk deze hele topic af te kappen...

[ Voor 12% gewijzigd door riezebosch op 09-04-2003 19:11 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 17-09 21:27

pistole

Frutter

riezebosch schreef op 09 April 2003 @ 13:32:
[...]


Bedankt voor het compliment dat je de routine er net zo eenvoudig uit vindt (?) zien als een bubblesort ;) Okok, ik heb hem niet zelf bedacht, maar wel zelf gesnapt en ook zelf gemaakt :*) En kan 'm nog uitleggen ook. Als daar liefhebbers voor zijn... Of snapt iedereen de quicksort al?

edit:

Het was niet mijn bedoeling om gelijk deze hele topic af te kappen...
Ik heb nog niet de moeite genomen om je routine te doorgronden, maar, al was het alleen maar om dit topic weer onder de aandacht te brengen: leg maar uit! ;)

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Nu online

Tux

chem schreef op 08 April 2003 @ 21:14:
Ik vind react wel een mooi framework. Maar dat ga ik niet posten hier :P

Ook de RML parser zullen jullie moeten ontberen :+ zo ook de Disector en de xml-output generator.

Saai he? :+
De RML parser is volgens mij qua source ook zo lang dat PHP bij het weergeven van het topic dan spontaan time-outs geeft :+

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
* whoami wacht nog altijd op code van mbravenboer..... :+

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

mbravenboer schreef op 08 April 2003 @ 13:38:
[...]
Uiteraard zijn we altijd geinteresseerd in schoonheid. Lelijke zaken probeer je te verstoppen en ga je zeker niet tentoonstellen.
whoami schreef op 10 April 2003 @ 21:32:
* whoami wacht nog altijd op code van mbravenboer..... :+
Hum >:)

Acties:
  • 0 Henk 'm!

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 07:00

Tomatoman

Fulltime prutser

Niet geniaal, niet bijzonder prachtig, maar wel een nuttig (en herbruikbaar!) resultaat met weinig regels code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
unit PassEdit;

interface

uses Windows, Controls, StdCtrls;

type
  { TPasswordEdit is a password edit box with theme support }
  
  TPasswordEdit = class(TEdit)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

implementation

procedure TPasswordEdit.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  { Windows XP: If the edit control is from user32.dll, each character
    is displayed as an asterisk. However, if the edit control is from
    comctl32.dll version 6, characters are displayed as black circles. }
  Params.Style := Params.Style or ES_PASSWORD;
end;

end.

Een goede grap mag vrienden kosten.


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Dit is een functie uit mijn GUI-framework in progress. De functie zorgt ervoor dat windows de juiste messages ontvangen mbt muis-events. Btw: layout-fucker :P

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
/* void DispatchMouseEvents(): dispatches mouse events

   params: none

   returns: nothing

   remarks: this function should only be called from within
            CDesktop::HandleEvents()
 */
void CDesktop::DispatchMouseEvents()
{
   // see if there's anything to be done...
   SPoint ptRelPos = g_poMouse->GetRelativePos();
   SPoint ptMousePos = g_poMouse->GetAbsolutePos();
   
   CWnd *pwMouseOverWindow, *pwChildWindow;
   SPoint ptClientPos;

   // check if mouse moved
   if (ptRelPos.x || ptRelPos.y)
   {
      // see if we're already clicking...
      if (g_poMouse->GetButtons() & 3)
      {
         CWnd *pwClickedWindow = this;

         // find the input focus window
         while (pwClickedWindow->GetInputFocusWindow()) pwClickedWindow = pwClickedWindow->GetInputFocusWindow();

         SPoint ptWinPos = ptMousePos;

         // see if the input focus window is the window under the cursor
         if (WindowFromPoint(ptMousePos.x, ptMousePos.y, ERecurse) != pwClickedWindow)
         {
            // see if the window the mouse was over the previous frame
            // *was* the clicked window, if so send mouse leave message
            if (WindowFromPoint(ptMousePos.x - ptRelPos.x, ptMousePos.y - ptRelPos.y, ERecurse) == pwClickedWindow)
            {
               pwClickedWindow->Message(AWM_MOUSE_LEAVE, 0, 0);
            }
         }
         else
         {
            // translate the coordinate and send a mouse move message
            pwClickedWindow->ScreenToWindow(&ptWinPos);
            pwClickedWindow->Message(AWM_MOUSE_MOVE, (ptWinPos.x << 16) | ptWinPos.y, 0);
         }
      }
      else
      {
         // find window under mouse cursor step by step
         CWnd *pwFirstDeferFocusWindow;
         SPoint ptClientPos;

         ptMousePos = g_poMouse->GetAbsolutePos();

         pwMouseOverWindow = this;
         pwFirstDeferFocusWindow = NULL;

         ptClientPos = ptMousePos;

         while (true)
         {
            // translate screen coordinates
            ptClientPos = ptMousePos;
            pwMouseOverWindow->ScreenToClient(&ptClientPos);

            // find window at coordinate
            pwChildWindow = pwMouseOverWindow->WindowFromPoint(ptClientPos.x, ptClientPos.y, ENoStatics);

            if (pwChildWindow != pwMouseOverWindow->GetMouseFocusWindow() && !pwFirstDeferFocusWindow)
            {
               pwFirstDeferFocusWindow = pwMouseOverWindow->GetMouseFocusWindow();
            }
            else if (pwFirstDeferFocusWindow)
            {
               if (pwChildWindow == pwMouseOverWindow) break;

               // translate screen coordinates to window-space
               ptClientPos = ptMousePos;
               pwMouseOverWindow->ScreenToWindow(&ptClientPos);

               pwMouseOverWindow->Message(AWM_MOUSE_MOVE, (ptClientPos.x << 16) | ptClientPos.y, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState());
               pwMouseOverWindow->GetParent()->SetMouseFocusWindow(pwMouseOverWindow, true);
            }

            if (pwChildWindow == pwMouseOverWindow) break;

            pwMouseOverWindow = pwChildWindow;
         }

         // translate screen-space to window-space (aot client-space)
         ptClientPos = ptMousePos;
         pwMouseOverWindow->ScreenToWindow(&ptClientPos);

         pwMouseOverWindow->Message(AWM_MOUSE_MOVE, (ptClientPos.x << 16) | ptClientPos.y, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState());
         if (pwMouseOverWindow->GetParent()) pwMouseOverWindow->GetParent()->SetMouseFocusWindow(pwMouseOverWindow, true);

         // notify all windows that have lost focus (all windows below
         // pwFirstDeferFocusWindow)
         while (pwFirstDeferFocusWindow)
         {
            pwFirstDeferFocusWindow->Message(AWM_MOUSE_LEAVE, (long) pwMouseOverWindow, 0);
            if (pwFirstDeferFocusWindow->GetParent()) 
            {
               pwFirstDeferFocusWindow->GetParent()->SetMouseFocusWindow(pwFirstDeferFocusWindow, false);
            }

            pwFirstDeferFocusWindow = pwFirstDeferFocusWindow->GetMouseFocusWindow();
         }
      }
   }
   
   // check to see if buttons were pressed/released
   if (g_poMouse->GetButtonChanges())
   {
      WORD nChanges = g_poMouse->GetButtonChanges();

      CWnd *pwInputFocusWindow, *pwActiveWindow;
      long lMessage;

      // see if any buttons went down
      if (nChanges & (CMouse::ELeftDown | CMouse::ERightDown | CMouse::EMidDown))
      {
         bool bDiffFocusFound = false;

         pwActiveWindow = pwMouseOverWindow = this;
         pwInputFocusWindow = GetInputFocusWindow();

         while (pwActiveWindow->GetInputFocusWindow()) pwActiveWindow = pwActiveWindow->GetInputFocusWindow();
   
         // find window under cursor and blur focus from current input focus
         // tree
         while (true)
         {
            // translate screen coordinates
            ptClientPos = ptMousePos;
            pwMouseOverWindow->ScreenToClient(&ptClientPos);

            // find window at position
            pwChildWindow = pwMouseOverWindow->WindowFromPoint(ptClientPos.x, ptClientPos.y, ENoStatics);

            if (pwChildWindow == pwMouseOverWindow) break;

            // see if the window found is different than the input focus window
            if (pwChildWindow != pwInputFocusWindow) bDiffFocusFound = true;

            // next please...
            pwMouseOverWindow = pwChildWindow;
            if (!bDiffFocusFound) pwInputFocusWindow = pwInputFocusWindow->GetInputFocusWindow();

            if (pwMouseOverWindow->GetParent()) pwMouseOverWindow->GetParent()->SetInputFocusWindow(pwMouseOverWindow, true);
         }

         // see if we found a different focus
         if (bDiffFocusFound || pwInputFocusWindow != pwChildWindow)
         {
            // set all windows below the input focus window to defocused... if
            // you get what I mean... :)
            while (pwInputFocusWindow) 
            {
               if (pwInputFocusWindow->GetParent()) pwInputFocusWindow->GetParent()->SetInputFocusWindow(pwInputFocusWindow, false);
               pwInputFocusWindow->Deactivate();

               pwInputFocusWindow = pwInputFocusWindow->GetInputFocusWindow();
            }
         }

         // set the mouse over window's input focus to none
         pwMouseOverWindow->SetInputFocusWindow(pwMouseOverWindow->GetInputFocusWindow(), false);
         pwMouseOverWindow->Deactivate();

         // focus to this window
         if (pwMouseOverWindow->GetParent()) pwMouseOverWindow->GetParent()->SetInputFocusWindow(pwMouseOverWindow, true);

         // find out mouse-down coordinate
         ptClientPos = ptMousePos;
         pwMouseOverWindow->ScreenToWindow(&ptClientPos);

         // see what message we should send
         if (nChanges & CMouse::ELeftDown) lMessage = AWM_MOUSE_LEFT_DOWN;
         else if (nChanges & CMouse::ERightDown) lMessage = AWM_MOUSE_RIGHT_DOWN;
         else if (nChanges & CMouse::EMidDown) lMessage = AWM_MOUSE_MID_DOWN;

         // see if it's a double click (iow if the last click was less than half
         // a second ago, and at the same window, and within the specified
         // radius)
         if (g_oAurora.GetClock() - m_dwLastClickTime <= m_dwDoubleClickTime && pwMouseOverWindow == pwActiveWindow && abs(ptMousePos.x - m_ptLastClick.x) <= m_nDoubleClickRadius && abs(ptMousePos.y - m_ptLastClick.y) <= m_nDoubleClickRadius)
         {
            // double click messages are (down_message + 3)
            lMessage += 3;

            m_dwLastClickTime = 0;
         }
         else
         {
            m_dwLastClickTime = g_oAurora.GetClock();
            m_ptLastClick = ptMousePos;
         }

         // send message
         if (!(pwMouseOverWindow->GetStyle() & CWnd::EDisabled)) pwMouseOverWindow->Message(lMessage, (ptClientPos.x << 16) | ptClientPos.y, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState());

         // activate and bring to front
         while (pwMouseOverWindow)
         {
            pwMouseOverWindow->BringToFront();
            pwMouseOverWindow->Activate();

            pwMouseOverWindow = pwMouseOverWindow->GetParent();
         }
      }
      // see if any buttons went up
      else if (nChanges & (CMouse::ELeftUp | CMouse::ERightUp | CMouse::EMidUp))
      {
         bool bDiffFocusFound = false;

         // first find the window under the cursor
         pwMouseOverWindow = WindowFromPoint(ptMousePos.x, ptMousePos.y, ERecurse);

         // then find the actual input focus window
         pwInputFocusWindow = this;

         while (pwInputFocusWindow->GetInputFocusWindow()) pwInputFocusWindow = pwInputFocusWindow->GetInputFocusWindow();

         CWnd *pwMOWP;

         pwMOWP = pwMouseOverWindow;

         // give input focus to all windows in the route to the window the mouse is over
         while (pwMOWP)
         {
            if (pwMOWP->GetParent()) pwMOWP->GetParent()->SetInputFocusWindow(pwMOWP, true);

            pwMOWP = pwMOWP->GetParent();
         }

         // see if the windows match
         if (pwInputFocusWindow != pwMouseOverWindow)
         {
            // see which button was clicked
            if (nChanges & CMouse::ELeftUp) lMessage = AWM_MOUSE_LEFT_UP;
            else if (nChanges & CMouse::ERightUp) lMessage = AWM_MOUSE_RIGHT_UP;
            else if (nChanges & CMouse::EMidUp) lMessage = AWM_MOUSE_MID_UP;

            // send message
            pwInputFocusWindow->Message(lMessage, (long) pwMouseOverWindow, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState());

            // send MouseLeave message (for windows that don't need to
            // respond to MouseOut but do respond to MouseLeave)
            if (!(pwInputFocusWindow->GetStyle() & CWnd::EDisabled)) pwInputFocusWindow->Message(AWM_MOUSE_LEAVE, (long) pwMouseOverWindow, 0);

            // activate window that mouse was left over...
            while (pwMouseOverWindow)
            {
               pwMouseOverWindow->BringToFront();

               pwMouseOverWindow = pwMouseOverWindow->GetParent();
            }
         }
         else
         {
            // translate coordinates
            ptClientPos = ptMousePos;
            pwMouseOverWindow->ScreenToWindow(&ptClientPos);

            // see what button was clicked
            if (nChanges & CMouse::ELeftUp) lMessage = AWM_MOUSE_LEFT_CLICK;
            else if (nChanges & CMouse::ERightUp) lMessage = AWM_MOUSE_RIGHT_CLICK;
            else if (nChanges & CMouse::EMidUp) lMessage = AWM_MOUSE_MID_CLICK;

            // send message
            if (!(pwMouseOverWindow->GetStyle() & CWnd::EDisabled)) pwMouseOverWindow->Message(lMessage, (ptClientPos.x << 16) | ptClientPos.y, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState());
         }
      }
   }
}
Ik heb er dagen aan gesleuteld, om het zo te krijgen. Elke functie, elk object, elke structure, elke enum en elke constante die aangeroepen wordt zit in mijn framework en is zelf geschreven.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
hmm hier is iets dat ik ooit eens tijdens het werk heb gedaan, tussen de soep en de patatten so to speak - toen nog in Excel 97 zie ik net, Een nuttig gebruik voor een spreadsheet imho.

http://www.onnos.com/bob.xls

Hij werkt met een macrootje maar wees gerust gaat niet iets doen met je harddisk - wel effe volgen wat ie zegt :)

edit:
het gekke is dat ie nog net zo traag gaat als 5 jaar geleden :)

[ Voor 10% gewijzigd door hobbit_be op 11-04-2003 01:42 ]


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Korben schreef op 10 April 2003 @ 23:45:
Dit is een functie uit mijn GUI-framework in progress. De functie zorgt ervoor dat windows de juiste messages ontvangen mbt muis-events. Btw: layout-fucker :P
Je kan dit veel beter opsplitsen in een paar functies hoor. Dit is een onplezierige lap code om mee te werken. En het dispatchen kan je veel beter doen mbv een visitor design pattern als je zelf ook de events maakt.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
interface MouseEvent{
     public void accepts(MouseEventVisitor v);
}

class MouseMoveEvent extends MouseEvent{
     public void accepts(MouseEventVisitor v){
           v.visit(this);
     } 
}

class MousePressedEvent extends MouseEvent{
     public void accepts(MouseEventVisitor v){
           v.visit(this);
     } 
}

class MouseReleasedEvent extends MouseEvent{
     public void accepts(MouseEventVisitor v){
           v.visit(this);
     } 
}

interface MouseEventVisitor{
      public void visit(MouseMoveEvent e);
      public void visit(MousePressedEvent e);
      public void visit(MouseReleasedEvent e);
}

class EventHandler implements MouseEventVisitor{
      
      public void handle(MouseEvent e){
            e.accepts(this);
      }

      public void visit(MouseMoveEvent e){
           ...mouse move afhandeling
      }
      
      public void visit(MousePressedEvent e){
           ...mouse pressed afhandeling
      }
      
      public void visit(MouseReleasedEvent e){
           ...mouse released afhandeling
      }

}

Er zijn trouwens nog wel meer manieren om te dispatchen. Maar ik zou het dispatchen en het afhandelen dus echt uit elkaar gaan halen, omdat die lap code te groot is.

Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 19:14
Dit gaat meer naar de kant van mongers. Hier heb je er één van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/perl -w                                    
use strict;
                                           $_='ev
                                       al("seek\040D
           ATA,0,                  0;");foreach(1..2)
       {;}my               @camel1hump;my$camel;
  my$Camel  ;while(             ){$_=sprintf("%-6
9s",$_);my@dromedary           1=split(//);if(defined($
_=)){@camel1hum        p=split(//);}while(@dromeda
 ry1){my$camel1hump=0      ;my$CAMEL=3;if(defined($_=shif
        t(@dromedary1    ))&&/\S/){$camel1hump+=1<<$CAMEL;}
       $CAMEL--;if(d   efined($_=shift(@dromedary1))&&/\S/){
      $camel1hump+=1  <<$CAMEL;}$CAMEL--;if(defined($_=shift(
     @camel1hump))&&/\S/){$camel1hump+=1<<$CAMEL;}$CAMEL--;if(
     defined($_=shift(@camel1hump))&&/\S/){$camel1hump+=1<<$CAME
     L;;}$camel.=(split(//,"\040..m`{/J\047\134}L^7FX"))[$camel1h
      ump];}$camel.="\n";}@camel1hump=split(/\n/,$camel);foreach(@
      camel1hump){chomp;$Camel=$_;tr/LJF7\173\175`\047/\061\062\063
      45678/;tr/12345678/JL7F\175\173\047`/;$_=reverse;print"$_\040
       $Camel\n";}foreach(@camel1hump){chomp;$Camel=$_;y/LJF7\173\17
        5`\047/12345678/;tr/12345678/JL7F\175\173\047`/;$_=reverse;p
         rint"\040$_$Camel\n";}#japh-Erudil';;s;\s*;;g;;eval;   eval
           ("seek\040DATA,0,0;");undef$/;$_=;s$\s*$$g;(   );;s
             ;^.*_;;;map{eval"print\"$_\"";}/.{4}/g; __DATA__   \124
               \1   50\145\040\165\163\145\040\157\1 46\040\1  41\0
                    40\143\141  \155\145\1 54\040\1   51\155\  141
                    \147\145\0  40\151\156 \040\141    \163\16 3\
                     157\143\   151\141\16  4\151\1     57\156
                     \040\167  \151\164\1   50\040\      120\1
                     45\162\   154\040\15    1\163\      040\14
                     1\040\1   64\162\1      41\144       \145\
                     155\14    1\162\       153\04        0\157
                      \146\     040\11     7\047\         122\1
                      45\15      1\154\1  54\171          \040
                      \046\         012\101\16            3\16
                      3\15           7\143\15             1\14
                      1\16            4\145\163           \054
                     \040            \111\156\14         3\056
                    \040\         125\163\145\14         4\040\
                    167\1        51\164\1  50\0         40\160\
                  145\162                              \155\151
                \163\163                                \151\1
              57\156\056
# camel code, copywrite 2000 by Stephen B. Jenkins
# The use of a camel image with the topic of Perl 
# is a trademark of O'Reilly & Associates, Inc.

Hier komen dan drie kameeltjes te staan :P.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl -s
                                                    @x=qw/e n d/;if(
                             $kg){$e=13;$_="setrand(@{[int((rand)*90)]})
                         ;K=vector(2,g,nextprime(random(10^$s)));e=$e;n=K[1]*
                             K[2];d=e^-1%((K[1]-1)*(K[2]-1));";s/\s//sg;for(
                              `echo "$_ e\nn\nd\n"|gp -q`){print$x[$j++]
                            ,"=",`echo "10i16o$_ p"|dc`}exit}$t=
                           unpack'H*',join'',<>;$l=length$n;$y
                        =$e?$l-2:$l;$i="16dio";while  (){$M=
                    ($e&&1+int(rand 8)).(substr     $t,$p
                 ,$y or last);$i.="\U$M $k        $n\E|
              pc";$p+=$y}for(reverse
         `echo "$i"|dc`){chop
 ;$d&&s/^(.)//||($_=
   sprintf"%0${l}s"
    ,$_); $f
    .=$_}#
    print
    pack
   'H*'
 ,$f
#  RSA Encryption, Decryption and Key Generation with Perl/dc/gp.
#  Copyright (c) 1998-2000, Vipul Ved Prakash.

Het RSA algoritme is in deze dolfijn gepropt :D.

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

  • himlims_
  • Registratie: Juni 2000
  • Niet online

himlims_

🐧 Linux HOoligan

ZeRoXcOoL: ik vind 't maar verrektes onoverzichtelijk, maar wel 'mooi' gedaan :+)

⭐Game Profiles: 🕹️Steam - 🎮PSN - 🇪🇦 GoT_Hollandhards


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
whoami: * whoami wacht nog altijd op code van mbravenboer..... :+
Het probleem is met name dat ik tegenwoordig vooral in talen programmeer die niemand kent :o . M'n oude Java zooi zie ik niet meer als fraai, dus die post ik in ieder geval niet ;) . Ik kan wel Stratego code gaan posten, maar als dat toch niet echt overkomt heeft het niet zoveel nut ...

Ik heb echter nog wel een aardige. Het is eigenlijk een voorbeeld van een concept. De uitwerking die ik hier geef is erg verbose, maar ik ben met een nieuwe uitwerking bezig die dit probleem oplost. Wie kan uitleggen wat er hier gebeurt, waarom ik dit zo doe, en waarom ik dit fraai vind, krijgt een Afbeeldingslocatie: http://www.mbravenboer.org/images/valid-xml.gif onderscheiding.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
<?xml version="1.0" encoding="UTF-8"?>
 
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <xsl:output method="xml" indent="yes"/>
 
  <!-- root -->
  <xsl:template match="/">
    <java version="1.4.0" class="java.beans.XMLDecoder">
      <xsl:apply-templates/>
    </java>
  </xsl:template>
 
<!--  <xsl:template name="get-by-id">
      <xsl:param name="item"/>
      <xsl:param name="id"/>  -->
 
  <xsl:template match="participations">
    <object class="java.util.ArrayList">
      <xsl:for-each select="participation|unknown-participation">
        <void method="add">
          <xsl:apply-templates select="current()"/>
        </void>
      </xsl:for-each>
    </object>
  </xsl:template>
 
  <xsl:template name="series">
    <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getSeries">
      <int>
          <xsl:value-of select="/participations/@series-ref"/>
      </int>
    </object> 
  </xsl:template>
 
  <!-- participation -->
  <xsl:template match="unknown-participation">
    <object class="org.mbravenboer.neko.domain.mem.MemSeriesParticipation">
      <!-- rank & points -->
      <int>
        <xsl:value-of select="rank/text()"/>
      </int>
      <int>
        <xsl:value-of select="points/text()"/>
      </int>
 
      <!-- series -->
      <xsl:call-template name="series"/>
 
      <!-- sailor & sail -->
      <xsl:apply-templates select="sailor|unknown-sailor"/>
      <xsl:apply-templates select="sail|unknown-sail"/>
  
      <!-- race results -->
      <xsl:for-each select="race-results/race-result">
        <void method="addRaceResult">
          <xsl:apply-templates select="current()"/>
        </void>
      </xsl:for-each>
    </object>
  </xsl:template>
 
  <xsl:template match="participation">
    <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getSeriesParticipation">
      <int>
        <xsl:value-of select="@ref"/>
      </int>
    </object> 
  </xsl:template>
 
  <!-- sailor -->
  <xsl:template match="unknown-sailor">
    <object class="org.mbravenboer.neko.domain.mem.MemSailor">
      <string>
        <xsl:value-of select="name/text()"/>
      </string>
      <xsl:apply-templates select="gender|unknown-gender"/>
      <xsl:apply-templates select="country|unknown-country"/>
    </object>
  </xsl:template>
 
  <xsl:template match="sailor">
    <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getSailor">
      <int>
        <xsl:value-of select="@ref"/>
      </int>
    </object> 
  </xsl:template>
  
  <!-- gender -->
  <xsl:template match="unknown-gender">
    <null/>
  </xsl:template>
 
  <xsl:template match="female">
    <object class="org.mbravenboer.neko.domain.Gender" field="FEMALE"/> 
  </xsl:template>
 
  <xsl:template match="male">
    <object class="org.mbravenboer.neko.domain.Gender" field="MALE"/> 
  </xsl:template>
 
  <!-- sail -->
  <xsl:template match="unknown-sail">
    <object class="org.mbravenboer.neko.domain.mem.MemSail">
      <int>
        <xsl:value-of select="number/text()"/>
      </int>
 
      <xsl:apply-templates select="country|unknown-country"/>
      <xsl:apply-templates select="sailor|unknown-sailor"/>
    </object>
  </xsl:template>
 
  <xsl:template match="sail">
    <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getSail">
      <int>
        <xsl:value-of select="@ref"/>
      </int>
    </object> 
  </xsl:template>
 
  <!-- country -->
  <xsl:template match="unknown-country">
    <object class="org.mbravenboer.neko.domain.mem.MemCountry">
      <null/>
      <string>
        <xsl:value-of select="abbr/text()"/>
      </string>
    </object>
  </xsl:template>
 
  <xsl:template match="country">
    <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getCountry">
      <int>
        <xsl:value-of select="@ref"/>
      </int>
    </object> 
  </xsl:template>
 
  <!-- race-result -->
  <xsl:template match="race-result">
    <object class="org.mbravenboer.neko.domain.mem.MemRaceResult">
      <!-- points -->
      <int>
        <xsl:value-of select="points/text()"/>
      </int>
 
      <!-- race & status -->
      <xsl:apply-templates select="race"/>
      <xsl:apply-templates select="status"/>
 
      <!-- series participation -->
      <null/>
 
    </object>
  </xsl:template>
 
  <!-- race -->
  <xsl:template match="race">
    <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getRace">
      <int>
        <xsl:value-of select="@ref"/>
      </int>
    </object> 
  </xsl:template>
 
  <!-- status -->
  <xsl:template match="status">
    <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getRaceResultStatus">
      <int>
        <xsl:value-of select="@ref"/>
      </int>
    </object>
  </xsl:template>
 
</xsl:transform>


De input voldoet aan dit schema in RELAX NG compacte syntax:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
start =
  element participations {
    attribute series-ref { xsd:integer },
    participation.class+
  }

ref.class = attribute ref { xsd:integer }

# participation
participation.class =
  element unknown-participation {
    sailor.class,
    sail.class,
    element points { xsd:integer },
    element rank { xsd:integer },
    element race-results { race-result.class* }
  }
  | element participation { ref.class }

# sailor
sailor.class =
  element unknown-sailor {
    country.class,
    element name { text },
    gender.class
  }
  | element sailor { ref.class }

# sail
sail.class =
  element unknown-sail {
    sailor.class,
    country.class,
    element number { xsd:integer }
  }
  | element sail { ref.class }

# country
country.class =
  element unknown-country {
    element abbr { text }
  }
  | element country { ref.class }

# gender
gender.class =
  element unknown-gender { empty }
  | element male { empty }
  | element female { empty }

# race-result
race-result.class =
  element race-result {
    element race { ref.class },
    element status { ref.class },
    element points { xsd:integer }
  }

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

Verwijderd

Rataplan schreef op 08 April 2003 @ 13:44:
Blijft briljant:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define _ F-->00 || F-OO--;
long F=00,OO=00;
main(){F_OO();printf("%1.3f\n", 4.*-F/OO/OO);}F_OO()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
       _-_-_-_-_-_-_-_-_
            _-_-_-_
}
...berekent Pi.
[...]
Ben benieuwd ;)
huh leg eens uit :? |:(

Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
mbravenboer schreef op 11 April 2003 @ 10:01:
Ik heb echter nog wel een aardige. Het is eigenlijk een voorbeeld van een concept. De uitwerking die ik hier geef is erg verbose, maar ik ben met een nieuwe uitwerking bezig die dit probleem oplost. Wie kan uitleggen wat er hier gebeurt, waarom ik dit zo doe, en waarom ik dit fraai vind, krijgt een [afbeelding] onderscheiding.
(code)
je transformeert een xml document met uitslagen van een zeilwedstrijd in een xml document met een java programma.
je doet dit om willekeurige in java geschreven functies te kunnen gebruiken bij het transformeren van de gegevens in een uitvoerformaat.
waarom je dit fraai vindt is mij onduidelijk >:) (sorry, ben een beetje melig :p).
de transformatielogica wordt verspreid over twee (of meer) bestanden.
als je weet wat de aan te roepen java code doet, is deze transformatie waarschijnlijk goed te begrijpen, maar overigens is het nogal lastig om niet direct te kunnen zien wat de transformatie doet (alhoewel een 'pure' xslt die hetzelfde doet vermoedelijk ook niet in één keer te overzien zou zijn :+).
als je in je xslt bij elk geproduceerd stukje code zou vermelden wat de betreffende code doet, zou het denk ik wel een mooi abstractiemechanisme zijn :9.

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Apollo_Futurae: je transformeert een xml document met uitslagen van een zeilwedstrijd in een xml document met een java programma. Je doet dit om willekeurige in java geschreven functies te kunnen gebruiken bij het transformeren van de gegevens in een uitvoerformaat.
Aardige poging ;) . Ik zal het maar uitleggen, want ik vermoed dat er niet veel strijd zal ontstaan over de juiste werking ;) .

De XSL Transformatie transformeert een XML document met de uitslagen van wedstrijden van het Java Beans XML formaat. Het Java Beans XML formaat wordt gebruikt voor de long-persistance van Java Beans, maar het is in feite gewoon een representatie van Java objecten in XML. Ik transformeer dus een XML document naar een XML representatie van Java objecten. Deze objecten kunnen ingelezen worden door de Java Beans XML decoder.
waarom je dit fraai vindt is mij onduidelijk >:)
De transformatie is een suggestie voor de aanpak van het inlezen van XML. Inlezen van XML is op dit moment nog een groot probleem. Er zijn verschillende oplossingen: interfaces naar een XML parser (SAX, DOM, Pull) gebruiken om zo in de programmeertaal de data te verwerken, of data binding oplossingen zoals JAXB toepassen om een klassen en de mapping naar die klassen te genereren vanuit een schema.

De aanpak hierboven heeft als idee dat het inlezen van XML gezien kan worden als een transformatie van de in te lezen XML gebaseerde taal naar een Object taal, gebaseerd op XML. Door de mapping op deze manier te implementeren krijg je een compacte specificatie van de transformatie: als je dit met SAX/DOM zou gaan inlezen zou je veel meer code kwijt zijn en is de kans op bugs veel groter.

Het doel van de transformatie is dus niet de transformatie op zich (en daarin het gebruik van Java functies), maar het inlezen van XML.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
In feite kun je dit dus in .NET doen door de xml te transformeren naar de format voor een SOAP geserialiseerde groep objects die je dan in 1 keer deserialized en zodoende meteen de data in handen hebt, ipv dat je de xml file zelf moet gaan parsen.

Erg slim, bravenboer :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
EfBe: In feite kun je dit dus in .NET doen door de xml te transformeren naar de format voor een SOAP geserialiseerde groep objects die je dan in 1 keer deserialized en zodoende meteen de data in handen hebt, ipv dat je de xml file zelf moet gaan parsen.
Exact!
Erg slim, bravenboer :)
Ik hoop dat m'n afstudeerbegeleider en de programma commissie van het paper wat er aan komt dit ook vinden ;) . Het is een klein, maar grappig, onderdeel van m'n afstudeerwerk.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
mbravenboer schreef op 11 April 2003 @ 16:53:
De transformatie is een suggestie voor de aanpak van het inlezen van XML. Inlezen van XML is op dit moment nog een groot probleem. Er zijn verschillende oplossingen: interfaces naar een XML parser (SAX, DOM, Pull) gebruiken om zo in de programmeertaal de data te verwerken, of data binding oplossingen zoals JAXB toepassen om een klassen en de mapping naar die klassen te genereren vanuit een schema.

De aanpak hierboven heeft als idee dat het inlezen van XML gezien kan worden als een transformatie van de in te lezen XML gebaseerde taal naar een Object taal, gebaseerd op XML. Door de mapping op deze manier te implementeren krijg je een compacte specificatie van de transformatie: als je dit met SAX/DOM zou gaan inlezen zou je veel meer code kwijt zijn en is de kans op bugs veel groter.

Het doel van de transformatie is dus niet de transformatie op zich (en daarin het gebruik van Java functies), maar het inlezen van XML.
het is bijzonder creatief bedacht, dat ten eerste _/-\o_ !
maar ik begrijp niet dat deze extra tussenstap nodig is.
de enige taal die ik goed genoeg ken om hem in dit opzicht te kunnen beoordelen (haskell, je kent het denk ik wel ;)) is prima in staat om XML te parsen, in aanzienlijk minder regels dan een xslt met dezelfde werking.
is dit in java zo slecht geregeld, dat deze omweg (een mooie omweg, dat wel) nodig is?

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

Verwijderd

mbravenboer, is dat idee van jou niet al ontzettend oud? Ik kan me herinneren dat je weleens eerder zoiets gepost had hier of anders op Javahova, of een discussie erover had gehad in de tijd dat Arien en Tomato hier nog regelmatig posten?
/me wil daarme overigens niets afdoen aan het goede idee

Een voetnoot: de gegevens in de te verwerken XML file moet dan wel te mappen zijn op een object binnen je software. Vaak zul je zien dat een XML file een verzameling van gelijksoortige gegevens bevat, dus bijv niet 1 zeiluitslag maar een heel weekend van zeilwedstrijden. Je zult dan dus inderdaad ook een implementatie moeten maken voor een collectie van zinvolle dataobjecten die vanuit een XML formaat de de-serializen is.

Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
doet me een beetje denken aan OJB waar ik nu mee bezig ben - gek genoeg vind het ik inlezen naar class objecten veel te oriented naar de taal toe - vandaar dat ik mijn huidige app een heel losse approach heb van 'objecten' (kun je voorstellen als XML-elements, maar ook als een Field in een table , of zelfs een tabel). Maakt niet uit ... persoonlijk vind ik xsl nog altijd een verschrikking voor performance (we gebruiken Cocoon voor de webpages - en dat is enorm traag vind ik) Wel mooi , misschien te mooi voor praktisch te zijn... JXPath vind ik dan wel mooi als losse omgeving voor data-managment.

Hier is is het dus XML+XSL -> Java Classes -> XML

Bij Ons is het ?Persitant DataSource? -> 'Data-Objects' (een methode) -> Persistant.

die data-objects kunnen dan heel eenvoudig in elke taal worden gebruikt .... Ik geef er grif aan toe dat op het moment die Data-Objects dan nog eens gemapped worden naar een Java Class maar alle extra info (wat voor type, validation rule, ...) word afzonderlijk bijgehouden... (die mapping is alleen omdat OJB het gemakkelijk maakt voor te save :) )

Wel wist ik niet dat JavaBeans zo lekker naar XML konden weggeschreven... :)

edit:
neko? wat heeft en kat met dit alles te maken? :)

[ Voor 5% gewijzigd door hobbit_be op 11-04-2003 20:23 ]


Acties:
  • 0 Henk 'm!

  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 20-07-2024

PommeFritz

...geen friet

Ik mis nog DUFF'S DEVICE:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   register n = (count + 7) / 8;      /* count > 0 assumed */

   switch (count % 8)
   {
   case 0:        do {  *to = *from++;
   case 7:              *to = *from++;
   case 6:              *to = *from++;
   case 5:              *to = *from++;
   case 4:              *to = *from++;
   case 3:              *to = *from++;
   case 2:              *to = *from++;
   case 1:              *to = *from++;
                      } while (--n > 0);
   }


Zie uitleg

[ Voor 7% gewijzigd door PommeFritz op 12-04-2003 17:10 ]

FireFox - neem het web in eigen hand


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
MrX: mbravenboer, is dat idee van jou niet al ontzettend oud?
Klopt, ik heb het weleens eerder aan mensen uitgelegd, maar helaas heb ik het nog steeds niet verwerkt in een publicatie.
de gegevens in de te verwerken XML file moet dan wel te mappen zijn op een object binnen je software.
Het mogen ook meedere objecten zijn, maar zelfs ook gewoon een verzameling (dat zie je hierboven gebeuren met java.util.ArrayList).

Overigens komt de transformatie uit een concreet produkt:
http://europe.knwv.nl/statistieken/index.html
Apollo_Futurae: maar ik begrijp niet dat deze extra tussenstap nodig is. de enige taal die ik goed genoeg ken om hem in dit opzicht te kunnen beoordelen (haskell, je kent het denk ik wel ) is prima in staat om XML te parsen, in aanzienlijk minder regels dan een xslt met dezelfde werking.
Het gaat met name om de verwerking van de XML in native data structuren. Parsen is op zich is niet zo'n punt: een DOM representatie krijgen van een XML bestand is natuurlijk een fluitje van een cent. Maar wat daarna? Verder werken met de DOM is een optie, maar geen aantrekkelijke. Zowel niet in Haskell als in Java/C#/Python.

Wat je op dit moment veel ziet is dat er een mapping geimplementeerd wordt naar native data typen. Deze mapping kan je genereren (JAXB, Castor, Dtd2Haskell), maar het probleem daarvan is dat de native data structuren dan nog steeds erg veel lijken op het XML formaat. Er kan bij zo'n gegenereerde mapping ook bijna geen data genegeerd worden, iets wat je wel vaak wilt.

Een handmatige implementatie kost veel werk in een verbose taal als Java/C#. Ik ben het volstrekt met je eens dat dit in Haskell als veel compacter en duidelijker kan. Je zou de transformatie daarom ook het beste kunnen vergelijken met een in Haskell/Stratego/XSLT/XDuce geimplementeerde mapping. Je moet altijd een mapping implementeren en dat wil je ze compact en duidelijk mogelijk doen. Java/C# zijn hiervoor geen geschikte oplossing, XML transformatie talen zijn daarvoor wel een goede oplossing.
hobbit_be: persoonlijk vind ik xsl nog altijd een verschrikking voor performance
Idd, dit is ook slechts 1 mogelijke uitwerking van het idee. Andere mogelijke uitwerkingen zijn andere transformatie talen (Stratego), directe compilatie naar Java code, compilatie van XSLT naar Java code, gebruik van concrete syntax enz enz.

Het belangrijkste aspect is de vrijheid: met systemen als JAXB zal het nooit echt lekker aan gaan voelen omdat je klasse structuren te dicht bij de XML liggen en vaak gegenereerd worden. Met het transformatie systeem wat ik voorstel heb je volledige vrijheid om de mapping zo gek te maken als je maar wilt, terwijl je toch nog een (relatief) compacte specificatie over houdt. De XSLT oplossing kan nog veel mooier: XSLT is van zichzelf al verbose en met het gebruik van concrete syntax kan je nog veel gaan oplossen wat betreft het XML formaat voor Java objecten ...
neko? wat heeft en kat met dit alles te maken?
"en kat" :?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Alarmnummer schreef op 08 April 2003 @ 18:48:
112 print "Alarmnummer is cool"
999 goto 112

:P
:*)

| Toen / Nu


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
mbravenboer schreef op 11 April 2003 @ 21:18:
Verder werken met de DOM is een optie, maar geen aantrekkelijke. Zowel niet in Haskell als in Java/C#/Python
hmm vind ik wel een interssant punt - verwijs je hier nu eigenlijk naar het gebruik van een 'functie' of method op die dom structuur? XPath is een toch al tamelijk mooie eenvoudig structuur. Een soort van functie taal die je kun toepassen op xml zou wel leuk zijn, maar dat is dan de toch iets te ingewikkelde xsl. Soms heb ik het gevoel dat XML teveel wordt toegepast terwijl het eigenlijk ook wel 'lekker' is. Helaas is XML nog steeds te hierarchisch en kan bepaalde dingen niet voorstellen (daar zal XLink wel mee helpen). Een holy grail bestaat vast niet - wie zei ook alweer dat je aan een programmeur een job geeft met een bepaald probleem hij na een paar weken terugkomt met een taal om het op te lossen zonder het eigenlijk te implementeren ;)

Oh die 'Neko' = Kat in Japans..

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:32
PommeFritz schreef op 11 April 2003 @ 20:32:
Ik mis nog DUFF'S DEVICE:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   register n = (count + 7) / 8;      /* count > 0 assumed */

   switch (count % 8)
   {
   case 0:        do {  *to = *from++;
   case 7:              *to = *from++;
   case 6:              *to = *from++;
   case 5:              *to = *from++;
   case 4:              *to = *from++;
   case 3:              *to = *from++;
   case 2:              *to = *from++;
   case 1:              *to = *from++;
                      } while (--n > 0);
   }


Zie uitleg
Dat noem ik nu eens geen voorbeeld van fraaie code.
Dit zou imo eerder thuishoren in dat ander topic, over slechte code. :)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
hobbit_be: verwijs je hier nu eigenlijk naar het gebruik van een 'functie' of method op die dom structuur? XPath is een toch al tamelijk mooie eenvoudig structuur.
XPath is aardig om knopen te vinden en is ook zeker een goede tool om data uit een DOM te halen, maar het is geen volledige oplossing. Je moet de conversie nog steeds zelfs implementeren in een imperatieve tool. XPath helpt alleen met het zoeken naar de juiste data.
Een soort van functie taal die je kun toepassen op xml zou wel leuk zijn, maar dat is dan de toch iets te ingewikkelde xsl.
XSLT is een transformatie taal voor XML. Ik begrijp niet waarom mensen zo snel beginnen te klagen als je een keer een lastige transformatie wilt schrijven in XSLT. Je moet niet buiten het terrein van XML transformaties gaan, dat is de enige beperking. In de aanpak hierboven staat het idee centraal dat je het inlezen van XML als een XML transformatie kan zien. Daar pak je dan toch een taal voor waarin je XML fraai kan transformeren? XSLT ligt dan voor de hand net zoals een oplossing met XDuce, Haskell of Stratego mogelijk is.
Soms heb ik het gevoel dat XML teveel wordt toegepast terwijl het eigenlijk ook wel 'lekker' is.
XML kan niet genoeg toegepast worden, althans: de uitwisseling van gestructureerde data tussen software onderdelen kan niet genoeg toegepast worden. Het kan lekkerder dan XML, maar XML is al erg lekker. Overal waar data uitgewisseld moet worden, zou dit op een gestructureerde manier moeten gebeuren om zo samenwerking beter mogelijk te maken.
Helaas is XML nog steeds te hierarchisch en kan bepaalde dingen niet voorstellen
Te hierarchisch :? XML gaat over de uitwisseling van gestructureerde boom-achtige data. Ik zou niet weten hoe dat ooit te hierachisch kan zijn ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
effe snel tussendoor - looming deadline...
mbravenboer schreef op 12 April 2003 @ 14:55:
Te hierarchisch :? XML gaat over de uitwisseling van gestructureerde boom-achtige data. Ik zou niet weten hoe dat ooit te hierachisch kan zijn ;) .
idd :) het probleem zit het dat sommige data helemaal niet hierachish is. Ik heb het dan zoals een web - structuur of recursive gevallen. Zo'n 'stoten' zijn vooral goed voor hergebruik. Ook 'rechte' ie tabel data vind ik erg rot om door te sturen - wordt zo'n grote bloat (NS helpen wel, maar toch). Wel is het zo dat je het laatste
in ieder geval wel kan doorgeven wat dan wel mooi is. Ik haal hier een voorbeeld van webdesign aan. Die gast gaat en image doorgeven met xml - das allemaal wel mooi maar zijn file was 300KB groot waartegen het ook in 10KB kon.

Weet jij toevallig of er een binaire vorm van XML bestaat? ie niets anders dat pure parsed XML? Maar dan als standaard. Dat dit niet te lezen valt is natuurlijk zo maar 1 generieke notepad / parser en die problemen zijn weg. Kun je er ook ineens Security bijzetten en Meta Data... Iedereen kan dit maken maar ik vroeg me ad of er een standaard voor was... Heeft super veel voordelen: snel (parsing is 'dumb' -> geen nood aan echt gezoek), klein (zip kan er bijvoorbeeld standaard op, elements kunnen met ID's vervangen worden, data hoeft niet Encoded/Decoded te worden) en een API is al de DOM zelf... In den begin tijde van XML had ik er wel van gehoord maar nu kom ik het niet meer tegen...

Acties:
  • 0 Henk 'm!

  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 20-07-2024

PommeFritz

...geen friet

whoami schreef op 12 April 2003 @ 13:49:
Dat noem ik nu eens geen voorbeeld van fraaie code.
Dit zou imo eerder thuishoren in dat ander topic, over slechte code. :)
Hm misschien heb je wel gelijk. Maar ik vind het een geniaal gebruik van de ANSI-C definitie van een switch statement (dat het in feite gewoon labels zijn...)

FireFox - neem het web in eigen hand


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Die gast gaat en image doorgeven met xml - das allemaal wel mooi maar zijn file was 300KB groot waartegen het ook in 10KB kon.
Paul Graham in The Hundred-Year Language (je hebt vast geen tijd om het te lezen nu, dus stop hem in je bookmarks ;) ).
Weet jij toevallig of er een binaire vorm van XML bestaat? Maar dan als standaard. Dat dit niet te lezen valt is natuurlijk zo maar 1 generieke notepad / parser en die problemen zijn weg.
Idd. Er is geen standaard voor een binaire (compacte) uitwisselingsvorm van XML. Er zijn echter wel veel ideeen (en uitwerkingen) in die richting. Ik acht de kans echter niet erg groot dat er binnen afzienbare tijd een standaard voor XML zal komen.

Alternatieven voor XML laten de mogelijkheden al zien. Het ATerm formaat bevat een aantal zaken die je wilt hebben in een formaat zoals XML: meerdere external formaten (binary en tekst), meer structuur in de vorm van lijsten, tuples, onderscheid tussen integers en tekst, en last but not least, gestructureerde annotaties (attributen). Met name dit laatste is ook een populair punt van discussie op XML mailing lijsten.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1 2 Laatste