[Alg] Slechtste programmeervoorbeelden deel 3 Vorige deel Overzicht Volgende deel Laatste deel

Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.

Pagina: 1 ... 4 ... 11 Laatste
Acties:
  • 70.928 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

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.
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.

Acties:
  • 0 Henk 'm!

  • Marcj
  • Registratie: November 2000
  • Laatst online: 16:53
MBV 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 :P). Iets zegt mij dat er hier wat anders aan de hand is...
Kun je dan niet beter een condition aan een breakpoint hangen? Het gevaar is natuurlijk dat je vergeet dat soort code te verwijderen :)

Acties:
  • 0 Henk 'm!

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):
mijnmail.com says:
while(!1stedocent(naarkeuze).isAkkoord || !2dedocent(naarkeuze).isAkkoord)
{
stuurmandaat(1stedocent)
stuurmandaat(2dedocent)
}
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 :+

[ Voor 4% gewijzigd door Anoniem: 140111 op 05-02-2008 12:53 ]


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 18-04 14:27
Afbeeldingslocatie: http://www.xerson.nl/ubbsmileys/huillach_schater.gif

Acties:
  • 0 Henk 'm!

Anoniem: 84120

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 :+
Eerste was ik dacht: StudentDocentarray... *ja vakantie heb ik al weer een paar dagen... *schaam**

Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 19:29
(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.

Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 24-03 10:59
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?)

[ Voor 198% gewijzigd door g4wx3 op 07-02-2008 03:28 . Reden: opmaak ]

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

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;
}
....
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 . ???
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?)
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).

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Nu online

RayNbow

Kirika <3

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).
In JavaScript kan de waarde 0 gebruikt worden voor false:
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


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 25-04 11:37
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.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
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 . ???
-> werkt op een pointer, vergelijk:
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 ]


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

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.

Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 15:44
AtleX 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.
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 aanpak

[ Voor 3% gewijzigd door Webgnome op 07-02-2008 10:56 ]

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

Anoniem: 37526

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.
Je bent er van op de hoogte dat True en False niet meer is dan een maskertje voor 1 en 0?

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
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?
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.

[ Voor 4% gewijzigd door bigbeng op 07-02-2008 11:17 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.
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.
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?
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.
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.

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.


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
.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?
I stand corrected :o
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 :P

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Als ik het mij goed herinner (en het was voor C99 bestond, dus lang geleden :P), 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 :D

Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 18-04 14:27
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();
        }


:D :+

Acties:
  • 0 Henk 'm!

Anoniem: 37526

.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.
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.

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 07:35

Salandur

Software Engineer

Anoniem: 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.
helemaal waar :P

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Anoniem: 37526 schreef op donderdag 07 februari 2008 @ 15:09:
en daar waar ik altijd zelf TRUE en FALSE aan 0 en 1 hang
Respectievelijk? ;)

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.


Acties:
  • 0 Henk 'm!

  • sjons
  • Registratie: Juli 2006
  • Laatst online: 12-05 22:20
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).
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...)

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:23

TeeDee

CQB 241

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?


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


Acties:
  • 0 Henk 'm!

Anoniem: 33810

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?
Ja, op die fiets is "4" ook een maskertje voor 0100 :P.

Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Nu online

RayNbow

Kirika <3

Ach, what is Truth? :+

(uit de oude doos)

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 16:46
.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).
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 ;)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.


Acties:
  • 0 Henk 'm!

Anoniem: 33810

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 ;)
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 ?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.
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.

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.


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:23

TeeDee

CQB 241

.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.
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;


staat inderdaad een beetje lomp in de spoilert

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


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
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 ?
1 == true levert true op.
PHP bool.

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

Anoniem: 14829

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;
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... :)

Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 18-04 14:27
TeeDee 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?
Het feit dat ik de methodes via reflection aanroep ipv de methodes van instanties aan te roepen (omslachtig dus ;))

Acties:
  • 0 Henk 'm!

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

Robtimus

me Robtimus no like you

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


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 25-04 11:37
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).

Acties:
  • 0 Henk 'm!

Anoniem: 14829

YopY, de meeste databases hebben niet eens een boolean veldtype...

Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Nu online

RayNbow

Kirika <3

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.
Ik stel voor om true en false te schrijven als (λt f . t) en (λt f . f) :Y)

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 12:57

Kwastie

Awesomeness

Anoniem: 14829 schreef op donderdag 07 februari 2008 @ 22:13:
YopY, de meeste databases hebben niet eens een boolean veldtype...
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.

When I get sad i stop being sad and be awesome instead


Acties:
  • 0 Henk 'm!

  • flowerp
  • Registratie: September 2003
  • Laatst online: 27-02 15:21
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.
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.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


Acties:
  • 0 Henk 'm!

Anoniem: 33810

Kwastie 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.
Uhm, en een ENUM (enummeratie; 0 en 1) is dan niet raar :?

Acties:
  • 0 Henk 'm!

  • Jrz
  • Registratie: Mei 2000
  • Laatst online: 16:15

Jrz

––––––––––––

flowerp 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.
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.

Ennnnnnnnnn laat losssssssss.... https://github.com/jrz/container-shell (instant container met chroot op current directory)


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Nu online

RayNbow

Kirika <3

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


Acties:
  • 0 Henk 'm!

  • Jrz
  • Registratie: Mei 2000
  • Laatst online: 16:15

Jrz

––––––––––––

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 == ?
x is nog steeds foo. Precies zoals ik zei.

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)


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 16:46
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 ?
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.

* 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 :/

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

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).
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.

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Dit was wel een mooie loop :D

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++;
                    }
                }
            }
        }

Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Nu online

RayNbow

Kirika <3

Jrz schreef op vrijdag 08 februari 2008 @ 09:34:
[...]

x is nog steeds foo. Precies zoals ik zei.
Wat je zei: "In Java wordt alles "call-by-reference" gedaan."
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.
Wat je beschrijft: call by value

Tegenspraak? ;)
In C:
doSomething(Foo f)
doSomething(Foo *f)
doSomething(Foo &f)
C kent afaik geen references. C++ wel.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

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.
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.

Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Nu online

RayNbow

Kirika <3

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:
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


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

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.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

IceManX 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.
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 verwarrend :).
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.
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.

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.
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... :)
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.

[ 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.


Acties:
  • 0 Henk 'm!

  • Jrz
  • Registratie: Mei 2000
  • Laatst online: 16:15

Jrz

––––––––––––

.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.
Hulde }:O

Ennnnnnnnnn laat losssssssss.... https://github.com/jrz/container-shell (instant container met chroot op current directory)


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

RayNbow schreef op vrijdag 08 februari 2008 @ 12:01:
Edit:
Ook maar wat linkjes toevoegen aan een post... Pass By Value, Please
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-reference :) Dat is de hele definitie. Dat mensen niet begrijpen wat het betekent wil niet zeggen dat het niet zo is ;) In C++ heb je met pointers ook nog een mooi onderscheid:

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.

Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 14-05 12:46
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


:X

offtopic:
Zie hier niet zo snel code tags staan, zou wel eens op zoek gaan hoe ik dat in dit bericht krijg Gevonden ;)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoijar 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>();
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.

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.


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:23

TeeDee

CQB 241

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
Tenzij enable in je eerste voorbeeld een string variable is zal het afaik niet eens compilen.

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


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 16:44

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

TeeDee schreef op vrijdag 08 februari 2008 @ 12:59:
[...]

Tenzij enable in je eerste voorbeeld een string variable is zal het afaik niet eens compilen.
Hangt af van welke VB versie :P
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


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

.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.
Hmm? Dit is gewoon een error: (en niet op de ++x, maar op het explicit template argument)

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 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:23

TeeDee

CQB 241

RobIII schreef op vrijdag 08 februari 2008 @ 14:03:
[...]

Hangt af van welke VB versie :P
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.
Blegh :P, wie werkt er dan ook zonder option explicit/strict ;)

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


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

.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.
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.

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 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

C++03 extensie?
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 lezen :P).

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.


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

.oisyn schreef op vrijdag 08 februari 2008 @ 15:36:
ik heb ook geen tijd/zin om het allemaal door te lezen :P).
Nee, dat doen alleen idioten ;) hehe

Heb net een boek gekocht over de TR1; ik loop een beetje achter, met andere dingen bezig geweest...

Acties:
  • 0 Henk 'm!

  • flowerp
  • Registratie: September 2003
  • Laatst online: 27-02 15:21
.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.
[...]
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.

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:
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"
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:
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.


Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 14-05 12:46
RobIII schreef op vrijdag 08 februari 2008 @ 14:03:
[...]

Hangt af van welke VB versie :P
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.
Het was met VB .net 2008. Ik had het zonder haken gedaan of iets (dyus geen string) en hij maakt geen fout 8)7

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
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.
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:
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);
Succes! :D

[ Voor 5% gewijzigd door Herko_ter_Horst op 11-02-2008 09:55 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 07:35

Salandur

Software Engineer

string is altijd al een raar voorbeeld geweest, maar hier krijg ik het bvolgende:
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


Acties:
  • 0 Henk 'm!

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

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Salandur schreef op maandag 11 februari 2008 @ 10:22:
string is altijd al een raar voorbeeld geweest, maar hier krijg ik het bvolgende:
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:
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."


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

String is immutable
Mag je ook gebruik maken van JNI? :+

[ 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.


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 11:53
En de reden waarom basic SCJP kennis zo breed wordt uitgemeten in dit topic is :?

Acties:
  • 0 Henk 'm!

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

Robtimus

me Robtimus no like you

.oisyn schreef op maandag 11 februari 2008 @ 11:26:
[...]

Mag je ook gebruik maken van JNI? :+
Beetje reflection is al genoeg hoor:
Java:
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);
Resultaat: axc.

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


Acties:
  • 0 Henk 'm!

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 14:28
IceManX schreef op maandag 11 februari 2008 @ 11:37:
[...]
Beetje reflection is al genoeg hoor:
Java:
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);
Resultaat: axc.
Grappig voorbeeld. Hiermee kun je overigens de staat van je programma aardig verknoeien, bekijk dit maar eens:

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.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

IceManX schreef op maandag 11 februari 2008 @ 11:37:
[...]
Beetje reflection is al genoeg hoor:
Java:
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);
Resultaat: axc.
Touché :). Mag dit trouwens altijd, of heb je daar bepaalde rechten voor nodig?
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.
Dan krijg je een andere String reference, maar je voorbeeld behoudt hetzelfde resultaat.

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.


Acties:
  • 0 Henk 'm!

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

Robtimus

me Robtimus no like you

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.
.oisyn schreef op maandag 11 februari 2008 @ 13:10:
[...]

Touché :). Mag dit trouwens altijd, of heb je daar bepaalde rechten voor nodig?
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.

[ 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


Acties:
  • 0 Henk 'm!

  • flowerp
  • Registratie: September 2003
  • Laatst online: 27-02 15:21
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.
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.
FallenAngel666 schreef op maandag 11 februari 2008 @ 11:29:
En de reden waarom basic SCJP kennis zo breed wordt uitgemeten in dit topic is :?
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 toch ;)

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. 8)7

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


Acties:
  • 0 Henk 'm!

  • flowerp
  • Registratie: September 2003
  • Laatst online: 27-02 15:21
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
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.

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.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

spoiler:
true, true, true

En niet geprobeerd want ik heb een nieuwe windows installe en heb de JDK nog niet geinstalleerd :P

[ 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.


Acties:
  • 0 Henk 'm!

  • flowerp
  • Registratie: September 2003
  • Laatst online: 27-02 15:21
.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 :P
spoiler:
Bingo! :D (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.


Acties:
  • 0 Henk 'm!

  • Marcj
  • Registratie: November 2000
  • Laatst online: 16:53
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.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

kon natuurlijk ook niet missen als je de toelichtig las
Maar dat wist ik al :P. 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)

.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.


Acties:
  • 0 Henk 'm!

  • Marcj
  • Registratie: November 2000
  • Laatst online: 16:53
.oisyn schreef op maandag 11 februari 2008 @ 23:27:
[...]

Maar dat wist ik al :P. 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)
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 :). De implementatie van Java 6:

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);
}

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.


Acties:
  • 0 Henk 'm!

  • flowerp
  • Registratie: September 2003
  • Laatst online: 27-02 15:21
Mierenneuken: Dat is de implementatie van Sun JDK 6 ;) Java 6 zelf is alleen een spec ;)
.oisyn schreef op maandag 11 februari 2008 @ 23:27:
Maar dat wist ik al :P. Ik zat even te twijfelen over de a != d, een slimme compiler zou dat natuurlijk al weg kunnen optimizen
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.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


Acties:
  • 0 Henk 'm!

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 09-02 20:11

Not Pingu

Dumbass ex machina

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:
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.


Acties:
  • 0 Henk 'm!

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 14:28
.oisyn schreef op maandag 11 februari 2008 @ 13:10:
...

Dan krijg je een andere String reference, maar je voorbeeld behoudt hetzelfde resultaat.
Hmm ja, je hebt gelijk :) Ik verwarde het met onderstaand voorbeeld:

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 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

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?
Het is ook geen ternary operator maar een functie (een method van de Microsoft.VisualBasic.Interaction class om precies te zijn).

[ 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.


Acties:
  • 0 Henk 'm!

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 09-02 20:11

Not Pingu

Dumbass ex machina

.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).
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.

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.


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

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.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Not Pingu schreef op dinsdag 12 februari 2008 @ 11:18:
(VB.NET kent geen shortcut evaluation in expressies)
Wel hoor. Mbv AndAlso en OrElse. En het heet trouwens short-circuit, niet shortcut ;)
Maar juist omdat het een functie is [...], verwacht je dat ie de True- en False-parameters onafhankelijk van elkaar kan afvuren.
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.

[ 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.


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-04 16:18
Herko_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:
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);
Succes! :D
Ok, geschreven in c#, but you get the idea :P
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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


Acties:
  • 0 Henk 'm!

  • Marcj
  • Registratie: November 2000
  • Laatst online: 16:53
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;
}

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
.oisyn schreef op dinsdag 12 februari 2008 @ 11:49:
[...]

Wel hoor. Mbv AndAlso en OrElse. En het heet trouwens short-circuit, niet shortcut ;)
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 :)

Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-04 16:18
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;
}
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.

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


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

JanDM 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 :)
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 worden ;).

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.


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:23

TeeDee

CQB 241

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;
}
Psst: TeeDee in "[Alg] Slechtste programmeervoorbeelden d..."

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


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-04 16:18
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


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:23

TeeDee

CQB 241

riezebosch 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?
Yup, (lees de spoiler :))

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

Pagina: 1 ... 4 ... 11 Laatste

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. :)