Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Ik ken mijn boolse algebra wel hoor en juist daar hebben de AND en de OR gelijkwaardige precedentie. Misschien dat het in de meeste talen dan wel zo is dat de AND voor gaat, toch vind ik het niet net.Een beetje vaardige coder met kennis van boolse algebra moet dit kunnen begrijpen en zo nee dan is haakjes toevoegen geen punt
whoami: Dat zeg ik toch?
[ Voor 5% gewijzigd door Ivo op 08-01-2006 01:52 ]
Tja, en toch is het gewoon duidelijker en leesbaarder met die haakjes. Het neemt gewoon alle twijfel weg.Ivo schreef op zaterdag 07 januari 2006 @ 18:03:
[...]
Ik ken mijn boolse algebra wel hoor en juist daar hebben de AND en de OR gelijkwaardige precedentie. Misschien dat het in de meeste talen dan wel zo is dat de AND voor gaat, toch vind ik het niet net.
[ Voor 5% gewijzigd door whoami op 07-01-2006 18:43 ]
https://fgheysels.github.io/
Needless to say, dit gedeelte van een bepaalde query HAD wat makkelijker gekund:
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
| round(getp(abs(round(ttest( compounds.geo_mean, vehicles.geo_mean, compounds.stddev_log, vehicles.stddev_log, compounds.sample_number, vehicles.sample_number ), 1)), floor(getdf( compounds.stddev_log, vehicles.stddev_log, compounds.sample_number, vehicles.sample_number)) + case round(mod(getdf( compounds.stddev_log, vehicles.stddev_log, compounds.sample_number, vehicles.sample_number), floor(getdf( compounds.stddev_log, vehicles.stddev_log, compounds.sample_number, vehicles.sample_number ))),1) when 0.0 then 0 when 0.1 then 0 when 0.2 then 0 when 0.3 then 0.5 when 0.4 then 0.5 when 0.5 then 0.5 when 0.6 then 0.5 when 0.7 then 0.5 when 0.8 then 1 when 0.9 then 1 when 1.0 then 1 end) * 2, 15) pval |
Ik hoorde de (Oracle) testserver drie verdiepingen lager vloeken...
(uiteraard is de rest van de query nog groter, en getp() en ttest() zijn stored procs die ook weer vanalles uitrekenen, en de tabel waarmee gerekend werd had ook nog enkele miljoenen records. Alle 16 processoren waren een nachtje ofzo zoet en de gealloceerde ruimte voor de nieuwe tabel was met 10GB toch te krap.
Gelukkig was het een query die maar eenmalig uitgevoerd hoefde te worden om een nieuwe tabel te creeeren, heh. De beheerder van die server kon z'n lachen haast niet inhouden en had nog nooit zo'n load op z'n server gezien. Hoe zou dat toch komen?
Saved by the buoyancy of citrus
1
2
| if not FEMailsArray[FEmailPointer].IsGelezen then FEMailsArray[FEmailPointer].SetGelezen(true); |
Tot op de dag van vandaag weet ik niet wat ik hiermee wilde bereiken
Lets remove all security labels and let the problem of stupidity solve itself
And is vergelijkbaar met *, or met +. Zo onlogisch is het niet IMO.Ivo schreef op zaterdag 07 januari 2006 @ 18:03:
Ik ken mijn boolse algebra wel hoor en juist daar hebben de AND en de OR gelijkwaardige precedentie. Misschien dat het in de meeste talen dan wel zo is dat de AND voor gaat, toch vind ik het niet net.
String a = "inhoud van regel 1";
String b = "inhoud van regel 2";
String c = "inhoud van regel 3";
Dat houdt natuurlijk op
|>
1
2
3
4
5
6
7
| Dim teller As String teller = 1 Do While teller < 6 ' .... teller = teller + 1 Loop |
Symbolisch voor de rest van de code

... die ik nu moet onderhouden
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Dat vind ik niet echt "slecht" (okee behalve die teller As String) of onleesbaar eerlijk gezegd.kenneth schreef op dinsdag 17 januari 2006 @ 16:09:
Visual Basic:
1 2 3 4 5 6 7 Dim teller As String teller = 1 Do While teller < 6 ' .... teller = teller + 1 Loop
Symbolisch voor de rest van de code
... die ik nu moet onderhouden
Het is ook niet optimaal natuurlijk, maar toch.
Of ging het je om die rare toewijzing van teller als String?
(ik ken VB niet, VBScript wel maar daar geef je helemaal geen datatype mee bij declaratie
Saved by the buoyancy of citrus
Ik denk dat het gaat om het gebruik van do ... while in plaats van for.Cyphax schreef op dinsdag 17 januari 2006 @ 16:26:
Dat vind ik niet echt "slecht" (okee behalve die teller As String) of onleesbaar eerlijk gezegd.
Het is ook niet optimaal natuurlijk, maar toch.
Of ging het je om die rare toewijzing van teller als String?
(ik ken VB niet, VBScript wel maar daar geef je helemaal geen datatype mee bij declaratie)
Ach, ik had ook de shitload aan globale variabelen kunnen c/p-en, of functies die meer doen dan hun signature doet vermoeden, enz, enz

Edit: ik vergeet de project_a, project_b, project_c etc. velden! Who needs 2NF anyways!
[ Voor 22% gewijzigd door kenneth op 17-01-2006 16:52 ]
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Ik wil naar huis
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
1
2
3
4
5
6
7
| } catch (Throwable e) { try { e.printStackTrace(); } catch (Throwable ex) { ex.printStackTrace(); } } |
nice eh
1
2
3
| if ( null == amount) { amount = null; } |
serieus...
If it still works, tweak it ! until it is broke.. then start over again..
Slordig inderdaad; wat als regel 5 throwt? Gelukkig is de fout makkelijk te herstellen:-FoX- schreef op woensdag 08 februari 2006 @ 15:47:
Deze kwam ik vandaag tegen:
Java:
1 2 3 4 5 6 7 } catch (Throwable e) { try { e.printStackTrace(); } catch (Throwable ex) { ex.printStackTrace(); } }
nice eh
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
| } catch (Throwable e) { try { e.printStackTrace(); } catch (Throwable ex) { try { ex.printStackTrace(); } catch (Throwable exc) { try { exc.printStackTrace(); } catch (Throwable exce) { try { exce.printStackTrace(); } catch (Throwable excep) { try { excep.printStackTrace(); } catch (Throwable except) { try { except.printStackTrace(); } catch (Throwable excepti) { try { excepti.printStackTrace(); } catch (Throwable exceptio) { try { exceptio.printStackTrace(); } catch (Throwable exception) { // If this fails, I give up! exception.printStackTrace(); } } } } } } } } } |
Of recursief:
1
2
3
4
5
6
7
8
| void printStackTrace(Throwable e) { try { e.printStackTrace(); } catch(Throwable ex) { printStackTrace(ex); } } |
[ Voor 3% gewijzigd door Soultaker op 08-02-2006 15:57 ]
If it still works, tweak it ! until it is broke.. then start over again..
Ohja, zo eentje ben ik overlaatst ook nog tegengekomen:Whizzy schreef op woensdag 08 februari 2006 @ 15:54:
Ik kwam laatst dit tegen...
code:
1 2 3 if ( null == amount) { amount = null; }
serieus...![]()
1
2
3
4
5
| if (object != null) { // do stuff } else { object.setStatus(false); } |
tjaa..
Dat MOET gewoon een keer mis gaan.-FoX- schreef op woensdag 08 februari 2006 @ 15:47:
Deze kwam ik vandaag tegen:
Iedereen weet toch dat je dat minstens 6 keer ofzo moet afvangen.
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
| catch (Throwable e) { try { e.printStackTrace(); } catch (Throwable ex) { try { ex.printStackTrace(); } catch (Throwable ex2) { try { ex2.printStackTrace(); } catch (Throwable ex3) { try { ex3.printStackTrace(); } catch (Throwable ex4) { try { ex4.printStackTrace(); } catch (Throwable ex5) { try { ex4.printStackTrace(); } catch (Throwable ex6) { // ignore ex6 System.meltdown(); } } } } } } } |
Verder vind ik het wel netjes, ik doe dat altijd zo. Met variabelen ook:
1
2
3
4
5
6
7
8
9
| string a; try { a = "hello world"; } catch (Throwable ex) { a = "hello world"; } |
Je wilt toch wel zeker weten dat het goed gaat uiteindelijk, toch?
Oh ja gewoon, Soultaker.
2 zielen 1 gedachte, maar die recursieve gaat me duidelijk te ver
[ Voor 7% gewijzigd door Cyphax op 08-02-2006 16:18 ]
Saved by the buoyancy of citrus
[rml]Soultaker in "[ alg] slechtste prog voorbeelden."[/rml]
[rml]Cyphax in "[ alg] slechtste prog voorbeelden."[/rml]
The Daily WTF: The perils of error-free code gelezen toevallig?
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Yep maar daar komt niet m'n inspiratie vandaan.Paul Nieuwkamp schreef op woensdag 08 februari 2006 @ 19:19:
[rml]-FoX- in "[ alg] slechtste prog voorbeelden."[/rml]
[rml]Soultaker in "[ alg] slechtste prog voorbeelden."[/rml]
[rml]Cyphax in "[ alg] slechtste prog voorbeelden."[/rml]
The Daily WTF: The perils of error-free code gelezen toevallig?
(thedailywtf is cool)
Saved by the buoyancy of citrus
Voorbeelden van slechte WTF's op alleen de voorpagina al: Drive-By Architecture waarin ze een slecht ingescand schema uit z'n context rukken om degene die het getekend heeft weg te zetten als een idioot. (Wie wel eens met een whiteboard erbij met een stel collega's overlegd heeft, weet dat er aan het bord op het einde absoluut niet af te leiden is waarover allemaal gesproken is - een voor een voorbijganger onbegrijpelijk schema betekent absoluut niet dat het overleg niet nuttig of van inhoudelijk laag nivo was.)
Of deze foutmeldingen, waarbij ze de foutmelding "Communication Error with Programmer" wegzetten alsof dat zou suggereren dat de software-ontwikkelaar bedoelt wordt, terwijl het programma in kwestie gewoon een stuk software is om een hardware programmer (want zo héét dat ding) aan te sturen.
Maar goed, ze zijn vaak wel leuk om ter afwisseling te lezen...
[ Voor 4% gewijzigd door Soultaker op 09-02-2006 03:19 ]
Los van het feit dat je dat hier ook ziet in dit draadje, af en toe: Ik zie je eerste voorbeeld niet als "afschilderen als idioot" (opzettelijk) omdat het veel leuker is om het veel milder op te vatten en mensen niet uit te lachen maar ermee te lachen.Soultaker schreef op donderdag 09 februari 2006 @ 03:19:
The Daily WTF is wel leuk, maar ze ondermijnen hun geloofwaardigheid enigzins door regelmatig met hele slechte voorbeelden te komen. Dan plaatsen ze dingen die twijfelachtig overkomen, maar als je er over nadenkt eigenlijk heel redelijk zijn en dan wordt het een potje met z'n allen lachen om die 'domme' ontwikkelaars. Ik denk dat iedereen bij gebrek aan tijd, kennis of motivatie regelmatig suboptimale oplossingen creëert; The Daily WTF zou zich moeten beperken tot de voorbeelden die zo absurd zijn dat je je afvraagt hoe de auteur in godsnaam software-ontwikkelaar is geworden.
Voorbeelden van slechte WTF's op alleen de voorpagina al: Drive-By Architecture waarin ze een slecht ingescand schema uit z'n context rukken om degene die het getekend heeft weg te zetten als een idioot. (Wie wel eens met een whiteboard erbij met een stel collega's overlegd heeft, weet dat er aan het bord op het einde absoluut niet af te leiden is waarover allemaal gesproken is - een voor een voorbijganger onbegrijpelijk schema betekent absoluut niet dat het overleg niet nuttig of van inhoudelijk laag nivo was.)
Of deze foutmeldingen, waarbij ze de foutmelding "Communication Error with Programmer" wegzetten alsof dat zou suggereren dat de software-ontwikkelaar bedoelt wordt, terwijl het programma in kwestie gewoon een stuk software is om een hardware programmer (want zo héét dat ding) aan te sturen.
Maar goed, ze zijn vaak wel leuk om ter afwisseling te lezen...
Inderdaad, er staan vaak WTF's op die het predikaat "WTF" niet waard zijn (in eerste, danwel tweede instantie) maar er staan een paar mooie tussen waar ik smakelijk om heb gelachen, al dan niet om sommige van de reacties...
function Batman()
function Batman()(again)
#include "pascal.h"
1, 1 or 1, or if you really want, 1
Do it! Do it! Do it! (voorbeeldje van wat Soultaker bedoelde maar toch grappig)
En natuurlijk de legendarische If i++ increments...
[ Voor 13% gewijzigd door Cyphax op 09-02-2006 08:46 ]
Saved by the buoyancy of citrus
Ik moet wel lachen om stukjes code in dit topic, maar deze is echt te coolXTerm schreef op zaterdag 29 maart 2003 @ 12:54:
Dit stond overlaast op /. en is me bijgebleven
code:
1 2 3 gets(userEntry); if (memcmp(userEntry, correctPassword, strlen(userEntry)) != 0) return (BAD_PASSWORD);
Waar ik altijd de grootste blunders tegenkom, is bij code die SQL aanroept.
Heel dom voorbeeld (verzonnen, het gaat om het idee):
cmd.CommandText = "SELECT customer.id FROM customer WHERE customer.[name] = @name";
// ..
int id = (int) cmd.ExecuteScalar();
cmd.CommandText = "SELECT * FROM order WHERE order.customer_id = @id"
// .. code die orders inleest
Oftewel: onnodige roundtrips
Ask yourself if you are happy and then you cease to be.
Verwijderd
Mijn absolute favoriet blijft toch de Brillant Paula bean [sic]:Cyphax schreef op donderdag 09 februari 2006 @ 08:32:
maar er staan een paar mooie tussen waar ik smakelijk om heb gelachen, al dan niet om sommige van de reacties...
http://thedailywtf.com/forums/40043/ShowPost.aspx
Nog nooit zo gelachen om iets wat eigenlijk zo flauw is.
Offtopic:Verwijderd schreef op donderdag 09 februari 2006 @ 12:07:
[...]
Mijn absolute favoriet blijft toch de Brillant Paula bean [sic]:
http://thedailywtf.com/forums/40043/ShowPost.aspx
Nog nooit zo gelachen om iets wat eigenlijk zo flauw is.
Mjah, feit is gewoon dat ik dit echt niet kan geloven. Ik bedoel, als je een paar maanden aan zo'n systeem zit, en de weekly reports alleen mondeling doorneemt zit er wat chronisch fout in je bedrijfsvoering.
Buiten dat is het wel een geestig stukkie code netulèk.
Heart..pumps blood.Has nothing to do with emotion! Bored
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
| void PerspectiveNPoint::getPolynomialDirect(int p1, int p2, int p3, std::vector<NumType>& result) const { result.push_back( Power(Power(distance(p1,p2),2) + Power(distance(p1,p3) - distance(p2,p3),2) - 2*distance(p1,p2)*((-1 + 2*Power(angle(p2,p3),2))*distance(p1,p3) + distance(p2,p3)),2) ); result.push_back( 8*((-1 + angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2) + Power(angle(p1,p3),2)*(1 - 2*Power(angle(p2,p3),2)))*Power(distance(p1,p2),3) - Power(distance(p1,p3) - distance(p2,p3),2)* ((1 - angle(p1,p2)*angle(p1,p3)*angle(p2,p3) - Power(angle(p2,p3),2) + Power(angle(p1,p2),2)*(-1 + 2*Power(angle(p2,p3),2)))*distance(p1,p3) + (-1 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2) - angle(p1,p2)*angle(p1,p3)*angle(p2,p3))* distance(p2,p3)) - Power(distance(p1,p2),2)* ((3 - 2*Power(angle(p1,p3),2) - 7*Power(angle(p2,p3),2) + 4*Power(angle(p2,p3),4) + angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(5 - 4*Power(angle(p2,p3),2)) + Power(angle(p1,p2),2)*(-1 + 2*Power(angle(p2,p3),2)))*distance(p1,p3) + (-3 + Power(angle(p1,p2),2) + angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + 2*Power(angle(p2,p3),2) + Power(angle(p1,p3),2)*(3 - 4*Power(angle(p2,p3),2)))*distance(p2,p3)) + distance(p1,p2)*((-3 + 2*Power(angle(p1,p2),2) + Power(angle(p1,p3),2) + Power(angle(p2,p3),2)*(7 - 2*Power(angle(p1,p3),2) - 4*Power(angle(p2,p3),2)) + angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(-5 + 4*Power(angle(p2,p3),2)))*Power(distance(p1,p3),2) + 2*(3 - 2*Power(angle(p1,p2),2) - 2*Power(angle(p1,p3),2) - 4*Power(angle(p2,p3),2) + angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(3 + 2*Power(angle(p2,p3),2)))*distance(p1,p3)*distance(p2,p3)\ + (-3 + 2*Power(angle(p1,p2),2) - angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2) + Power(angle(p1,p3),2)*(3 - 2*Power(angle(p2,p3),2)))*Power(distance(p2,p3),2))) ); result.push_back( 8*((3 + 2*Power(angle(p1,p3),4) - 5*Power(angle(p2,p3),2) + 2*Power(angle(p2,p3),4) + Power(angle(p1,p2),2)*(-1 + 2*Power(angle(p1,p3),2) + 2*Power(angle(p2,p3),2)) - 2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(-1 + 2*Power(angle(p1,p3),2) + 2*Power(angle(p2,p3),2)) + Power(angle(p1,p3),2)*(-5 + 6*Power(angle(p2,p3),2)))*Power(distance(p1,p2),2) + (3 + 2*Power(angle(p1,p2),4) - 4*Power(angle(p1,p2),3)*angle(p1,p3)*angle(p2,p3) - 5*Power(angle(p2,p3),2) + 2*Power(angle(p2,p3),4) + 2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(1 - 2*Power(angle(p2,p3),2)) + Power(angle(p1,p3),2)*(-1 + 2*Power(angle(p2,p3),2)) + Power(angle(p1,p2),2)*(-5 + 2*Power(angle(p1,p3),2) + 6*Power(angle(p2,p3),2)))* Power(distance(p1,p3),2) - 2*(2*Power(angle(p1,p2),4) - 4*Power(angle(p1,p2),3)*angle(p1,p3)*angle(p2,p3) - 3*(-1 + Power(angle(p1,p3),2) + Power(angle(p2,p3),2)) + 2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(1 + Power(angle(p1,p3),2) + Power(angle(p2,p3),2)) + Power(angle(p1,p2),2)*(-5 + 4*Power(angle(p2,p3),2) - 4*Power(angle(p1,p3),2)*(-1 + Power(angle(p2,p3),2))))*distance(p1,p3)*distance(p2,p3) + (3 - 5*Power(angle(p1,p2),2) + 2*Power(angle(p1,p2),4) - 5*Power(angle(p1,p3),2) + 6*Power(angle(p1,p2),2)*Power(angle(p1,p3),2) + 2*Power(angle(p1,p3),4) - 2*angle(p1,p2)*angle(p1,p3)*(-1 + 2*Power(angle(p1,p2),2) + 2*Power(angle(p1,p3),2))*angle(p2,p3) + (-1 + 2*Power(angle(p1,p2),2) + 2*Power(angle(p1,p3),2))*Power(angle(p2,p3),2))* Power(distance(p2,p3),2) - 2*distance(p1,p2)* ((3*(-1 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2)) + 2*angle(p1,p2)*angle(p1,p3)*(-5 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2))*angle(p2,p3) - (-7 + 2*Power(angle(p1,p3),2) + Power(angle(p1,p2),2)*(2 + 4*Power(angle(p1,p3),2)))* Power(angle(p2,p3),2) + 8*angle(p1,p2)*angle(p1,p3)*Power(angle(p2,p3),3) - 4*Power(angle(p2,p3),4) )*distance(p1,p3) + (3 - 5*Power(angle(p1,p3),2) + 2*Power(angle(p1,p3),4) + 2*Power(angle(p1,p2),3)*angle(p1,p3)*angle(p2,p3) + (-3 + 4*Power(angle(p1,p3),2))*Power(angle(p2,p3),2) + 2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3)*(1 - 2*Power(angle(p1,p3),2) + Power(angle(p2,p3),2)) + Power(angle(p1,p2),2)*(-3 - 4*Power(angle(p1,p3),2)*(-1 + Power(angle(p2,p3),2))))*distance(p2,p3) )) ); result.push_back( -32*(-1 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2) - 2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2))* ((-1 + Power(angle(p1,p3),2) - angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2))* distance(p1,p2) + (-1 + Power(angle(p1,p2),2) - angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2))*distance(p1,p3) + (1 - Power(angle(p1,p3),2) + angle(p1,p2)* (angle(p1,p2)*(-1 + 2*Power(angle(p1,p3),2)) - angle(p1,p3)*angle(p2,p3)))*distance(p2,p3)) ); result.push_back( 16*Power(-1 + Power(angle(p1,p2),2) + Power(angle(p1,p3),2) - 2*angle(p1,p2)*angle(p1,p3)*angle(p2,p3) + Power(angle(p2,p3),2),2) ); } |
Maar euhh, kon je geen gestructureerdere manier verzinnen?
Precies!-FoX- schreef op donderdag 09 februari 2006 @ 12:52:
Jep, een berekening om de directe polynomial terug te krijgen, toch?!
Maar euhh, kon je geen gestructureerdere manier verzinnen?
Voor dit soort dingen hebben ze commentaar uitgevondenZoijar schreef op donderdag 09 februari 2006 @ 12:35:
Neit echt slecht dit, maar toch wel een van de meest vreemde functies die ik heb geschreven... duidelijk wat er gebeurt toch?
C++:
1 heel veel code...
1) de gebruikte operatie is correct
2) de geschreven code is een implementatie van de genoemde operatie
- This line is intentionally left blank -
1
| // You were not meant to understand this |
curry684 schreef op donderdag 09 februari 2006 @ 13:06:
This calls for:
C++:
1// You were not meant to understand this
Ik had er waarschijnlijk bijgezet:
1
| // You're not supposed to understand this. I sure as hell don't understand it, so don't bother asking. |
Saved by the buoyancy of citrus
Ofcurry684 schreef op donderdag 09 februari 2006 @ 13:06:
This calls for:
C++:
1// You were not meant to understand this
1
| // It was hard to write so it should be hard to read |
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
1
2
3
4
| if (var = true) { //Code var = false } |
Wat ik ook tegenkom: btnLogin. Je hebt het over een loginbutton, maar het object heet btnLogin.

Dat is toch gewoon Hongaarse notatie... een keuze, geen "slecht voorbeeld" of begrijp ik je nu niet?ChaosDream schreef op donderdag 09 februari 2006 @ 13:16:
(Ik ben een VB-er)
code:
1 2 3 4 if (var = true) { //Code var = false }
Wat ik ook tegenkom: btnLogin. Je hebt het over een loginbutton, maar het object heet btnLogin.Naming conventies zijn leuk...
(geen porem, Hongaarse notatie, daar niet van
Saved by the buoyancy of citrus
Mijn punt is dat dit te kust en te keur wordt gebruikt. (ik zit nu op een VB6 project waar er namen van methoden zijn geschreven die 3 / 4 afkortingen gebruiken)Cyphax schreef op donderdag 09 februari 2006 @ 13:23:
[...]
Dat is toch gewoon Hongaarse notatie... een keuze, geen "slecht voorbeeld" of begrijp ik je nu niet?
(geen porem, Hongaarse notatie, daar niet van)
[ Voor 16% gewijzigd door BasSpruit op 09-02-2006 13:28 ]
En afgekorte namen ook.
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Okee, dat is vervelend idd maar dat kwam uit je voorbeeld niet zo goed naar voren.ChaosDream schreef op donderdag 09 februari 2006 @ 13:27:
[...]
Mijn punt is dat dit te kust en te keur wordt gebruikt. (ik zit nu op een VB6 project waar er namen van methoden zijn geschreven die 3 / 4 afkortingen gebruiken)
Naamgeving vind ik ook lastig. Alleen in Javascript niet, ik heb de neiging scriptjes zo compact mogelijk te houden en dan verzin ik gewoon een normale naam, en kort het dan af.
Zoiets dus:
1
2
3
4
5
6
7
8
9
| function fillInput(e){ var se=(!e?window.event.srcElement:e.target),ui=document.getElementById('userinput'),pi=document.getElementById('woonplaats'); if(se.tagName.toLowerCase()=="dd"){pi.value=se.firstChild.data; ui.value=se.previousSibling.firstChild.data;} else{pi.value=se.nextSibling.firstChild.data; ui.value=se.firstChild.data;} ui.focus(); emptyWordList(); } |
[ Voor 6% gewijzigd door Cyphax op 09-02-2006 13:30 ]
Saved by the buoyancy of citrus
Verwijderd
1
2
3
4
5
| public Vector fetchArticle(int articleid) { Vector article = new Vector(); // KNIPPERDEKNIP return article; } |

Ja, hoewel het een private member is. De class zelf is toch te ingewikkeld om te begrijpen zonder het paper erbij te lezen. Class documentatie staat wel dit bij:Knutselsmurf schreef op donderdag 09 februari 2006 @ 13:05:
Voor dit soort dingen hebben ze commentaar uitgevondenWat ik zo snel zie is dit de implementatie van een of andere vector-operatie. In zo'n geval zou ik toch echt deze operatie noemen in commentaar. Iemand die eventueel deze code moet debuggen, kan dan zien:
1) de gebruikte operatie is correct
2) de geschreven code is een implementatie van de genoemde operatie
// Solves the Perspective N-Point problem by SVD
// Given 'n' 2d points, 'n' corresponding 3d points, and a camera calibration matrix,
// this will solve for the z-depth coordinates of the 2d points. (Long Quan's linear-PnP)
// These calculated 3d points can then in turn be used to construct
// a transformation matrix from the image to the model using an absolute orientation
// method (Horn's closed-form quaternion method)
Vond ik genoeg
"This was hard enough to write, so it should damn well be hard to read"
past goed bij ander commentaar daar:
//Hmmm this is bad. And theoretically not allowed either.
of
// TODO: Warning: we ignore degree one points. it seems to work, but we dontknow what side effects
// this might cause... so far so good...
Haha, en ik maar denken dat het ging om een Vector als returntype, ipv een List......Verwijderd schreef op donderdag 09 februari 2006 @ 13:30:
Een Vector gebruiken om 1 object in op te slaan ipv gewoon het betreffende object terug te geven:
Java:
1 2 3 4 5 public Vector fetchArticle(int articleid) { Vector article = new Vector(); // KNIPPERDEKNIP return article; }
(of is dit pre 1.2?)
Verwijderd
Zoals je in de velen replies kan lezen -kan- het dus wel. En om eerlijk te zijn, bij ons zou dit ook zomaar kunnen gebeuren. Het gaat er te vaak aan toe van: hier is een TODO puntje, dat houdt in dat er ongeveer zus en zo moet worden gedaan, ga het maar programmeren! Dan 6 weken later voor de deadline dat de nieuwe versie live gaat (we maken een web-app) zou diegene nog kunnen zeggen dat het niet niet klaar is, en dan pas bij de volgende deadline zou die persoon door de mand vallen. In dit geval hebben we het ook over een 12 weken.TeeDee schreef op donderdag 09 februari 2006 @ 12:11:
[...]
Offtopic:
Mjah, feit is gewoon dat ik dit echt niet kan geloven. Ik bedoel, als je een paar maanden aan zo'n systeem zit, en de weekly reports alleen mondeling doorneemt zit er wat chronisch fout in je bedrijfsvoering.
In feite is dit een WTF! kwa (development) process en niet zozeer kwa coding.
Het is nog bekend geworden ook. "Paula is brillant" ben ik al meerdere keren als sig tegengekomen. Die maar eens een google search op "paula bean"Buiten dat is het wel een geestig stukkie code netulèk.
Verwijderd
Verbaasd u niet, verwonderd u slechtsHaha, en ik maar denken dat het ging om een Vector als returntype, ipv een List......
(of is dit pre 1.2?)
Komt tijd komt verstand zal ik maar zeggen, deze code heb ik 2 weken geleden getikt en toen was het echt al 1.5, scheelt wel dat ik in totaal nu 4 weken 'ervaring' heb en nog een hoop moet leren
[ Voor 26% gewijzigd door Verwijderd op 09-02-2006 16:14 ]
SorryVerwijderd schreef op donderdag 09 februari 2006 @ 16:12:
[...]
Verbaasd u niet, verwonderd u slechts

En volgens mij is het iets van: Erger u niet, verwonder u slechts.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Wat ik hier weleens bespeur (vnl. stagiares e.d.) is dat ze niet durven te zeggen dat ze de deadline niet gaan halen. Misschien is dat bij jullie ook wel eens?Verwijderd schreef op donderdag 09 februari 2006 @ 16:10:
[...]
In feite is dit een WTF! kwa (development) process en niet zozeer kwa coding.
[...]
Ik weet het, heb al geruime tijd thedailywtf in mijn dagelijkse lunchpauze bekijk dingenHet is nog bekend geworden ook. "Paula is brillant" ben ik al meerdere keren als sig tegengekomen. Die maar eens een google search op "paula bean"
Kwam laatst dit tegen:
1
2
3
4
5
6
7
8
9
10
11
| if(Request.QueryString["finish"]=="true") { Panel1.Visible=false; Panel2.Visible=false; Panel3.Visible=false; Panel4.Visible=false; Panel5.Visible=false; Panel6.Visible=false; Panel7.Visible=true;//in feite overbodig, omdat er geredirect wordt naar bedankt.html PlaceOrder(); } |
Goed, Panel7 bevat nog het e.e.a., blijkbaar niet interessant genoeg.
Het mooiste is natuurlijk Querystring["finish"] == "true".
In PlaceOrder() wordt nergens gechecked of een aantal zaken wel ingevuld zijn, maar wel overal default values. M.a.w.: iemand die de url weet, stuk of 100 keer op F5 rost zorgt ervoor dat er 100 nietszeggende Orders in het systeem staan.
And to top it all off: Dit staat in de Page_Load.
[ Voor 5% gewijzigd door TeeDee op 09-02-2006 16:25 ]
Heart..pumps blood.Has nothing to do with emotion! Bored
Verwijderd
Tsja, ons hele bedrijfje bouwt eigenlijk alleen maar op stagiares. Er zijn maar enkele vaste medewerkers, voor de rest is iedereen stagiare of afstudeerder. Durven te zeggen hebben we nog niet echt meegemaakt, maar wel dat stagiares bijvoorbeeld niet aan java files durven te komen en dus maar alles in de JSP files zetten. Dat komt dan ook pas veel later aan het licht.TeeDee schreef op donderdag 09 februari 2006 @ 16:24:
[...]
Wat ik hier weleens bespeur (vnl. stagiares e.d.) is dat ze niet durven te zeggen dat ze de deadline niet gaan halen. Misschien is dat bij jullie ook wel eens?
Ook andersom hebben we wel gehad, een economie student die wat aan de interface moest veranderen en toen maar van alles ging 'coden' terwijl ie 0.0% verstand had van abstractie of modularisatie en eigenlijk ook niet van programmeren zelf.
Dat was kwa coding ook een echte WTF!
Stond gewoon boven elke pagina iets van:
1
2
3
| if ( situatie == x ) laat specificieke dingen zien als pagina in traject X wordt gebruikt if ( situatie == y ) laat specificieke dingen zien voor traject Y etc |
In plaats van dat je pageflows defineert en binnen die flows eventueel componenten hergebruikt, zag hij dus een pagina als vast component en liet die pagina afhankelijk van tig globale (session) variabelen een dozijn verschillende rollen spelen. Helemaal op het laatst kwam ie nog een keertje vragen wat een class nou precies was in 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
| int partijNr = -1; try { if (txtPartijnr.Text != "") partijNr = Convert.ToInt32(txtPartijnr.Text); if (partijNr < 0) throw (new Exception()); } catch { MessageBox.Show("Het partijnummer dient een geheel getal te zijn", "Foutmelding"); ClearKopgegevensInvoervelden(true); txtPartijnr.Focus(); return; } if (txtPartijnr.Text != "") { DateTime analysedatum = dtpAnalysedatumInvoer.Value; //_monstersCol = new MonstersCollection(); PredicateExpression select = new PredicateExpression(); select.Add(PredicateFactory.CompareValue(PartijFieldIndex.PartijNr, ComparisonOperator.Equal, partijNr)); PartijCollection tmpCol = new PartijCollection(); tmpCol.GetMulti(select); if (tmpCol.Count == 0) { // partij bestaat niet MessageBox.Show("De partij bestaat niet. Voer een ander partijnummer in.", "Foutmelding"); ClearKopgegevensInvoervelden(); return; } else { // partij bestaat wel _currentPartijEnt = tmpCol[0]; } |
Verwijderd
PartijCollection??? ClearKopgegevensInvoervelden??? _currentPartijEnt???Mastermind schreef op donderdag 09 februari 2006 @ 16:53:
Ik was gister niet helemaal wakker, waardoor hij altijd een foutmelding bij een leeg invoerveld gaf![]()
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 int partijNr = -1; try { if (txtPartijnr.Text != "") partijNr = Convert.ToInt32(txtPartijnr.Text); if (partijNr < 0) throw (new Exception()); } catch { MessageBox.Show("Het partijnummer dient een geheel getal te zijn", "Foutmelding"); ClearKopgegevensInvoervelden(true); txtPartijnr.Focus(); return; } if (txtPartijnr.Text != "") { DateTime analysedatum = dtpAnalysedatumInvoer.Value; //_monstersCol = new MonstersCollection(); PredicateExpression select = new PredicateExpression(); select.Add(PredicateFactory.CompareValue(PartijFieldIndex.PartijNr, ComparisonOperator.Equal, partijNr)); PartijCollection tmpCol = new PartijCollection(); tmpCol.GetMulti(select); if (tmpCol.Count == 0) { // partij bestaat niet MessageBox.Show("De partij bestaat niet. Voer een ander partijnummer in.", "Foutmelding"); ClearKopgegevensInvoervelden(); return; } else { // partij bestaat wel _currentPartijEnt = tmpCol[0]; }
WTF!?
1
2
3
4
5
6
7
8
9
10
11
| function splitstring(string,divider) For counter1 = 1 To len(string) if Mid(string,counter1,1) <> divider Then counter2 = counter2 + 1 Else tempstring = cint(Mid(string,counter1-counter2,counter2)) response.write(tempstring & "<BR>") counter2 = 0 End if Next End function |
Gebruik dan op zijn minst InStr om direct te zoeken naar je dividerraptorix schreef op donderdag 09 februari 2006 @ 17:14:
Ik heb keer een functie gemaakt in asp om waardes op te splisen, wist ik veel dat er zoiets als split bestond
code:
1 2 3 4 5 6 7 8 9 10 11 function splitstring(string,divider) For counter1 = 1 To len(string) if Mid(string,counter1,1) <> divider Then counter2 = counter2 + 1 Else tempstring = cint(Mid(string,counter1-counter2,counter2)) response.write(tempstring & "<BR>") counter2 = 0 End if Next End function
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Dat doe ik ook altijd hoor..ChaosDream schreef op donderdag 09 februari 2006 @ 13:16:
Wat ik ook tegenkom: btnLogin. Je hebt het over een loginbutton, maar het object heet btnLogin.Naming conventies zijn leuk...
btnLogin
txtUser
lblTitle
cboType
Etc
Ask yourself if you are happy and then you cease to be.
Yup, hier ook. UI-elementen is zo'n beetje de enige plaats waar ik Hongaarse notatie gebruikLethalis schreef op vrijdag 10 februari 2006 @ 08:57:
[...]
Dat doe ik ook altijd hoor..
btnLogin
txtUser
lblTitle
cboType
Etc
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Verwijderd
Sorrymaar deze is wel heel erg ... twee keer stam + t, maar correcter is zonder t, want gebiedende wijs.
En volgens mij is het iets van: Erger u niet, verwonder u slechts.

Dat betekent dat ik dus én niet kan programmeren én slecht ben in Nederlands. Damn, I fail in life
[ Voor 22% gewijzigd door Verwijderd op 10-02-2006 14:43 ]
Een tip: regular expressions ipv try/catch.Mastermind schreef op donderdag 09 februari 2006 @ 16:53:
Ik was gister niet helemaal wakker, waardoor hij altijd een foutmelding bij een leeg invoerveld gaf![]()
C#:
1 2 3 4 5 6 7 8 9 int partijNr = -1; try { if (txtPartijnr.Text != "") partijNr = Convert.ToInt32(txtPartijnr.Text); } catch { .. }
Ask yourself if you are happy and then you cease to be.
Do explain. Ik zou dit namelijk op een soortgelijke manier doen.Lethalis schreef op vrijdag 10 februari 2006 @ 14:50:
[...]
Een tip: regular expressions ipv try/catch.
Op die manier. Duidelijk, vond het alleen een beetje raar om hier een regexp voor te gebruiken.whoami schreef op vrijdag 10 februari 2006 @ 15:20:
[...]
Ipv te Converten en een exceptie opvangen, is het zowiezo beter om eerst te checken of hetgeen je wilt converten wel converteerbaar is naar integer.
[ Voor 45% gewijzigd door TeeDee op 10-02-2006 15:24 ]
Heart..pumps blood.Has nothing to do with emotion! Bored
Ipv te Converten en een exceptie opvangen, is het zowiezo beter om eerst te checken of hetgeen je wilt converten wel converteerbaar is naar integer.TeeDee schreef op vrijdag 10 februari 2006 @ 14:54:
[...]
Do explain. Ik zou dit namelijk op een soortgelijke manier doen.
Exceptions gooien is nl. duur, en een try met een lege catch is zowiezo niet netjes.
Echter, regexen gebruiken is in dit geval nu ook niet direct nodig. Double.TryParse zou ook al een uitkomst kunnen bieden.
Zo bv:
1
2
3
4
5
6
7
8
9
10
11
12
13
| double result; if( Double.TryParse (textBox1.Text, System.Globalization.NumberStyles.Integer, System.Threading.Thread.CurrentThread.CurrentCulture, out result) ) { int i = Convert.ToInt32 (result); MessageBox.Show (i.ToString()); } else { MessageBox.Show ("invalid."); } |
[ Voor 26% gewijzigd door whoami op 10-02-2006 15:26 ]
https://fgheysels.github.io/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| private string PrepareDate() { string fDate = ""; string year, month, day; DateTime currTime = DateTime.Now; year = currTime.Year + ""; month = currTime.Month + ""; day = currTime.Day + ""; if(month.Length == 1) month = "0" + month; if(day.Length == 1) day = "0" + day; fDate = year + month + day; return fDate; } |
f*ckedupDateMichali schreef op vrijdag 17 februari 2006 @ 09:10:
In een Date class zeker? Wat vreemd ik vreemd vind is de variable fDate. Die zou naar mijn gevoel van het datatype boolean zijn (f voor flag volgens de hungarian notation) of eventueel een float. String is dan niet echt iets wat ik zou verwachten.
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
1
| string formattedDate = DateTime.Now.ToString( "YYMMdd" ); |
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Is er geen parse functie die gewoon een error returned?whoami schreef op vrijdag 10 februari 2006 @ 15:20:
Ipv te Converten en een exceptie opvangen, is het zowiezo beter om eerst te checken of hetgeen je wilt converten wel converteerbaar is naar integer.
Exceptions gooien is nl. duur, en een try met een lege catch is zowiezo niet netjes.
Echter, regexen gebruiken is in dit geval nu ook niet direct nodig. Double.TryParse zou ook al een uitkomst kunnen bieden.
Want TryParse en dan Parse is ook een beetje dubbelop.
Als het te verwachten is dat er ooit een foute waarde voor zou kunnen komen, en je kunt er op controleren, dan zou ik dan zeker doen. Puur de exception opvangen zonder controle is dan een stuk minder netjes imo.OlafvdSpek schreef op vrijdag 17 februari 2006 @ 15:54:
[...]
Is er geen parse functie die gewoon een error returned?
Want TryParse en dan Parse is ook een beetje dubbelop.
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
| void current_time_details(int& sec, int& minute, int& hour, char dow[], int& day, char cmon[], int& month, int& year) { time_t p; time(&p); char tem[64]; strcpy(tem,ctime(&p)); // extract details from, e.g.: Fri Nov 11 13:49:53 2005 // get the day of the week, i.e. Mon, Tue etc strncpy(dow,tem,3); dow[3]=0; int l=strlen(tem); // get the hour, minute and sec int i, j=0; for(i=0; i<l; i++) if(tem[i]==':'){j=i; break;} tem[j]=tem[j+3]=tem[j+6]=0; sscanf(&tem[j-2],"%d",&hour); sscanf(&tem[j+1],"%d",&minute); sscanf(&tem[j+4],"%d",&sec); sscanf(&tem[j+7],"%d",&year); // get the month of the year as a number char mons[12][4]={"Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"}; tem[7]=0; for(i=0; i<12; i++) { if(strcmp(&tem[4],mons[i])==0){strcpy(cmon,mons[i]); month=i+1; break;} } // get the day sscanf(&tem[8],"%d",&day); } |
Fat Pizza's pizza, they are big and they are cheezy
Deze heeft me vandaag wat hoofdbrekens gekost
(eigen code btw)
uitleg: deze methode is de hoofd methode van een service die mail uitleest en verwerkt Deze service runt iedere seconde. . Per run leest de service heel de mail box uit en verwerkt ieder mailtje. Om te voorkomen dat de code runt op het moment dat deze bezig is, heb ik de busy geintroduceerd.
Ik snapte maar niet waarom ieder mailtje zo'n x maal achter elkaar verwerkt werd

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
| public void RunOnce() { MailHandler mailHandler = new MailHandler(); bool conn_open = false; bool busy = false; try { if (!busy) { busy = true; //hier ging ik mail ophalen en verwerken } } catch (Exception ex) { //hier stond wat exeption handling zooi } finally { busy = false; //hier stond nog wat code } } } |
[ Voor 5% gewijzigd door 4of9 op 30-03-2006 15:52 ]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Exception handling op zich is al slecht.Erkens schreef op zaterdag 29 maart 2003 @ 11:51:
Zelf vergeet ik altijd exeption handling, behalve als de compiler begint te zeuren
Als je exception handling volledig gaat implementeren, wordt je programma zwaar ondoorzichtig. De foutafhandeling komt niet direkt na de plek waar de fout optreedt, maar pas verderop. Of je krijgt zo veel geneste haakjes dat je het zelf niet meer snapt als je je code later terugleest.
Dus veel mensen implementeren het maar gedeeltelijk, om de code nog onderhoudbaar te houden. Maar laat het exception handling dan maar gelijk volledig achterwege.
Zorg er voor dat je functies gewoon foutwaardes retourneren, zoals in the good old days van C. Dan heb je de foutafhandeling direkt onder de aanroep van de functie.
En als je library functies hebt die exceptions kunnen throwen, schrijf dan een wrapper om die library heen zodat je de exception handling kan verbergen in memberfuncties die dan weer gewoon foutwaardes retourneren.
Hmz. Dit is toch wel wat off-topic.
Macbook Pro
Hmm, wat is hier dan fout aan? Het gebruik van strcpy() enzo? Ik vind het duidelijke code (ik heb het niet gechecked op bugsOlafvdSpek schreef op woensdag 29 maart 2006 @ 23:10:
C++:
1 2 3 4 5 void current_time_details(int& sec, int& minute, int& hour, char dow[], int& day, char cmon[], int& month, int& year) { [knip]
Edit:
Hmm, ik had even over die 'sscanf' functies heen gekeken. Die moet je dus NIET gebruiken zonder te controleren dat de strings die je er in stopt ook is wat je verwacht. Maar als je 100% zeker weet dat wat er in gaat altijd goed is, dan is deze functie prima.
Edit2:
Het was trouwens makkelijker geweest om de localtime() functie te gebruiken om de losse componenten van de tijd te krijgen in een struct tm. Maar dat heeft met de domheid van de oplossing te maken, niet met de domheid van de code.
[ Voor 26% gewijzigd door RetepV op 31-03-2006 11:04 ]
Macbook Pro
Sorry, maar hier ben ik het dus absoluut niet mee eens. Exception handling is juist ontzettend handig, tenminste in Java ofzo.RetepV schreef op vrijdag 31 maart 2006 @ 10:53:
[...]
Exception handling op zich is al slecht.
Als je exception handling volledig gaat implementeren, wordt je programma zwaar ondoorzichtig. De foutafhandeling komt niet direkt na de plek waar de fout optreedt, maar pas verderop. Of je krijgt zo veel geneste haakjes dat je het zelf niet meer snapt als je je code later terugleest.
Dus veel mensen implementeren het maar gedeeltelijk, om de code nog onderhoudbaar te houden. Maar laat het exception handling dan maar gelijk volledig achterwege.
Zorg er voor dat je functies gewoon foutwaardes retourneren, zoals in the good old days van C. Dan heb je de foutafhandeling direkt onder de aanroep van de functie.
En als je library functies hebt die exceptions kunnen throwen, schrijf dan een wrapper om die library heen zodat je de exception handling kan verbergen in memberfuncties die dan weer gewoon foutwaardes retourneren.
Hmz. Dit is toch wel wat off-topic.Lees eens het boek 'Writing solid code'. Erg goed boek.
1 Je houdt de logica en extreme gevallen mooi gescheiden, waardoor je code beter te lezen is.
2 Je hoeft niet alle foutcodes die niemand iets zeggen uit je hoofd te leren, maar ziet in een beetje fatsoenlijke IDE meteen welke exceptions opgegooid worden.
3 Je hoeft bijna niks meer te controleren voor gebruik, hooguit voor performance ofzo, aangezien een try catch niet snel is.
4 Als er iets niet OO is, maar heel zwaar old fashioned C en tegenwoordig zo goed als een taboe.
Ik weet ook wel dat tegenwoordig exceptions te veel gebruikt worden, (zoals om een not null check te voorkomen) maar verder is het een zeer sterk hulpmiddel en ik zweer erbij.
Om nog verder te gaan, ik zou zelfs het niet gebruiken van het exception mechanisme in een omgeving die het wel ondersteunt, beschouwen als een slecht prog voorbeeld.
Fat Pizza's pizza, they are big and they are cheezy
Goed, ik heb een stukje code van mezelf gevonden. Het stukje code is uit een VB.NET wrapper class om via OLE DB uit een database te lezen. Het toont wel aan hoe erg exception handling je code kan verpesten. Het toont nog iets anders aan, maar dat zet ik even onder het code voorbeeld.JKVA schreef op vrijdag 31 maart 2006 @ 11:08:
1 Je houdt de logica en extreme gevallen mooi gescheiden, waardoor je code beter te lezen is.
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
| Protected Function Execute() As Integer If IsNothing(m_DBCommandRef) Then Return -1 End If If IsNothing(m_DBDataAdapter) Then Return -2 End If If IsNothing(m_DBDataSet) Then Return -3 End If m_DBCommandRef.CommandTimeout = 30 m_DBDataAdapter.SelectCommand = m_DBCommandRef Try m_DBDataAdapter.Fill(m_DBDataSet) If m_bWithTransaction Then Try m_DBTransaction.Commit() Catch extrans As SqlException MsgBoxDBErrors(extrans) End Try End If If m_DBConnection.State = ConnectionState.Open Then m_DBConnection.Close() End If Return 0 Catch ex As SqlException If m_bWithTransaction Then Try m_DBTransaction.Rollback() Catch extrans As SqlException MsgBoxDBErrors(extrans) End Try End If If m_DBConnection.State = ConnectionState.Open Then m_DBConnection.Close() End If MsgBoxDBErrors(ex) Return -4 Catch ex As SystemException If m_bWithTransaction Then Try m_DBTransaction.Rollback() Catch extrans As SqlException MsgBoxDBErrors(extrans) End Try End If If m_DBConnection.State = ConnectionState.Open Then m_DBConnection.Close() End If MsgBoxSystemErrors(ex) Return -5 End Try End Function |
De aanroep van deze functie ziet er echter heel leesbaar uit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| ' Bladiebla, maak query enzo. Select Case Execute() Case -1 ' Sukkel, maak eerst een command aan Case -2 ' Yo, we hebben nog helemaal geen data adapter! Case -3 ' Zit je te slapen ofzo, waar moet de data dan naartoe??? Case -4 ' Sja, eh, als je geen fatsoenlijke SQL kunt schrijven, ga dan ergens anders werken. Case -5 ' Hmz, vast iets fataals aan de hand. Case else ' Hu? Een foutcode die niet is gedocumenteerd? End Select ' Ok, het is goed gegaan, doe wat met de data. |
Daar heb je helemaal gelijk in, zie dus het bovenstaande stukje code2 Je hoeft niet alle foutcodes die niemand iets zeggen uit je hoofd te leren, maar ziet in een beetje fatsoenlijke IDE meteen welke exceptions opgegooid worden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| typedef enum { EC_FAILED = -1, // EC_OK = 0, // // // General errorcodes // EC_UNSPECIFIED, // Unspecified error occurred EC_NOT_FOUND, // Something was not found EC_NOT_INITIALIZED, // Call the Initialize() member of the class first. EC_ALREADY_INITIALIZED, // Don't call the Initialize() member more than once. EC_NOT_STARTED, // EC_ALREADY_STARTED, // [etc....] |
Maar eenmaal in een catch block kun je vaak het probleem niet meer 'herstellen'. ALS je een catch block gebruikt, moet je het imo niet gebruiken voor dingen als invoercontrole. Je gaat dan de invoer pas controleren wanneer het zeker is dat het niet verwerkt kan worden. Dat gaat user-interface technisch voor rare constructies zorgen, waardoor users vaak meer moeten klikken en ze gefrustreerder worden. Je wil niet dat users gefrustreerd over je software worden, want dan kopen ze iets anders3 Je hoeft bijna niks meer te controleren voor gebruik, hooguit voor performance ofzo, aangezien een try catch niet snel is.
Wat ik bedoelde te zeggen is dat niet alles wat Stroustrup bedacht heeft ook even slim was en dan ook maar gebruikt moet worden. Exception handling heeft minstens evenveel nadelen als voordelen. Het nodigt ERG uit tot misbruik, en als je het wel goed toepast, blijkt vaak dat je code minder goed onderhoudbaar wordt (iemand die jouw code moet debuggen zal veel meer moeten scrollen om de foutafhandeling te snappen). En daarmee schiet het zijn doel een beetje voorbij.4 Als er iets niet OO is, maar heel zwaar old fashioned C en tegenwoordig zo goed als een taboe.
[ Voor 12% gewijzigd door RetepV op 31-03-2006 11:43 ]
Macbook Pro
De code is niet fout, maar localtime was zoveel eenvoudiger.RetepV schreef op vrijdag 31 maart 2006 @ 10:58:
Hmm, wat is hier dan fout aan?
Daar geloof ik niks van. Heb je daar een goede bron van?Het gebruik van strcpy() enzo? Ik vind het duidelijke code (ik heb het niet gechecked op bugs), en het is vast een heel stuk efficienter dan wanneer je het met het STL string object zou doen. STL strings zijn leuk, maar als je eens gaat kijken hoeveel onderliggende kopieen er gemaakt worden bij die operaties, dan barst je in huilen uit. Het scheelt al zo een factor 20 in snelheid als je alle string operaties met ouderwetse C zou doen in plaats van met STL strings.
De bron ben ik zelf. Maar ik geef toe dat de snelheid afhankelijk is van hoe de STL string is geimplementeerd en hoe de compiler het compileert. Ik zou een voorbeeldje kunnen maken, maar volgens mij is het off-topic in deze thread. Misschien maak ik vanmiddag wel even een thread aan om hier over te discussieren.OlafvdSpek schreef op vrijdag 31 maart 2006 @ 11:31:
[Verhaal over STL strings die langzaam zijn]
Daar geloof ik niks van. Heb je daar een goede bron van?
Macbook Pro
Dat betwijfel ik ook... gebruik je ze wel goed dan? Dus niet steeds 1 character toevoegen bv. Zelfde dat mensen klagen dat vector traag is, en dan zie je de volgende codeRetepV schreef op vrijdag 31 maart 2006 @ 11:36:
De bron ben ik zelf. Maar ik geef toe dat de snelheid afhankelijk is van hoe de STL string is geimplementeerd en hoe de compiler het compileert. Ik zou een voorbeeldje kunnen maken, maar volgens mij is het off-topic in deze thread. Misschien maak ik vanmiddag wel even een thread aan om hier over te discussieren.

1
2
3
4
5
| const int count = 100000; std::vector vec; for (int i=0; i<count; ++i) { vec.push_back(i); } |
Ja, dat is traag als je niet eerst even resized. std::string is vaak juist een reference counted implementatie (hoeft niet, kan wel), je zou dan dus minder kopieen maken dan met C-strings. Er is wel iets van overhead natuurlijk, maar ik betwijfel of je echt veel verschil merkt bij een goede implementatie.
[ Voor 50% gewijzigd door Zoijar op 31-03-2006 12:10 ]
In tegenstelling tot wat ik dus 3 jaar geleden hier zei (RetepV schreef op vrijdag 31 maart 2006 @ 10:53:
Exception handling op zich is al slecht.
Dus veel mensen implementeren het maar gedeeltelijk, om de code nog onderhoudbaar te houden. Maar laat het exception handling dan maar gelijk volledig achterwege.
Ik merk dat juist door dit goed toe te passen dat de code juist overzichtelijker wordt, je ziet sneller wat het doet etc.
Dat vind ik dus onhandig, zeker als je OO gaat werken. (meteen een reden waarom ik bijna altijd systemcalls wrap)Zorg er voor dat je functies gewoon foutwaardes retourneren, zoals in the good old days van C. Dan heb je de foutafhandeling direkt onder de aanroep van de functie.
Maar verder wel leuk dat je me quote van 3 jaar geleden, zie ik meteen dat ik wel degelijk een andere mening heb nu. (is ook te zien als ik code van toen terug kijk).
Reserve is volgens mij toepasselijker dan resize.Zoijar schreef op vrijdag 31 maart 2006 @ 12:06:
Ja, dat is traag als je niet eerst even resized. std::string is vaak juist een reference counted implementatie (hoeft niet, kan wel), je zou dan dus minder kopieen maken dan met C-strings. Er is wel iets van overhead natuurlijk, maar ik betwijfel of je echt veel verschil merkt bij een goede implementatie.
std::string is tegenwoordig volgens mij niet meer reference counted in verband met thread safety.
IMO is het dan ook slechte code.RetepV schreef op vrijdag 31 maart 2006 @ 11:23:
Goed, ik heb een stukje code van mezelf gevonden. Het stukje code is uit een VB.NET wrapper class om via OLE DB uit een database te lezen. Het toont wel aan hoe erg exception handling je code kan verpesten. Het toont nog iets anders aan, maar dat zet ik even onder het code voorbeeld.
De transaction.rollback() en connection.close() zou je moeten doen door automatic resource management (scope guards of destructors).
Verder heb je dubbele fouthandling. Een keer in de functie zelf en een keer in de aanroepende functie. In de aanroepende functie ben je ook de tekst van je exception kwijt.
Als je na elke aanroep van een functie (rollback) een message box op het scherm tovert kun je die message box code ook beter in een functie wrapper zetten dan elke keer na de functie aanroep.
[ Voor 4% gewijzigd door Olaf van der Spek op 31-03-2006 12:30 ]
Oh ja, dat bedoelde ik ook eigenlijkOlafvdSpek schreef op vrijdag 31 maart 2006 @ 12:25:
Reserve is volgens mij toepasselijker dan resize.
Had er laatst nog een discussie over; je kan er niet zo veel zinnigs over zeggen juist omdat het implementation defined is. Het wordt tijd dat C++ threading formeel opneemt... stenentijdperk gedoe. Jammer dat dit soort dingen altijd zo lang duren...std::string is tegenwoordig volgens mij niet meer reference counted in verband met thread safety.
Je kunt toch gewoon iets zeggen over hoe veel gebruikte implementaties het doen?Zoijar schreef op vrijdag 31 maart 2006 @ 12:57:
Had er laatst nog een discussie over; je kan er niet zo veel zinnigs over zeggen juist omdat het implementation defined is.
Ja, helaas.Het wordt tijd dat C++ threading formeel opneemt... stenentijdperk gedoe. Jammer dat dit soort dingen altijd zo lang duren...
Zullen we daar gewoon van maken dat het aantoont hoe erg jij je code met exception handling verpest?RetepV schreef op vrijdag 31 maart 2006 @ 11:23:
[...]
Goed, ik heb een stukje code van mezelf gevonden. Het stukje code is uit een VB.NET wrapper class om via OLE DB uit een database te lezen. Het toont wel aan hoe erg exception handling je code kan verpesten. Het toont nog iets anders aan, maar dat zet ik even onder het code voorbeeld.
Een willekeurig stukje uit wat oude javacode van mij (uit het hoofdje):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public ResultTO getResult(blaat) throws ApplicationException{ Connection conn = null; Statement stmt = null; try { conn.connect(); stmt.create(); //Creatie statement //uitvoeren statement //verwerken result return result; } catch(SQLException sqle){ log.error("SQLException while blaat ",sqle); throw new ApplicationException("blaat",sqle); } finaly { conn.close(); stmt.close(); } } |
Die applicatie exception kan dan, afhankelijk van de aanroep van deze functie, afgehandeld worden in de view (DOor een foutdialog op te werpen met een melding, of te forwarden naar een standaar pagina in je mappings. AL dan niet samen met het eventueel rapporteren van de fout) of in je buisness laag.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
had ik eerst dit gedaan:
1
2
3
4
5
6
7
8
| $waarde = 1; $waardeabs = abs($waarde); if ($waarde = $waardeabs){ echo "Het is een positief getal :)"; } else { echo "Het getal is net zo negatief :P "; } |
gelukkig kwam ik na 5 minuten er al achter dat
1
2
| if ($waarde >= 0) ... |
makkelijker is
Dat valt trouwens best mee. Die vector gaat echt niet bij elke aanroep resizen. De voornaamste reden dat van te voren reserveren efficiënter is (als je precies weet hoeveel items je gaat toevoegen) is dat je dan waarschijnlijk minder geheugen alloceert, omdat de vector anders bijvoorbeeld in machten van 2 (of iets dergelijks) geheugen alloceert. De overhead van het kopiëren bij reallocatie blijft wel aanwezig natuurlijk maar is maar een beperkt deel van de allocatiekosten.Zoijar schreef op vrijdag 31 maart 2006 @ 12:06:
Dat betwijfel ik ook... gebruik je ze wel goed dan? Dus niet steeds 1 character toevoegen bv. Zelfde dat mensen klagen dat vector traag is, en dan zie je de volgende code![]()
C++:
1 2 3 4 5 const int count = 100000; std::vector vec; for (int i=0; i<count; ++i) { vec.push_back(i); }
Ja, dat is traag als je niet eerst even resized.
Reserveren is dus wel een goed idee, maar als je van te voren niet kunt schatten hoe groot de vector wordt, kun je er maar beter niet al te veel moeite voor doen.
[ Voor 9% gewijzigd door Soultaker op 31-03-2006 16:22 ]
Maar in princiepe weet je toch ook niet precies hoeveel geheugen een Vector daadwerkelijk reserveert als je een getal meegeeft? Volgens mij is het alleen zo dat er minstens zoveel elementen in kunnen zonder dat hij opnieuw hoeft te alloceren. Het kan volgens mij best zo zijn dat hij het nog steeds afrond naar de eerste macht van 2 die groter is als het opgegeven getal.Soultaker schreef op vrijdag 31 maart 2006 @ 16:22:
[...]
Dat valt trouwens best mee. Die vector gaat echt niet bij elke aanroep resizen. De voornaamste reden dat van te voren reserveren efficiënter is (als je precies weet hoeveel items je gaat toevoegen) is dat je dan waarschijnlijk minder geheugen alloceert, omdat de vector anders bijvoorbeeld in machten van 2 (of iets dergelijks) geheugen alloceert. De overhead van het kopiëren bij reallocatie blijft wel aanwezig natuurlijk maar is maar een beperkt deel van de allocatiekosten.
Reserveren is dus wel een goed idee, maar als je van te voren niet kunt schatten hoe groot de vector wordt, kun je er maar beter niet al te veel moeite voor doen.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Zoals ik al zei kan het nogal kostbaar zijn om gemiddeld 25% meer geheugen te alloceren dan noodzakelijk (als je afrondt naar een macht van 2) dus dat lijkt me ook een reden om dat niet te doen.
In beide scenario's hou je natuurlijk de overhead van het kopiëren van elementen.
Waar is dat voor nodig? Handelt Java's resource management dat niet automatisch af?Janoz schreef op vrijdag 31 maart 2006 @ 13:36:
Java:
1 2 3 4 5 } finaly { conn.close(); stmt.close(); } }
Nee dat is niet waar. Die vector begint bv op een grootte van 10 elementen, en verveelvoudigd zijn capaciteit dan elke keer als hij vol is. Die factor wisselt, ik geloof dat 1.5 goed werkt, maar 2 kan ook. Overhead komt niet door te veel alloceren, maar door het meerdere keren kopieren van een volledige vector. Met een factor van 1.5 en 1 miljoen elementen, wordt er zo'n 34 keer gekopieerd waarbij het laatste kopie al een kopie van zo'n 600,000 elementen is. Dat is waarom het zo traag is.Soultaker schreef op vrijdag 31 maart 2006 @ 16:22:
Dat valt trouwens best mee. Die vector gaat echt niet bij elke aanroep resizen. De voornaamste reden dat van te voren reserveren efficiënter is (als je precies weet hoeveel items je gaat toevoegen) is dat je dan waarschijnlijk minder geheugen alloceert, omdat de vector anders bijvoorbeeld in machten van 2 (of iets dergelijks) geheugen alloceert. De overhead van het kopiëren bij reallocatie blijft wel aanwezig natuurlijk maar is maar een beperkt deel van de allocatiekosten.
Reserveren is dus wel een goed idee, maar als je van te voren niet kunt schatten hoe groot de vector wordt, kun je er maar beter niet al te veel moeite voor doen.
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
| #include <vector> #include <iostream> class Dummy { public: Dummy() {} ~Dummy() {} Dummy(const Dummy& src) { Dummy::copied++; } const Dummy& operator=(const Dummy& src) { Dummy::copied++; return *this; } static unsigned long copied; }; unsigned long Dummy::copied = 0; int main() { std::vector<Dummy> vec; for (int i=0; i<1000000; ++i) { vec.push_back(Dummy()); } std::cout << "Copies made for vector 1: " << Dummy::copied << std::endl; Dummy::copied = 0; std::vector<Dummy> vec2; vec2.reserve(1000000); for (int i=0; i<1000000; ++i) { vec2.push_back(Dummy()); } std::cout << "Copies made for vector 2: " << Dummy::copied << std::endl; return 0; } |
Output:
1
2
| Copies made for vector 1: 3099788 Copies made for vector 2: 1000000 |
Hoe weet je omgeving nu precies wanneer je klaar bent met je connectie? Natuurlijk zou hij wel opgeruimd worden wanneer hij buiten de scope raakt en de garbage collector langs komt. Echter wil je daar niet op wachten. Sowieso werk je vaak met een connectionpool. Een connection closen is dan niks meer dan het vrijgeven van die connection voor een andere thread. In het geval van ee pool blijft er daarnaast ook een verwijzing bestaan dus lost de garbage collector ook niks op. In je implementatie van je pool kun je immers nooit met zekerheid zeggen of je connection nog wordt gebruikt.OlafvdSpek schreef op vrijdag 31 maart 2006 @ 17:30:
[...]
Waar is dat voor nodig? Handelt Java's resource management dat niet automatisch af?
Daarnaast is het natuurlijk ook geen php pagina waarbij er 0,0 geshared is met als gevolg dat het geen enkel probleem is dat alles wat ook maar binnen de executie van 1 script aangemaakt is zondermeer weggegooid kan worden
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Inderdaad door de variabele scope.Janoz schreef op vrijdag 31 maart 2006 @ 20:03:
Hoe weet je omgeving nu precies wanneer je klaar bent met je connectie?
Voor lokale variabelen hoef je toch niet te wachten op de garbage collector.Natuurlijk zou hij wel opgeruimd worden wanneer hij buiten de scope raakt en de garbage collector langs komt.
idd wou het net zeggen, anders krijg je altijd wat in else staatErkens schreef op vrijdag 31 maart 2006 @ 15:56:
Nu kan het ook wel op die eerste manier, alleen moet je dan wel == gebuiken in je if-statement
afaik geeft een toekenning altijd trueID-College schreef op vrijdag 31 maart 2006 @ 20:33:
[...]
idd wou het net zeggen, anders krijg je altijd wat in else staat
Helaas, geen wasmachine voor jou.ID-College schreef op vrijdag 31 maart 2006 @ 20:33:
[...]
idd wou het net zeggen, anders krijg je altijd wat in else staat
pff een uur geen reactie en dan toch spuit 11...
[ Voor 13% gewijzigd door Voutloos op 31-03-2006 21:33 ]
{signature}
Volgens mij is if (a = 0) gewoon false hoor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| private void Page_Load(object sender, System.EventArgs e) { adapter =(OleDbDataAdapter) Application["adapter"]; if (!IsPostBack) { gemeenteDS = new DataSet(); adapter.Fill(gemeenteDS); ViewState["gemeentes"] = gemeenteDS; OverzichtGemeentes.DataSource = gemeenteDS.Tables[0].DefaultView; OverzichtGemeentes.DataBind(); } else { gemeenteDS = (DataSet)ViewState["gemeentes"]; } } |
ja, alles werkt...
tot er 2 gebruikers tegelijk de pagina laden...
code van m'n medestudenten tijdens het project dat hierop volgt (niet exact, losse pols)
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
| public class usermgmt { private const string select = ". een of ander SELECT statement." private IDbDataAdapter adapter; private IConnectionFactory factory; public usermgmt() { IDbConnection conn = factory.GetConnection(); adapter = factory.CreateAdapter(query, conn); adapter.Parameters.Add(factory.CreateParameter("parameter")); } public string getIets(string iets) { adapter.SelectCommand.Parameters["parameter"].Value = iets; IDbConnection conn_dummy = adapter.SelectCommand.Connection conn.Open(); try { return adapter.SelectCommand.ExecuteScalar().ToString(); } finally { conn.Close() } } } |
ja hoor. een adapter is niet meer als een handige collectie van commands en een connection.
maar waarom mijn web-app slechts 1 gebruiker tegelijk aankan is me een raadsel.
behalve dit moet je weten dat de implementatie van factory.CreateParameter natuurlijk databank-afhankelijk is en dus voor bvb MSSQL:
1
2
3
4
| public IDbDataParameter CreateParameter(string naam) { return new SqlDataParameter("@" + naam); } |
wat er dus voor zorgde dat bovenstaand stuk code zelfs niet eens werkte...
let behalve die fouten ook op de Java-style...
andere Java-"fout" die ik in .NET tegenkwam
1
2
| if (listbox.SelectedValue.Text.Equals(txtBox.Text.SubString(10))) /// doeiets |
nog een toffe uit dat project die ik jullie niet wil besparen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| public void init() { // parameters aanmaken: IDbDataParameter paramBanned = factory.CreateParameter("Banned"); IDbDataParameter paramNaam = factory.CreateParameter("naam"); IDbDataParameter paramEmail = factory.CreateParameter("email"); // connectie IDbConnection conn = factory.GetConnection(); // GetConnection() maakt telkens een nieuwe connectie aan // dataadapters private in klasse selectBannedByNaam = factory.CreateAdapter(SELECTBANNEDBYNAAM, conn); selectBannedByNaam.SelectCommand.Parameters.Add(paramBanned); selectBannedByNaam.SelectCommand.Parameters.Add(paramNaam); selectBannedByEmail = factory.CreateAdapter(SELECTBANNEDBYEMAIL, conn); selectBannedByNaam.SelectCommand.Parameters.Add(paramBanned); selectBannedByNaam.SelectCommand.Parameters.Add(paramEmail); } |
een connectie gebruik je nooit voor 2 verschillende commands op deze manier, tenzij je connection pooling gebruikt of een andere manier om te zorgen dat je maar 1 command tegelijk per connectie kan uitvoeren.
een parameter kun je maar aan 1 command toekennen. Wat doe je anders als die 2 commands door threading simultaan runnen met verschillende parameter values? (zelfs al zitten ze op 2 verschillende connecties)
en dan moet je weten dat die code doorspekt stond met code zoals in het 2de codevenster...
[ Voor 74% gewijzigd door H!GHGuY op 31-03-2006 22:49 ]
ASSUME makes an ASS out of U and ME
Hmm, getest, maar het ligt er inderdaad aan wat je toekent aan 'a'. a=0 geeft false, maar a=1 geeft true. En dit bij zowel PHP als C++.OlafvdSpek schreef op vrijdag 31 maart 2006 @ 21:47:
[...]
Volgens mij is if (a = 0) gewoon false hoor.
[ Voor 33% gewijzigd door Jaap-Jan op 31-03-2006 22:56 ]
| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett
Dit topic is gesloten.
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes.
