True, maar soms kan je bijna niet anders als er in het verleden in bijvoorbeeld een client applicatie een dergelijke typo heeft gestaan en je nog steeds compatible moet zijn met die client. Uiteraard zou het dan wel extreem nuttig zijn om er een kleine comment bij te zetten.Voutloos schreef op zaterdag 19 januari 2008 @ 19:33:
Ik las er eerst ook over heen, en dat is meteen de reden waarom dergelijke stunts met verschil in casing een nekschot waard zijn.
Kun je dan niet beter een condition aan een breakpoint hangen? Het gevaar is natuurlijk dat je vergeet dat soort code te verwijderenMBV schreef op zaterdag 19 januari 2008 @ 19:28:
[...]
Ik heb ook wel eens zo'n regeltje neergezet. Ik wilde een breakpoint hebben, op iets dat door een veld van 50x50 heen liep met 60fps (zonder breakpoints). Iets zegt mij dat er hier wat anders aan de hand is...
Anoniem: 140111
Misschien niet helemaal praktische code, maar ik wilde net iets uitleggen aan een lotstudiegenoot, maar had geen zin om veel te typen (MSN):
Toen ik het teruglas dacht ik dat het misschien toch tijd is om een leven te zoeken, msn gesprekken voeren in pseudocode is volgens mij een teken dat ik op vakantie moetmijnmail.com says:
while(!1stedocent(naarkeuze).isAkkoord || !2dedocent(naarkeuze).isAkkoord)
{
stuurmandaat(1stedocent)
stuurmandaat(2dedocent)
}
[ Voor 4% gewijzigd door Anoniem: 140111 op 05-02-2008 12:53 ]
Anoniem: 84120
Eerste was ik dacht: StudentDocentarray... *ja vakantie heb ik al weer een paar dagen... *schaam**Anoniem: 140111 schreef op dinsdag 05 februari 2008 @ 12:52:
Misschien niet helemaal praktische code, maar ik wilde net iets uitleggen aan een lotstudiegenoot, maar had geen zin om veel te typen (MSN):
[...]
Toen ik het teruglas dacht ik dat het misschien toch tijd is om een leven te zoeken, msn gesprekken voeren in pseudocode is volgens mij een teken dat ik op vakantie moet
(Offtopic) Om nog heel even terug te komen op e-mailvalidatie.
Ik heb voor het bedrijf waar ik werk een server-side validatie ingebouwd, (die de eerder gebruikte regex gebruikt) en vervolgens een sessie naar de mailserver opzet om daar te kijken of het e-mailadres valid is. Niet zo snel, maar het bespaart wel veel foute e-mailadressen in de nieuwsbrieflijst.
Ik heb voor het bedrijf waar ik werk een server-side validatie ingebouwd, (die de eerder gebruikte regex gebruikt) en vervolgens een sessie naar de mailserver opzet om daar te kijken of het e-mailadres valid is. Niet zo snel, maar het bespaart wel veel foute e-mailadressen in de nieuwsbrieflijst.
Vandaag wilde ik leren werken met OOP
Omdat javascript nogal flexibel is, ben ik daarmee begonnen
De klasse die ik heb gemaakt moet de locatie terug geven van de gegevens waar op gezocht werd in een geneste array. Twas precies niet zo makkelijk, omdat ik recursief moet werken
De "functie" doet het, maar ik vind dit er toch maar raar uitzien.
Ik weet niet of ik jullie mag uitdagen,
De challlenge, hoe schrijf ik dit netter? (als een echte klasse?)
Omdat javascript nogal flexibel is, ben ik daarmee begonnen
De klasse die ik heb gemaakt moet de locatie terug geven van de gegevens waar op gezocht werd in een geneste array. Twas precies niet zo makkelijk, omdat ik recursief moet werken
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
| Array.prototype.searchValueLoc = function( keyword ) { results = new Array(); result = new Array(); function isArray(obj) { if (obj.constructor.toString().indexOf("Array") == -1) return false; else return true; } function getResult( container , keyword ) { var i = container.length-1; if ( i > 0 ) { do { if ( keyword == container[i] ) // found ! { result[result.length] = i results[results.length] = result } if ( isArray(container[i]) ) //search deeper { result[result.length] = i getResult( container[i] , keyword ) } } while (i--); } result = new Array() return results } return getResult( this , keyword ) } |
De "functie" doet het, maar ik vind dit er toch maar raar uitzien.
Ik weet niet of ik jullie mag uitdagen,
De challlenge, hoe schrijf ik dit netter? (als een echte klasse?)
[ Voor 198% gewijzigd door g4wx3 op 07-02-2008 03:28 . Reden: opmaak ]
Nu heb ik al heel wat geprobeert in C++, maar ik heb nooit begrepen waarom op sommige plaatsen een . wordt gebruikt voor een methode/variable van een instantie/static-klasse?remco_k schreef op maandag 22 oktober 2007 @ 15:36:
En weer eentje uit eigen doos bij het samenstellen van een deel van een dynamische query.
De gebruiker kan in de Labeled Edit (leDurationSec) een nummerieke waarde invullen om zodoende te kunnen filteren op duration X.
C++:
1 2 3 4 5 6 .... AnsiString asDurationSQL=""; if (!leDurationSec->Text.IsEmpty() && leDurationSec->Text.ToIntDef(-1)>-1) { asDurationSQL="AND duration>="+leDurationSec->Text.ToInt()*1000; } ....
:: voor static, -> voor non-static, maar . ???
Van JS op zich ken ik de ballen, maar regel 29 is ronduit brak, in die while moet een conditie staan, het enige wat gij doet is i--, wat altijd true geeft, totdat i kleiner is als de boundaries van een 32bit int (dewelke afaik wordt gebruikt door JS, maar don't shoot me als dat niet zo is).g4wx3 schreef op donderdag 07 februari 2008 @ 03:17:
Vandaag wilde ik leren werken met OOP
Omdat javascript nogal flexibel is, ben ik daarmee begonnen
De klasse die ik heb gemaakt moet de locatie terug geven van de gegevens waar op gezocht werd in een geneste array. Twas precies niet zo makkelijk, omdat ik recursief moet werken
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 Array.prototype.searchValueLoc = function( keyword ) { results = new Array(); result = new Array(); function isArray(obj) { if (obj.constructor.toString().indexOf("Array") == -1) return false; else return true; } function getResult( container , keyword ) { var i = container.length-1; if ( i > 0 ) { do { if ( keyword == container[i] ) // found ! { result[result.length] = i results[results.length] = result } if ( isArray(container[i]) ) //search deeper { result[result.length] = i getResult( container[i] , keyword ) } } while (i--); } result = new Array() return results } return getResult( this , keyword ) }
De "functie" doet het, maar ik vind dit er toch maar raar uitzien.
Ik weet niet of ik jullie mag uitdagen,
De challlenge, hoe schrijf ik dit netter? (als een echte klasse?)
Going for adventure, lots of sun and a convertible! | GMT-8
In JavaScript kan de waarde 0 gebruikt worden voor false:Snake schreef op donderdag 07 februari 2008 @ 03:59:
[...]
Van JS op zich ken ik de ballen, maar regel 29 is ronduit brak, in die while moet een conditie staan, het enige wat gij doet is i--, wat altijd true geeft, totdat i kleiner is als de boundaries van een 32bit int (dewelke afaik wordt gebruikt door JS, maar don't shoot me als dat niet zo is).
C:\>js js> var i = 4; do { print(i) } while(--i) 4 3 2 1 js> var i = 4; do { print(i) } while(i--) 4 3 2 1 0
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Dat het kan, betekent niet dat het ook goed is. Dat is het probleem wat ik heb met typeless programmeer / scripttalen: je kunt bepaalde dingen doen zoals nummers misbruiken als booleans, maar of het handig of goed is... nee.
-> werkt op een pointer, vergelijk:Snake schreef op donderdag 07 februari 2008 @ 03:59:
[...]
Nu heb ik al heel wat geprobeert in C++, maar ik heb nooit begrepen waarom op sommige plaatsen een . wordt gebruikt voor een methode/variable van een instantie/static-klasse?
:: voor static, -> voor non-static, maar . ???
C++:
1
2
3
4
5
6
| MyObject foo; // foo is geen pointer foo.bar(); MyObject* foo = new MyObject(); // foo is hier een pointer foo->bar(); (*foo).bar(); |
Regel 5 en 6 doen precies hetzelfde.
[ Voor 27% gewijzigd door user109731 op 07-02-2008 10:23 ]
De exacte code heb ik niet meer omdat ik het gerefactored heb, maar gisteren kwam ik zoiets tegen:
Een simpele "SELECT count(email_id) AS numberOfEmails FROM emails WHERE user_id = ".intval($userId)" doet hetzelfde en dat ook nog eens flink sneller.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <?php class Blaat { // ... function GetTotalNumberOfEmails($userId) { $return = 0; $query = "SELECT * FROM emails"; /* * Doet hier een hoop dingen, zoals het aanmaken van een Email object bij elke row (dat dan weer wel) en * dan checken of de userId van het mailtje overeen komt met de opgegeven $userId. Als dat zo is word * het Mail object in een array gestopt. En dan krijgen we de laatste regel: */ return count($emails); } } ?> |
Een simpele "SELECT count(email_id) AS numberOfEmails FROM emails WHERE user_id = ".intval($userId)" doet hetzelfde en dat ook nog eens flink sneller.
Op zich is dit niet eens zo'n heel gek idee. hierdoor maakt het de gebruiker van die class niet meer uit waar dat deze informatie vandaan komt. Als hier een abstract class had gehangen dan was het al helemaal niet zo heel gek aangezien je dan verschillende types van BLAAT kunt hebben. Een die zijn e-mail van de mysql server af pakt de ander die het vanuit een file dir doet etc etc..Maar goed een select * gebruiken terwijl je een select count wil is natuurlijk een apparte aanpakAtleX schreef op donderdag 07 februari 2008 @ 10:23:
De exacte code heb ik niet meer omdat ik het gerefactored heb, maar gisteren kwam ik zoiets tegen:
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php class Blaat { // ... function GetTotalNumberOfEmails($userId) { $return = 0; $query = "SELECT * FROM emails"; /* * Doet hier een hoop dingen, zoals het aanmaken van een Email object bij elke row (dat dan weer wel) en * dan checken of de userId van het mailtje overeen komt met de opgegeven $userId. Als dat zo is word * het Mail object in een array gestopt. En dan krijgen we de laatste regel: */ return count($emails); } } ?>
Een simpele "SELECT count(email_id) AS numberOfEmails FROM emails WHERE user_id = ".intval($userId)" doet hetzelfde en dat ook nog eens flink sneller.
[ Voor 3% gewijzigd door Webgnome op 07-02-2008 10:56 ]
Anoniem: 37526
Je bent er van op de hoogte dat True en False niet meer is dan een maskertje voor 1 en 0?YopY schreef op donderdag 07 februari 2008 @ 10:04:
Dat het kan, betekent niet dat het ook goed is. Dat is het probleem wat ik heb met typeless programmeer / scripttalen: je kunt bepaalde dingen doen zoals nummers misbruiken als booleans, maar of het handig of goed is... nee.
En jij dat het eigenlijk -1 en 0 is? Maar dat iedere waarde anders dan 0 als true wordt gezien? Mag jij raden waarom het -1 is.Anoniem: 37526 schreef op donderdag 07 februari 2008 @ 10:35:
[...]
Je bent er van op de hoogte dat True en False niet meer is dan een maskertje voor 1 en 0?
[ Voor 4% gewijzigd door bigbeng op 07-02-2008 11:17 ]
Heeft niets met typeless te maken, maar met boolean evaluation. Of wil je C en C++ ook typeless noemen? Als je in zo'n taal gewend bent te werken, dan weet je dat je bij exp (bij numerieke types) eigenlijk moet lezen: exp != 0. Dat kun je raar vinden, maar dat is subjectief.YopY schreef op donderdag 07 februari 2008 @ 10:04:
Dat het kan, betekent niet dat het ook goed is. Dat is het probleem wat ik heb met typeless programmeer / scripttalen: je kunt bepaalde dingen doen zoals nummers misbruiken als booleans, maar of het handig of goed is... nee.
Anoniem: 37526 schreef op donderdag 07 februari 2008 @ 10:35:
Je bent er van op de hoogte dat True en False niet meer is dan een maskertje voor 1 en 0?
Mag ik beide heren erop wijzen dat geen van jullie in het algemeen gelijk heeft, en het er maar net aan ligt wat de taal in kwestie definieert voor de waarden van true en false, als die ook daadwerkelijk een waarde hebben? Het zou net zo goed resp. 4 en 35 kunnen zijn.bigbeng schreef op donderdag 07 februari 2008 @ 11:17:
En jij dat het eigenlijk -1 en 0 is? Maar dat iedere waarde anders dan 0 als true wordt gezien? Mag jij raden waarom het -1 is.
In Java heb je bijvoorbeeld geeneens conversions van/naar boolean (ja, er is er een, van boolean naar String), en dus is het ook onzinnig een waarde aan true en false te koppelen. In C++ levert een true geconverteert naar int een 1 op, in PHP is het direct een definitie voor de waarde 1 (er is geen apart boolean type).
[ Voor 10% gewijzigd door .oisyn op 07-02-2008 11:46 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
I stand corrected.oisyn schreef op donderdag 07 februari 2008 @ 11:41:
[...]
[...]
Mag ik beide heren erop wijzen dat geen van jullie in het algemeen gelijk heeft, en het er maar net aan ligt wat de taal in kwestie definieert voor de waarden van true en false, als die ook daadwerkelijk een waarde hebben?
De laatste keer dat ik numerieke conversies van booleans en vice versa uitvoerde werkte ik met Visual Basic en C. Toch eens leren buiten mijn eigen kader te denken
VB heeft idd False=0 en True=NOT False (dus -1). C90 kent geen boolean type, dus wellicht dat iemand zelf een true als -1 had gedefinieerd? In C99 is true gewoon (_Bool)1.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Als ik het mij goed herinner (en het was voor C99 bestond, dus lang geleden
), was het meer de uitkomst van een boolean operatie waar ik mee zat te stoeien, niet zozeer met een type. Hoe dan ook, stop es ff met mij te corrigeren, mijn laatste beetje zelfrespect gaat zo wel het raam uit
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
| private void ultraTabControl1_SelectedTabChanged(object sender, Infragistics.Win.UltraWinTabControl.SelectedTabChangedEventArgs e) { ugStamtabel.DataSource = e.Tab.Tag; if (((IEntity)ugStamtabel.Rows[ugStamtabel.Rows.Count - 1].ListObject).Fields[0].CurrentValue != null) this.addRow(); } private void addRow() { Type type = ugStamtabel.DataSource.GetType(); MethodInfo methodInfo = type.GetMethod("AddNew"); methodInfo.Invoke(ugStamtabel.DataSource, null); } private void ugStamtabel_AfterCellUpdate(object sender, Infragistics.Win.UltraWinGrid.CellEventArgs e) { try { Type type = e.Cell.Row.ListObject.GetType(); MethodInfo methodInfo = type.GetMethod("Save", new Type[] { typeof(bool) }); methodInfo.Invoke(e.Cell.Row.ListObject, new object[] { true }); PropertyInfo propertyInfo = type.GetProperty("Actief", new Type[] { }); bool actief = (bool)propertyInfo.GetValue(e.Cell.Row.ListObject, new object[] { }); if (!actief) MessageBox.Show("Het zojuist uitgevinkte item zal niet meer verschijnen in de drop-down-lijstjes van de sjablonen.", "Waarschuwing", MessageBoxButtons.OK, MessageBoxIcon.Warning); } catch (Exception ex) { MessageBox.Show("Kan niet bewaren: " + ex.Message, "Fout bij bewaren", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (e.Cell.Row.Index == ugStamtabel.Rows.Count -1) this.addRow(); } |
Anoniem: 37526
Ik programmeer af en toe in Assembly, en daar waar ik altijd zelf TRUE en FALSE aan 0 en 1 hang ging ik er van uit dat elke fatsoenlijke taal dat wel deed. Assumption is the mother of all fuck ups..oisyn schreef op donderdag 07 februari 2008 @ 11:41:
[...]
Mag ik beide heren erop wijzen dat geen van jullie in het algemeen gelijk heeft, en het er maar net aan ligt wat de taal in kwestie definieert voor de waarden van true en false, als die ook daadwerkelijk een waarde hebben? Het zou net zo goed resp. 4 en 35 kunnen zijn.
helemaal waarAnoniem: 37526 schreef op donderdag 07 februari 2008 @ 15:09:
[...]
Ik programmeer af en toe in Assembly, en daar waar ik altijd zelf TRUE en FALSE aan 0 en 1 hang ging ik er van uit dat elke fatsoenlijke taal dat wel deed. Assumption is the mother of all fuck ups.
Assumptions are the mother of all fuck ups | iRacing Profiel
Respectievelijk?Anoniem: 37526 schreef op donderdag 07 februari 2008 @ 15:09:
en daar waar ik altijd zelf TRUE en FALSE aan 0 en 1 hang
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Euh, hij gebruikt een "do {} while ();" loop, geen "while () {};"... En ja, daar zit verschil in... (eerste wordt 1 of meer keer uitgevoerd, tweede 0 of meer...)Snake schreef op donderdag 07 februari 2008 @ 03:59:
Van JS op zich ken ik de ballen, maar regel 29 is ronduit brak, in die while moet een conditie staan, het enige wat gij doet is i--, wat altijd true geeft, totdat i kleiner is als de boundaries van een 32bit int (dewelke afaik wordt gebruikt door JS, maar don't shoot me als dat niet zo is).
offtopic:
Mastermind, schattig dat je 35 regels code plaatst, maar was het niet de bedoeling van dit topic dat je ook het probleem / error erbij zet?
Mastermind, schattig dat je 35 regels code plaatst, maar was het niet de bedoeling van dit topic dat je ook het probleem / error erbij zet?
C#:
1
2
3
4
5
6
7
8
9
10
11
| /// <summary> /// Swaps the given objects with eachother /// </summary> /// <param name="One"></param> /// <param name="Two"></param> private void SwapObjects(object One, object Two) { object Temp = One; One = Two; Two = Temp; } |
Kwam toevallig een soortgelijke code tegen ivm een topic over Permutaties en ik kwam er achter dat C# in feite (afaik) geen swap heeft.
spoiler:
private void SwapObjects(ref object One, ref object Two); Nu worden er alleen kopietjes gemaakt. En ik vroeg me af waarom de object onderling niet omgezet werden.
[ Voor 67% gewijzigd door TeeDee op 07-02-2008 16:49 ]
Heart..pumps blood.Has nothing to do with emotion! Bored
Anoniem: 33810
Ja, op die fiets is "4" ook een maskertje voor 0100Anoniem: 37526 schreef op donderdag 07 februari 2008 @ 10:35:
[...]
Je bent er van op de hoogte dat True en False niet meer is dan een maskertje voor 1 en 0?
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Die is er wel degelijk hoor.oisyn schreef op donderdag 07 februari 2008 @ 11:41:
in PHP is het direct een definitie voor de waarde 1 (er is geen apart boolean type).
Ter illustratie:
PHP:
1
2
3
4
| $int = 1; $bool = true; echo $int === $bool ? 'Equal' : 'Not equal'; // Echo's Not Equal. |
Dat 99.9% van de PHP gebruikers geen flauw idee heeft wat voor types er zijn en hoe ze gebruikt moeten worden betekend nog niet dat ze er ook niet zijn
I stand corrected, ik dacht dat true en false gewoon defines waren voor 1 en 0.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Anoniem: 33810
Maar dat soort mensen gaat waarschijnlijk ook geen waarde EN type verglijking doen via ===, dus wat komt er uit als je aan PHP vraagt of 1 == true ?FragFrog schreef op donderdag 07 februari 2008 @ 17:39:
[...]
Die is er wel degelijk hoor
Ter illustratie:
PHP:
1 2 3 4 $int = 1; $bool = true; echo $int === $bool ? 'Equal' : 'Not equal'; // Echo's Not Equal.
Dat 99.9% van de PHP gebruikers geen flauw idee heeft wat voor types er zijn en hoe ze gebruikt moeten worden betekend nog niet dat ze er ook niet zijn
Ik snap je niet helemaal. Wat bedoel je met "nu worden er kopietjes gemaakt" - de code zoals je 'm post of de code met de ref erin? In beide gevallen wordt er natuurlijk sowieso geen kopie gemaakt van het object zelf, want One en Two zijn referenties naar de objecten, en van die referenties zelf worden wel kopieën als je geen 'ref' gebruikt.TeeDee schreef op donderdag 07 februari 2008 @ 16:42:
private void SwapObjects(ref object One, ref object Two); Nu worden er alleen kopietjes gemaakt. En ik vroeg me af waarom de object onderling niet omgezet werden.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Misschien duidelijker wat ik bedoel met een stukje code;.oisyn schreef op donderdag 07 februari 2008 @ 18:07:
[...]
Ik snap je niet helemaal. Wat bedoel je met "nu worden er kopietjes gemaakt" - de code zoals je 'm post of de code met de ref erin? In beide gevallen wordt er natuurlijk sowieso geen kopie gemaakt van het object zelf, want One en Two zijn referenties naar de objecten, en van die referenties zelf worden wel kopieën als je geen 'ref' gebruikt.
C#:
1
2
3
4
5
6
7
8
| object melp = 10; object blaat = 20; SwapObjects(ref melp, ref blaat); //geeft 20,10, wat dus de bedoeling was; object waa = 10; object meuk = 20; SwapObjectsNoRef(waa, meuk); //geeft 10,20; |
staat inderdaad een beetje lomp in de spoilert
Heart..pumps blood.Has nothing to do with emotion! Bored
1 == true levert true op.Anoniem: 33810 schreef op donderdag 07 februari 2008 @ 18:03:
[...]
Maar dat soort mensen gaat waarschijnlijk ook geen waarde EN type verglijking doen via ===, dus wat komt er uit als je aan PHP vraagt of 1 == true ?
PHP bool.
Developer Accused Of Unreadable Code Refuses To Comment
Anoniem: 14829
Da's puur afhankelijk van de taal die je gebruikt. Bij Delphi, en vroeger Clipper, bepaalt de functie zelf welke parameters by reference worden gebruikt, bij C#, Java, etc. is 't aan de routine die die functie aanroept. En voor beide is wat te zeggen...TeeDee schreef op donderdag 07 februari 2008 @ 18:43:
Misschien duidelijker wat ik bedoel met een stukje code;
C#:
1 2 3 4 5 6 7 8 object melp = 10; object blaat = 20; SwapObjects(ref melp, ref blaat); //geeft 20,10, wat dus de bedoeling was; object waa = 10; object meuk = 20; SwapObjectsNoRef(waa, meuk); //geeft 10,20;
Het feit dat ik de methodes via reflection aanroep ipv de methodes van instanties aan te roepen (omslachtig dusTeeDee schreef op donderdag 07 februari 2008 @ 16:42:
offtopic:
Mastermind, schattig dat je 35 regels code plaatst, maar was het niet de bedoeling van dit topic dat je ook het probleem / error erbij zet?
Wel als je met processen werkt. Return waarde 0 is true (succesvol), al het andere is false (failure). Lekker verwarrend dus.
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Oke, true, 1 kun je stellen is gelijk aan waar en 0 aan onwaar. Echter, het idee erachter is heel anders. Je zou een heel programma kunnen maken (bijvoorbeeld in javascript of c of wat dan ook) waar je gewoon geen booleans gebruikt en alles met cijfers doet, maar dat, lijkt mij persoonlijk, is gewoon Not Done. Als je je trues en falses met nummers gaat weergeven, ga je die ook als nummers gebruiken - wat kan leiden tot rare constructies, bugs, etc. Maar ja, daarom hebben ze ook de true en false-keywords ingebouwd. In talen als Java en dergelijke kun je daarom ook nooit true en false met 1 en 0 verwarren of met elkaar uitwisselen, simpelweg omdat ze conceptueel heel anders zijn (cijfers vs booleans).
Ik stel voor om true en false te schrijven als (λt f . t) en (λt f . f)YopY schreef op donderdag 07 februari 2008 @ 21:52:
Je zou een heel programma kunnen maken (bijvoorbeeld in javascript of c of wat dan ook) waar je gewoon geen booleans gebruikt en alles met cijfers doet, maar dat, lijkt mij persoonlijk, is gewoon Not Done.
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
bijvoorbeeld: mysql heeft geen boolean type.. Dit staat er op hun website: "BOOL, BOOLEAN : These types are synonyms for TINYINT(1)" wat ik zeer vreemd vind. Zelf gebruik ik altijd een ENUM met true/false.Anoniem: 14829 schreef op donderdag 07 februari 2008 @ 22:13:
YopY, de meeste databases hebben niet eens een boolean veldtype...
When I get sad i stop being sad and be awesome instead
Niet waar voor Java. Deze is binnen een enkele JVM -altijd- call-by-value. Call-by-reference bestaat niet in Java binnen een lokale JVM.Anoniem: 14829 schreef op donderdag 07 februari 2008 @ 20:32:
[...]
Bij Delphi, en vroeger Clipper, bepaalt de functie zelf welke parameters by reference worden gebruikt, bij C#, Java, etc. is 't aan de routine die die functie aanroept.
It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.
Anoniem: 33810
Uhm, en een ENUM (enummeratie; 0 en 1) is dan niet raarKwastie schreef op vrijdag 08 februari 2008 @ 00:33:
[...]
bijvoorbeeld: mysql heeft geen boolean type.. Dit staat er op hun website: "BOOL, BOOLEAN : These types are synonyms for TINYINT(1)" wat ik zeer vreemd vind. Zelf gebruik ik altijd een ENUM met true/false.
Nee dat is niet helemaal juistflowerp schreef op vrijdag 08 februari 2008 @ 00:38:
[...]
Niet waar voor Java. Deze is binnen een enkele JVM -altijd- call-by-value. Call-by-reference bestaat niet in Java binnen een lokale JVM.
In Java wordt alles "call-by-reference" gedaan. Alleen wordt de reference gekopieerd.
Het kopieren is niet nodig als een parameter final is, omdat er dan compile errors komen als je je reference wil veranderen. Ik weet trouwens niet of JVMs het niet-kopieren optimizen eigenlijk.
Ennnnnnnnnn laat losssssssss.... https://github.com/jrz/container-shell (instant container met chroot op current directory)
Jrz schreef op vrijdag 08 februari 2008 @ 00:47:
[...]
Nee dat is niet helemaal juist
In Java wordt alles "call-by-reference" gedaan. Alleen wordt de reference gekopieerd.
Het kopieren is niet nodig als een parameter final is, omdat er dan compile errors komen als je je reference wil veranderen. Ik weet trouwens niet of JVMs het niet-kopieren optimizen eigenlijk.
Java:
1
2
3
4
5
6
7
| void doSomething(Foo z) { z = null; } Foo x = new Foo("foo"); doSomething(x); // x == ? |
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
x is nog steeds foo. Precies zoals ik zei.RayNbow schreef op vrijdag 08 februari 2008 @ 06:36:
[...]
Java:
1 2 3 4 5 6 7 void doSomething(Foo z) { z = null; } Foo x = new Foo("foo"); doSomething(x); // x == ?
Van de reference x wordt een kopie gemaakt, die wordt gebruikt in doSomething als z.
Op dit moment heb je dus 2 references naar je 1 Foo object. Dus geen kopie van Foo, en ook niet slechts 1 reference.
Daarna wijst z naar null. Nu nog maar 1 reference. Gaat uit de scope -> z vervalt, maar x is ongewijzigd, omdat z een kopie was. Maar wel een reference.
In C:
doSomething(Foo f)
doSomething(Foo *f)
doSomething(Foo &f)
[ Voor 26% gewijzigd door Jrz op 08-02-2008 09:46 ]
Ennnnnnnnnn laat losssssssss.... https://github.com/jrz/container-shell (instant container met chroot op current directory)
Irrelevant. PHP cast zelf, alle getallen die niet 0 zijn evaluaten in een boolean expressie dan als true. Punt was dat PHP wel degelijk die types heeft, en je ze kunt gebruiken als je dat zou willen. Mocht je dan in de vervelende situatie zitten dat een functie zowel een getal als een boolean terug kan geven kun je dat, in PHP, prima opvangen.Anoniem: 33810 schreef op donderdag 07 februari 2008 @ 18:03:
Maar dat soort mensen gaat waarschijnlijk ook geen waarde EN type verglijking doen via ===, dus wat komt er uit als je aan PHP vraagt of 1 == true ?
* FragFrog heeft nog genoeg op een collega lopen vloeken die het volgende presteerde:
PHP:
1
2
3
4
5
6
| function randomFunction () { if (some condition) return 1; else return 2; } |
Mag je raden welke true en welke false was

Weet je ook het echte idee achter 1=true en 0=false? True-false logica met de Or en And operatoren werkt hetzelfde als de algebraische groep van getallen modulo 2 (ie. eenheid 1, nul-element 0) met operatoren plus en maal. In C is het heel normaal om 0 en 1 te gebruiken. Sterker nog, C kent geen bool type.YopY schreef op donderdag 07 februari 2008 @ 21:52:
Oke, true, 1 kun je stellen is gelijk aan waar en 0 aan onwaar. Echter, het idee erachter is heel anders. Je zou een heel programma kunnen maken (bijvoorbeeld in javascript of c of wat dan ook) waar je gewoon geen booleans gebruikt en alles met cijfers doet, maar dat, lijkt mij persoonlijk, is gewoon Not Done. Als je je trues en falses met nummers gaat weergeven, ga je die ook als nummers gebruiken - wat kan leiden tot rare constructies, bugs, etc. Maar ja, daarom hebben ze ook de true en false-keywords ingebouwd. In talen als Java en dergelijke kun je daarom ook nooit true en false met 1 en 0 verwarren of met elkaar uitwisselen, simpelweg omdat ze conceptueel heel anders zijn (cijfers vs booleans).
Dit was wel een mooie loop 
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| for (int k=0; k<n; ++k) { for (int j=k; j<n; ++j) { for (int i=0; i<n; ++i) { if (i != j && i != k) { int offset = 0; for (int a=0; a<N; ++a) { for (int b=a; b<N; ++b) { if (a == b) { K(t,offset) = V(idx(i,j),a)*V(idx(i,k),a) - V(idx(i,i),a)*V(idx(j,k),a); } else { K(t,offset) = V(idx(i,j),a)*V(idx(i,k),b) - V(idx(i,i),a)*V(idx(j,k),b) + V(idx(i,j),b)*V(idx(i,k),a) - V(idx(i,i),b)*V(idx(j,k),a); } offset++; } } t++; } } } } |
Wat je zei: "In Java wordt alles "call-by-reference" gedaan."
Wat je beschrijft: call by valueVan de reference x wordt een kopie gemaakt, die wordt gebruikt in doSomething als z.
Op dit moment heb je dus 2 references naar je 1 Foo object. Dus geen kopie van Foo, en ook niet slechts 1 reference.
Tegenspraak?
C kent afaik geen references. C++ wel.In C:
doSomething(Foo f)
doSomething(Foo *f)
doSomething(Foo &f)
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
De reference wordt gekopieerd, niet het object -> call-by-ref en niet call-by-value. C kent pointers die als enige verschil hebben dat ze null kunnen zijn. Maar aangezien je in java een reference blijkbaar op null kan zetten, zijn het eigenlijk pointers.RayNbow schreef op vrijdag 08 februari 2008 @ 11:37:
Wat je zei: "In Java wordt alles "call-by-reference" gedaan."
Wat je beschrijft: call by value
Tegenspraak?
C kent afaik geen references. C++ wel.
Als het byref zou zijn, dan zou toch een referentie naar de referentie worden doorgegeven aan de methode? 
Edit:
Ook maar wat linkjes toevoegen aan een post... Pass By Value, Please
Of de Java spec:
Edit:
Ook maar wat linkjes toevoegen aan een post... Pass By Value, Please
Of de Java spec:
When the method or constructor is invoked (§15.12), the values of the actual argument expressions initialize newly created parameter variables, each of the declared Type, before execution of the body of the method or constructor. The Identifier that appears in the DeclaratorId may be used as a simple name in the body of the method or constructor to refer to the formal parameter.
[ Voor 95% gewijzigd door RayNbow op 08-02-2008 12:08 ]
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
En hoe geef je dan ooit die referentie door? Weer by ref, ad infinitum?
Zelfs PHP, waar men aliases gebruikt, geeft uiteindelijk iets by-value door. Waarschijnlijk zal dat een pointer naar een character string zijn die gebruikt kan worden om in de hashmap de variabele op te zoeken.
Een referentie naar een referentie mag niet in C++. Dat is ook vaak een probleem bij template functies in de vorm "template <typename T> void foo(const T&);", want foo<Obj&> is illegal. Daarom heb je traits truckjes om die extra referentie te verwijderen. Meestal ziet dat er zo uit:
template <typename T> struct Trait {typedef typename T& ref_type;}
template <typename T&> struct Trait {typedef typename T ref_type;}
foo<Trait<Obj&>::ref_type>();
Maar dat terzijde.
Met pointers is het weer geen probleem: foo(void**).
Ik ben geen Java expert, maar wat ik me er van kan herinneren is dat alleen string literals by-value worden gepassed. Java kent volgens mij geen referentie type, dus het is vreemd om te zeggen dat referenties by-value worden gepassed. Maar dat is wel zo natuurlijk, uiteindelijk in de implementatie.
Zelfs PHP, waar men aliases gebruikt, geeft uiteindelijk iets by-value door. Waarschijnlijk zal dat een pointer naar een character string zijn die gebruikt kan worden om in de hashmap de variabele op te zoeken.
Een referentie naar een referentie mag niet in C++. Dat is ook vaak een probleem bij template functies in de vorm "template <typename T> void foo(const T&);", want foo<Obj&> is illegal. Daarom heb je traits truckjes om die extra referentie te verwijderen. Meestal ziet dat er zo uit:
template <typename T> struct Trait {typedef typename T& ref_type;}
template <typename T&> struct Trait {typedef typename T ref_type;}
foo<Trait<Obj&>::ref_type>();
Maar dat terzijde.
Met pointers is het weer geen probleem: foo(void**).
Ik ben geen Java expert, maar wat ik me er van kan herinneren is dat alleen string literals by-value worden gepassed. Java kent volgens mij geen referentie type, dus het is vreemd om te zeggen dat referenties by-value worden gepassed. Maar dat is wel zo natuurlijk, uiteindelijk in de implementatie.
Wat verwarrend is is dat jij die betekenis van true en false eraan hangt, terwijl niets dat vermoeden wekt. Waarom is succesvol volgens jou hetzelfde als true? Je zou de return-waarde ook kunnen interpreteren als "zijn er errors": 0 -> nee, iets anders -> ja. De definitie dat succesvol hetzelfde is als true is iets dat je zelf verzonnen hebt, en ja, dan is het idd verwarrendIceManX schreef op donderdag 07 februari 2008 @ 21:45:
[...]
Wel als je met processen werkt. Return waarde 0 is true (succesvol), al het andere is false (failure). Lekker verwarrend dus.
Waar de discussies over call-by-ref en call-by-value altijd mank op gaan is dat mensen vergeten te definieren over welk entiteit ze het nou precies hebben die gepassed wordt. Zo kun je stellen dat flowerp gelijk heeft als je het hebt over de variabelen - de variabelen worden gekopiëerd (dus call by value), en derhalve zijn de wijzigingen die een functie toepast op zijn parameters (primitieven en de referenties zelf - dus niet het object waarnaar gerefereerd wordt!) niet zichtbaar buiten die functie. Ook kun je stellen dat objecten in Java altijd by-ref gepassed worden. Is ook waar. Een wijziging aan het object zijn ook zichtbaar buiten de functie.Jrz schreef op vrijdag 08 februari 2008 @ 00:47:
[...]
Nee dat is niet helemaal juist
In Java wordt alles "call-by-reference" gedaan. Alleen wordt de reference gekopieerd.
Het kopieren is niet nodig als een parameter final is, omdat er dan compile errors komen als je je reference wil veranderen. Ik weet trouwens niet of JVMs het niet-kopieren optimizen eigenlijk.
Het is dus van belang erbij te zeggen waar je het over hebt - de variabelen, of de objecten waar die variabelen naar kunnen wijzen. Jij hebt iig sowieso geen gelijk, want wat je definitie ook is, bij primitieven als int en float worden nooit by-ref gepassed aangezien ze niet ergens naar wijzen.
Ik prefereer zelf de definitie dat het om de variabelen gaat. En volgens die definitie is alles in Java pass-by-value omdat een functie geen variabelen kan wijzigen in de aanroepende functie. Talen als PHP, C# en C++ ondersteunen wel pass-by-ref met speciale syntax.
Zoals gezegd kan het in Java niet, en in C# moet de functie het zelf bepalen. C# vereist wel dat je bij de aanroep vervolgens ook weer die 'ref' erbij zet, ter verduidelijking dat je by ref passed - dit is puur om fouten te voorkomen, je kunt niet by-ref passen naar een functie die by-value verwacht.Anoniem: 14829 schreef op donderdag 07 februari 2008 @ 20:32:
[...]
Da's puur afhankelijk van de taal die je gebruikt. Bij Delphi, en vroeger Clipper, bepaalt de functie zelf welke parameters by reference worden gebruikt, bij C#, Java, etc. is 't aan de routine die die functie aanroept. En voor beide is wat te zeggen...
[ Voor 19% gewijzigd door .oisyn op 08-02-2008 12:47 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Hulde.oisyn schreef op vrijdag 08 februari 2008 @ 12:41:
Waar de discussies over call-by-ref en call-by-value altijd mank op gaan is dat mensen vergeten te definieren over welk entiteit ze het nou precies hebben die gepassed wordt. Zo kun je stellen dat flowerp gelijk heeft als je het hebt over de variabelen - de variabelen worden gekopiëerd (dus call by value), en derhalve zijn de wijzigingen die een functie toepast op zijn parameters (primitieven en de referenties zelf - dus niet het object waarnaar gerefereerd wordt!) niet zichtbaar buiten die functie. Ook kun je stellen dat objecten in Java altijd by-ref gepassed worden. Is ook waar. Een wijziging aan het object zijn ook zichtbaar buiten de functie.
Ennnnnnnnnn laat losssssssss.... https://github.com/jrz/container-shell (instant container met chroot op current directory)
Zinloos artikel; schept alleen maar verwarring, en dan wordt het nog zo stellig gebracht, meerdere keren, in bold font... Java "is" niet pass-by-value, In Java worden objecten gepassed by-reference. Je passed een reference naar het object, pass-by-referenceRayNbow schreef op vrijdag 08 februari 2008 @ 12:01:
Edit:
Ook maar wat linkjes toevoegen aan een post... Pass By Value, Please
foo(const void* p) vs foo(void* const p)
De eerste is een niet constante pointer naar een constant object, en de tweede is een constante pointer naar een niet-constant object. Stel nu dat C++ altijd zou passen als "const void* p", mag je dan zeggen dat C++ niet constant-passing is, omdat 'p' niet constant is? Nee, natuurlijk niet. 'p' is gewoon je referentie die je passed, en wat p verder is doet er niet toe.
Had toenet een fout in mijn code, waar ik telkens overheen las.
wat ik moest hebben was
Visual Basic:
1
| textbox1.text = enable |
wat ik moest hebben was
Visual Basic:
1
| textbox1.enable = true |

offtopic:
Zie hier niet zo snel code tags staan, zou wel eens op zoek gaan hoe ik dat in dit bericht krijg Gevonden
Zie hier niet zo snel code tags staan, zou wel eens op zoek gaan hoe ik dat in dit bericht krijg Gevonden
Je voorbeeld is een beetje ongelukkig gekozen omdat het daar juist wel weer mag - de extra & wordt in het geval van template parameter substitution genegeerd, net als dubbele cv-qualifiersZoijar schreef op vrijdag 08 februari 2008 @ 12:34:
Een referentie naar een referentie mag niet in C++. Dat is ook vaak een probleem bij template functies in de vorm "template <typename T> void foo(const T&);", want foo<Obj&> is illegal. Daarom heb je traits truckjes om die extra referentie te verwijderen. Meestal ziet dat er zo uit:
template <typename T> struct Trait {typedef typename T& ref_type;}
template <typename T&> struct Trait {typedef typename T ref_type;}
foo<Trait<Obj&>::ref_type>();
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Tenzij enable in je eerste voorbeeld een string variable is zal het afaik niet eens compilen.Mijagis schreef op vrijdag 08 februari 2008 @ 12:54:
Had toenet een fout in mijn code, waar ik telkens overheen las.
Visual Basic:
1 textbox1.text = enable
wat ik moest hebben was
Visual Basic:
1 textbox1.enable = true
Heart..pumps blood.Has nothing to do with emotion! Bored
Hangt af van welke VB versieTeeDee schreef op vrijdag 08 februari 2008 @ 12:59:
[...]
Tenzij enable in je eerste voorbeeld een string variable is zal het afaik niet eens compilen.
VB6 vreet dat wel (zonder option explicit hoeft "enabled" niet eens gedefinieerd te zijn). En volgens mij VB.Net ook, tenzij je option strict aanzet.
[ Voor 13% gewijzigd door RobIII op 08-02-2008 14:10 ]
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
Hmm? Dit is gewoon een error: (en niet op de ++x, maar op het explicit template argument).oisyn schreef op vrijdag 08 februari 2008 @ 12:55:
[...]
Je voorbeeld is een beetje ongelukkig gekozen omdat het daar juist wel weer mag - de extra & wordt in het geval van template parameter substitution genegeerd, net als dubbele cv-qualifiers. Maar het gaat natuurlijk wel fout als je bijv. een T* gaat definieren of new T(); doet oid. Met T& is echter niets mis.
C++:
1
2
3
4
5
6
7
8
9
| template <typename T> inc(const T& x) { ++x; } int main(int argc, char* argv[]) { int x = 0; inc<int&>(x); return 0; } |
Hij wordt wel genegeerd in geval van template lookup en SFINAE.
[ Voor 4% gewijzigd door Zoijar op 08-02-2008 14:20 ]
Werkt prima in comeau hoor. Je moet inc nog wel even een return-type geven, en const T& veranderen in T& (anders mag de ++x niet
), maar verder geen errors.
[ Voor 9% gewijzigd door .oisyn op 08-02-2008 14:27 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
BleghRobIII schreef op vrijdag 08 februari 2008 @ 14:03:
[...]
Hangt af van welke VB versie
VB6 vreet dat wel (zonder option explicit hoeft "enabled" niet eens gedefinieerd te zijn). En volgens mij VB.Net ook, tenzij je option strict aanzet.
Heart..pumps blood.Has nothing to do with emotion! Bored
Oh, vaag, ik dacht dat dat niet mocht. zowel gcc 4.1.2 als VC++ pakken het niet. Ja, return type was ik vergeten, die const boeide hier niet echt omdat je template nooit geinstantieerd wordt als de substitutie niet legal is, maar je hebt gelijk..oisyn schreef op vrijdag 08 februari 2008 @ 14:26:
Werkt prima in comeau hoor. Je moet inc nog wel even een return-type geven, en const T& veranderen in T& (anders mag de ++x niet), maar verder geen errors.
VC zegt dat het explicite template argument illegal is, wat eigenlijk onzin is wan dan moet hij hem gewoon overslaan. GCC doet het iets beter en die zegt gewoon dat er geen matching function call voor inc(int&) is; de template wordt genegeerd wegens sfinae. Maar volgens comeau is het dus geen substitution failure?
Zie het ja, Comeau doet het goed vanaf versie 4.3.8. Daarvoor dezelfde melding als GCC. C++03 extensie?
[ Voor 6% gewijzigd door Zoijar op 08-02-2008 15:30 ]
Zou kunnen. Ik zit te bladeren door de standaard maar ik kan het niet vinden (misschien dat ik er overheen kijk, ik heb ook geen tijd/zin om het allemaal door te lezenC++03 extensie?
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Nee, dat doen alleen idioten.oisyn schreef op vrijdag 08 februari 2008 @ 15:36:
ik heb ook geen tijd/zin om het allemaal door te lezen).
Heb net een boek gekocht over de TR1; ik loop een beetje achter, met andere dingen bezig geweest...
Inderdaad. Zoals ik al zei, Java is in 1 lokale VM uitsluitend call-by-value. Dit is ook hoe de oorspronkelijke Java designer (James Gosling) en een bekende maker van de SUN SCJP exams (Bert Bates) het verteld..oisyn schreef op vrijdag 08 februari 2008 @ 12:41:
Ik prefereer zelf de definitie dat het om de variabelen gaat. En volgens die definitie is alles in Java pass-by-value omdat een functie geen variabelen kan wijzigen in de aanroepende functie. Talen als PHP, C# en C++ ondersteunen wel pass-by-ref met speciale syntax.
[...]
In plaat van een heel lang verhaal op te hangen, verwijs ik maar naar wat linkjes:
http://javadude.com/articles/passbyvalue.htm
http://caffeineinducedcod...ot-pass-by-reference.html
http://www.dzone.com/link..._not_passbyreference.html
2 quotes uit de laatste link:
Deze van de originele designer van Java:
En deze van Bert Bates, 1 van de mensen die verantwoordelijk is voor het opstellen van de examen stof voor het Sun examen over Java:The Java Programming Language, 2nd ed. by Ken Arnold and James Gosling. ISBN 0-201-31006-6. Section 2.6.1 Parameter Values. Page 40. Last two lines of 3rd paragraph clearly states:
"There is exactly one parameter passing mode in Java –pass by value- and that helps keep things simple"
Does Java use pass-by-value semantics?
If java passes objects by passing the reference variable instead, does that mean Java uses pass-by-reference for object? Not exactly, although you'll often hear and read that it does. Java is actually pass-by-value for all variables running within a single VM. [...]
It makes no difference if you're passing primitive or reference variables, you are always passing a copy of the bits in the variable. [...] if you're passing an object reference variable, you're passing a copy of the bits representing the reference to an object.
It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.
Het was met VB .net 2008. Ik had het zonder haken gedaan of iets (dyus geen string) en hij maakt geen foutRobIII schreef op vrijdag 08 februari 2008 @ 14:03:
[...]
Hangt af van welke VB versie
VB6 vreet dat wel (zonder option explicit hoeft "enabled" niet eens gedefinieerd te zijn). En volgens mij VB.Net ook, tenzij je option strict aanzet.

Degenen die na deze prima uitleg nog steeds geloven in call/pass-by-reference in Java nodig ik uit een void method te maken die twee references swapt (zodat na aanroep de eerste reference de waarde van de tweede heeft, en omgekeerd):flowerp schreef op zaterdag 09 februari 2008 @ 12:02:
[...]
Inderdaad. Zoals ik al zei, Java is in 1 lokale VM uitsluitend call-by-value. Dit is ook hoe de oorspronkelijke Java designer (James Gosling) en een bekende maker van de SUN SCJP exams (Bert Bates) het verteld.
code:
Succes! 1
2
3
4
5
6
7
| String a = "a"; String b = "b"; swap(a, b); System.out.println(a); System.out.println(b); public abstract void swap(Object refA, Object refB); |
[ Voor 5% gewijzigd door Herko_ter_Horst op 11-02-2008 09:55 ]
"Any sufficiently advanced technology is indistinguishable from magic."
string is altijd al een raar voorbeeld geweest, maar hier krijg ik het bvolgende:
uitvoer:
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
| private void swap(Object o1, Object o2) { Object temp = o1; o1 = o2; o2 = temp; } public void testString() { System.out.println("testString()"); String a = "a"; String b = "b"; System.out.println("a=" + a); System.out.println("b=" + b); swap(a, b); System.out.println("a=" + a); System.out.println("b=" + b); } public void testObject() { System.out.println("testObject()"); Object a = new Object() { public String toString() { return "a"; } }; Object b = new Object() { public String toString() { return "b"; } }; System.out.println("a=" + a); System.out.println("b=" + b); swap(a, b); System.out.println("a=" + a); System.out.println("b=" + b); } |
uitvoer:
code:
1
2
3
4
5
6
7
8
9
10
| testString() a=a b=b a=a b=b testObject() a=a b=b a=a b=b |
[ Voor 4% gewijzigd door Salandur op 11-02-2008 10:22 ]
Assumptions are the mother of all fuck ups | iRacing Profiel
Anoniem: 147329
Java is gewoon altijd pass-by-value, het is altijd een kopie van een primitieve var of een reference van een object. binnen de method kan je dus mbt de kopie van een refrence naar een object wel een object aanpassen, maar je kan idd geen swap() dingen doen
Oftewel: je kunt de references zelf niet manipuleren. Dat was ook meteen het punt: als het call-by-reference was geweest, had je dat wel kunnen doen. Als je String "raar" vindt, mag je het ook met een willekeurige andere class proberen, of zelfs met integers, naar analogie van de C++ swap functie:Salandur schreef op maandag 11 februari 2008 @ 10:22:
string is altijd al een raar voorbeeld geweest, maar hier krijg ik het bvolgende:
code:
1
2
3
4
5
6
7
| void swap(int &numA, int &numB) { int temp; temp = numA; numA = numB; numB = temp; } |
Lukt je ook niet. Oftewel: Java heeft geen pass-by-reference semantiek.
Wat uiteraard wél kan is een reference dereferencen (d.m.v. de . operator) en vervolgens het gerefereerde object manipuleren (indien het object dat toestaat; String is immutable). Andere references naar datzelfde object zullen dat soort manipulaties uiteraard wel "zien".
"Any sufficiently advanced technology is indistinguishable from magic."
Mag je ook gebruik maken van JNI?String is immutable
[ Voor 27% gewijzigd door .oisyn op 11-02-2008 11:27 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
En de reden waarom basic SCJP kennis zo breed wordt uitgemeten in dit topic is
Beetje reflection is al genoeg hoor:
Java:
Resultaat: axc.
1
2
3
4
5
6
| String s = "abc"; Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[])field.get(s); value[1] = 'x'; System.out.println(s); |
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Grappig voorbeeld. Hiermee kun je overigens de staat van je programma aardig verknoeien, bekijk dit maar eens:IceManX schreef op maandag 11 februari 2008 @ 11:37:
[...]
Beetje reflection is al genoeg hoor:
Java:Resultaat: axc.
1 2 3 4 5 6 String s = "abc"; Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[])field.get(s); value[1] = 'x'; System.out.println(s);
Java:
1
2
3
4
5
6
7
8
| String s = "abc"; String t = "abc"; Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[])field.get(s); value[1] = 'x'; System.out.println("s = " + s); System.out.println("t = " + t); |
Resultaat:
s = axc
t = axc
Binnen de JVM worden bestaande strings namelijk hergebruikt, tenzij je String s = new String("blabla") toepast.
TouchéIceManX schreef op maandag 11 februari 2008 @ 11:37:
[...]
Beetje reflection is al genoeg hoor:
Java:Resultaat: axc.
1 2 3 4 5 6 String s = "abc"; Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[])field.get(s); value[1] = 'x'; System.out.println(s);
Dan krijg je een andere String reference, maar je voorbeeld behoudt hetzelfde resultaat.Boktor schreef op maandag 11 februari 2008 @ 12:23:
Binnen de JVM worden bestaande strings namelijk hergebruikt, tenzij je String s = new String("blabla") toepast.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Strings gebruiken zoveel mogelijk hetzelfde char array. new String(), substring en nog een aantal anderen delen het char array, het enige dat hooguit verandert zijn 2 andere fields: offset en length (oid), die aangeven waar in het array te beginnen en tot hoever door te gaan.
Out of the box mag het gewoon, maar je kan het geloof ik wel met SecurityManagers tegenhouden. Dan kun je alleen nog maar public (en mss protected) velden aanspreken..oisyn schreef op maandag 11 februari 2008 @ 13:10:
[...]
Touché. Mag dit trouwens altijd, of heb je daar bepaalde rechten voor nodig?
[ Voor 40% gewijzigd door Robtimus op 11-02-2008 20:35 ]
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Inderdaad, zo simpel is het nu eigenlijk. Het is best apart dat er over iets wat toch wel erg basic is toch nog zoveel verwarring is.Herko_ter_Horst schreef op maandag 11 februari 2008 @ 11:00:
Oftewel: je kunt de references zelf niet manipuleren. Dat was ook meteen het punt: als het call-by-reference was geweest, had je dat wel kunnen doen.
[...]
Lukt je ook niet. Oftewel: Java heeft geen pass-by-reference semantiek.
Het is natuurlijk niet de bedoeling om call-by-reference hier uitgebreid te gaan bespreken, maar je ziet altijd dat aan de hand van slechte programmeer voorbeelden even een discussie ontstaat. Alleen maar stukjes slechte code neerplempen is ook niet bijster interessant tochFallenAngel666 schreef op maandag 11 februari 2008 @ 11:29:
En de reden waarom basic SCJP kennis zo breed wordt uitgemeten in dit topic is
Je hebt gelijk, dat java binnen 1 VM alleen call-by-value is, is basic SCJP kennis. Maar zoals vele andere dingen in dit topic gaat het dikwijls juist fout door het ontbreken of het niet helemaal doorgronden van basis kennis. Veel 'rare' stukjes code die je in het wild tegenkomt komen hier uit voor. B.v. een bizarre if/else constructie, omdat de programmeur ervan gewoon niet wist dat er een logische NOT operator bestaat.
Zo zie je inderdaad in Java af en toe vreemde code constructies, omdat men simpelweg niet het verschil begrijpt tussen call-by-reference en een reference call-by-value doorgeven. Dan zie je code als:
Java:
1
2
3
4
5
6
7
8
| public void test(Foo foo) { // do Foo stuff if ( foo.isClosed() ) { foo = null; // make eligible for GC } } |
Even daar gelaten dat het dikwijls al slechte code is als dit zou werken via call-by-reference, werkt het in Java dus niet. Omdat sommigen altijd maar (ten onrechte dus) roepen dat java call-by-reference is, is dit voor mensen die niet dagelijks in Java programmeren erg verwarrend als blijkt dat zoiets niet werkt. Andersom werkt het leaks in de hand; mensen die denken met call-by-reference te werken, terwijl ze alleen een lokale kopie van een pointer hebben.
Als anekdote: een poosje geleden heb ik eens een code base nagelopen die bol stond van dergelijke constructies. In het begin had men weinig gebruikers, dus de aanwezige leaks vielen niet op. Pas toen de code veel meer gebruikt ging worden kwamen de problemen, maar toen was men al zo'n 30.000 regels code verder. Even babbelen met de programmeurs op dat project en het bleek dat men inderdaad dacht dat Java call-by-reference was.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.
Een subtiele bijkomstigheid is daarbij dat de backing char array gedeeld kan worden, maar dat het String Object zelf wel een nieuw String Object is. Bij het gebruik van String literals of interned Strings wordt ook het String Object zelf gedeeld, net als bij een substring die precies de hele String beslaat.IceManX schreef op maandag 11 februari 2008 @ 20:34:
Strings gebruiken zoveel mogelijk hetzelfde char array. new String(), substring en nog een aantal anderen delen het char array
Het volgende fragment laat dit leuk zien. Rara, wat is de output?
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| String a = "abc"; // abc String b = "abc"; // abc String c = b.substring(0); // abc String d = "abcd".substring(0,3); // abc String e = d.intern(); // abc System.out.println( a == b && a == c && a == e ); System.out.println( a != d); String f = a.substring(0,1); // a Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value1 = (char[])field.get(a); char[] value2 = (char[])field.get(f); System.out.println(value1 == value2); |
(voor de gene die java niet zo goed kennen: == en != vergelijkt alleen de value van de pointer zelf, niet de value van de String)
[ Voor 40% gewijzigd door flowerp op 11-02-2008 22:47 ]
It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.
spoiler:
true, true, true
En niet geprobeerd want ik heb een nieuwe windows installe en heb de JDK nog niet geinstalleerd
[ Voor 64% gewijzigd door .oisyn op 11-02-2008 23:04 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
.oisyn schreef op maandag 11 februari 2008 @ 23:03:
spoiler:true, true, true
En niet geprobeerd want ik heb een nieuwe windows installe en heb de JDK nog niet geinstalleerd
spoiler:
Bingo!
(kon natuurlijk ook niet missen als je de toelichtig las
)
It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.
Ik dacht dat ook, maar heb het toch voor de zekerheid even uitgeprobeerd...
spoiler:
en het klopt, alles is waar
- Literal strings within the same class (§8) in the same package (§7) represent references to the same String object (§4.3.1).
- Literal strings within different classes in the same package represent references to the same String object.
- Literal strings within different classes in different packages likewise represent references to the same String object.
- Strings computed by constant expressions (§15.28) are computed at compile time and then treated as if they were literals.
- Strings computed at run time are newly created and therefore distinct.
- The result of explicitly interning a computed string is the same string as any pre-existing literal string with the same contents.
Maar dat wist ik alkon natuurlijk ook niet missen als je de toelichtig las
.edit: Ah, de post van Marcj geeft het al een beetje aan. a.substring() is geen constant expression en daarom distinct.
[ Voor 33% gewijzigd door .oisyn op 11-02-2008 23:31 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
De substring maakt juist slim gebruik van de huidige char array die al in de oude String zat. Dat zal meestal efficienter zijn. Die nieuwe String is dus een "view" op de oude.oisyn schreef op maandag 11 februari 2008 @ 23:27:
[...]
Maar dat wist ik al. Ik zat even te twijfelen over de a == d, een slimme compiler zou dat natuurlijk al weg kunnen optimizen, hoewel ik niet weet hoe strict Java daarin is (bijv: de compiler mag het niet optimizen, of: de implementatie van String.substring() is dermate gedefinieerd dat hij in dit geval altijd een uniek String object terug moet geven)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
| public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } if (endIndex > count) { throw new StringIndexOutOfBoundsException(endIndex); } if (beginIndex > endIndex) { throw new StringIndexOutOfBoundsException(endIndex - beginIndex); } return ((beginIndex == 0) && (endIndex == count)) ? this : new String(offset + beginIndex, endIndex - beginIndex, value); } |
Het ging niet om de char buffer in de String, het ging om de string zelf
.
[ Voor 35% gewijzigd door .oisyn op 11-02-2008 23:51 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Mierenneuken: Dat is de implementatie van Sun JDK 6Marcj schreef op maandag 11 februari 2008 @ 23:33:
De implementatie van Java 6:
Ik moet eigenlijk nog eens goed nalezen hoe het nu officieel omschreven staat, maar als ik het goed begrepen heb mag de '1st level' compiler (java->bytecode) voor een Java implementatie niet al te slim zijn. De '2nd level' compiler (bytecode->native) is de plek waar al de zeer slimme optimalisaties plaats kunnen vinden. Ik kan me voorstellen (maar weet dit niet met zekerheid) dat een pointer in Java een dergelijk high-level ding is, dat a != d in bovenstaande code gegarandeerd, maar kunstmatig op true gehouden wordt, ondanks dat onderliggend de 2nd level compiler er al lang al voor heeft gezorgd dat a en d intern wel degelijk gelijk zijn..oisyn schreef op maandag 11 februari 2008 @ 23:27:
Maar dat wist ik al. Ik zat even te twijfelen over de a != d, een slimme compiler zou dat natuurlijk al weg kunnen optimizen
It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.
Waarom VB m'n kont kan kussen, deel 32662:
Moet ik wat VB.NET code aanpassen, denk ik null-waarden uit de DB slim af te vangen met de VB.NET variant op de ternary operator:
M.a.w.: als de waarde in de DB geen null is, casten naar date en die waarde toekennen, anders slechts DBNull toekennen.
Wat blijkt nou, VB.NET evalueert om de een of andere reden zowel de true- als de false-expression. WTF?
Moet ik wat VB.NET code aanpassen, denk ik null-waarden uit de DB slim af te vangen met de VB.NET variant op de ternary operator:
Visual Basic .NET:
1
| myDataReader(1) = IIf(Not myResultReader("Fieldname") Is DBNull.Value, CDate(myResultReader("Fieldname")), DBNull.Value) |
M.a.w.: als de waarde in de DB geen null is, casten naar date en die waarde toekennen, anders slechts DBNull toekennen.
Wat blijkt nou, VB.NET evalueert om de een of andere reden zowel de true- als de false-expression. WTF?
Certified smart block developer op de agile darkchain stack. PM voor info.
Hmm ja, je hebt gelijk.oisyn schreef op maandag 11 februari 2008 @ 13:10:
...
Dan krijg je een andere String reference, maar je voorbeeld behoudt hetzelfde resultaat.
Java:
1
2
3
4
5
6
| String a = "abc"; String b = "abc"; String c = new String("abc"); System.out.println(a == b); System.out.println(b == c); |
code:
1
2
| true false |
edit
whoops, ik zie dat dit voorbeeld een paar posts eerder ook al langs is gekomen
[ Voor 9% gewijzigd door JeroenTheStig op 12-02-2008 10:47 ]
Het is ook geen ternary operator maar een functie (een method van de Microsoft.VisualBasic.Interaction class om precies te zijn).Not Pingu schreef op dinsdag 12 februari 2008 @ 10:39:
Wat blijkt nou, VB.NET evalueert om de een of andere reden zowel de true- als de false-expression. WTF?
[ Voor 12% gewijzigd door .oisyn op 12-02-2008 10:46 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Dat weet ik, daarom zei ik ook: "de VB.NET variant op de ternary operator", waarmee ik niet beweer dat IIf zelf ook een ternary operator is..oisyn schreef op dinsdag 12 februari 2008 @ 10:43:
[...]
Het is ook geen ternary operator maar een functie (een method van de Microsoft.VisualBasic.Interaction class om precies te zijn).
Maar juist omdat het een functie is (VB.NET kent geen shortcut evaluation in expressies), verwacht je dat ie de True- en False-parameters onafhankelijk van elkaar kan afvuren.
Certified smart block developer op de agile darkchain stack. PM voor info.
Juist als het een functie is, verwacht je toch dat hij alle parameters evalueert voor hij de functie aanroept?
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Wel hoor. Mbv AndAlso en OrElse. En het heet trouwens short-circuit, niet shortcutNot Pingu schreef op dinsdag 12 februari 2008 @ 11:18:
(VB.NET kent geen shortcut evaluation in expressies)
Wat kenneth zegt, en bovendien klopt wat je zegt ook niet. De 'true' en 'false' parameters zijn sowieso onafhankelijk van elkaar. Wat je bedoelt is dat ze afhankelijk van de 'expression' parameter moeten zijn, maar uiteraard zijn ze onafhankelijk - de functie verwacht 3 parameters, dus moeten ze alle 3 geëvalueerd worden voordat de functie aangeroepen kan worden. De functie retourneert vervolgens simpelweg de true parameter of de false parameter, afhankelijk van of 'expression' true of false is. Die doet dus zelf geen evaluatie meer.Maar juist omdat het een functie is [...], verwacht je dat ie de True- en False-parameters onafhankelijk van elkaar kan afvuren.
[ Voor 3% gewijzigd door .oisyn op 12-02-2008 11:56 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ok, geschreven in c#, but you get the ideaHerko_ter_Horst schreef op maandag 11 februari 2008 @ 09:53:
[...]
Degenen die na deze prima uitleg nog steeds geloven in call/pass-by-reference in Java nodig ik uit een void method te maken die twee references swapt (zodat na aanroep de eerste reference de waarde van de tweede heeft, en omgekeerd):code:Succes!
1 2 3 4 5 6 7 String a = "a"; String b = "b"; swap(a, b); System.out.println(a); System.out.println(b); public abstract void swap(Object refA, Object refB);
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
| class ByRef { public string value; public override string ToString() { return value; } } class Program { static void Main(string[] args) { ByRef a = new ByRef(); a.value = "a"; ByRef b = new ByRef(); b.value = "b"; Swap(a, b); Console.WriteLine(a); Console.WriteLine(b); } static void Swap(ByRef a, ByRef b) { string t = a.value; a.value = b.value; b.value = t; } } |
Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack
Ja, maar de references a en b zijn niet omgedraait, alleen de inhoud.
ps. Het kan wel in C# volgens mij.
ps. Het kan wel in C# volgens mij.
C#:
1
2
3
4
5
| public static void swap(ref String a, ref String b) { String t = a; a = b; b = t; } |
Het lijkt me dat veel vb.net code hierdoor toch trager of minder geoptimaliseerd is dan bijv c#, omdat de meeste programmeurs gewoon And/Or zullen gebruiken? Short-circuit is toch wel zeer handig.oisyn schreef op dinsdag 12 februari 2008 @ 11:49:
[...]
Wel hoor. Mbv AndAlso en OrElse. En het heet trouwens short-circuit, niet shortcut
In C# kan het inderdaad wel, maar dat gaat ook voorbij aan de discussie. Ik heb het alleen in C# gedaan omdat ik geen Java tot mijn beschikking heb.Marcj schreef op dinsdag 12 februari 2008 @ 15:18:
Ja, maar de references a en b zijn niet omgedraait, alleen de inhoud.
ps. Het kan wel in C# volgens mij.
C#:
1 2 3 4 5 public static void swap(ref String a, ref String b) { String t = a; a = b; b = t; }
Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack
Zou kunnen. Maar een goede programmeur weet natuurlijk ook gewoon dat de standaard AND en OR niet short-circuiten, waardoor je IFs gaat gebruiken als de performance in het geding is. Aan de andere kant zullen performance-applicaties in eerste instantie natuurlijk sowieso niet in VB gemaakt wordenJanDM schreef op dinsdag 12 februari 2008 @ 15:39:
[...]
Het lijkt me dat veel vb.net code hierdoor toch trager of minder geoptimaliseerd is dan bijv c#, omdat de meeste programmeurs gewoon And/Or zullen gebruiken? Short-circuit is toch wel zeer handig
Al met al denk ik dat het voor de gemiddelde VB.Net app wel meevalt. Tenzij je de hele tijd dure functies aan zit te roepen aan de rechterkant van een AND of OR zal het wel loslopen
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Psst: TeeDee in "[Alg] Slechtste programmeervoorbeelden d..."Marcj schreef op dinsdag 12 februari 2008 @ 15:18:
Ja, maar de references a en b zijn niet omgedraait, alleen de inhoud.
ps. Het kan wel in C# volgens mij.
C#:
1 2 3 4 5 public static void swap(ref String a, ref String b) { String t = a; a = b; b = t; }
Heart..pumps blood.Has nothing to do with emotion! Bored
Zie je wel ook het verschil in code dan en waarom die van hem het wél doet?
Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack
Yup, (lees de spoilerriezebosch schreef op dinsdag 12 februari 2008 @ 17:04:
[...]
Zie je wel ook het verschil in code dan en waarom die van hem het wél doet?
Heart..pumps blood.Has nothing to do with emotion! Bored
Dit topic is gesloten.
Let op:
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.
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.
