Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

I Nemiver (frontend til gdb) får jeg ikke opp noen av verdiene (int member) i foo. Er dette mulig å få til på noen måte?

 

Du må caste det til child-typen den er for at du skal gjøre det.
Om du kompilerer med RTTI (default) kan du benytte dynamic_cast til å caste fra base til child. Om du ikke har den child-classen du tror får du NULL.

 

 

struct BaseClass
{
};
 
struct ChildClass : public BaseClass
{
int ChildMember;
};
 
int main()
{
ChildClass cc;
cc.ChildMember = 666;
BaseClass *bc = &cc;
return 0;
}
 

(gdb) print *bc
$1 = {<No data fields>}
(gdb) print *static_cast<ChildClass *>(bc)
$2 = {<BaseClass> = {<No data fields>}, ChildMember = 666}

Lenke til kommentar
Videoannonse
Annonse

Og for øvrig synes jeg svarene deres er dårlige. Fordi dere prater om språket C++. Jeg er klar over hvordan det fungerer. Greia er at når jeg debugger så forventer jeg å kunne se "mer". Det er "litt" av poenget med en debugger at man kan gjøre mer enn man kan gjøre i selve språket, eller så hadde man ikke trengt en debugger. Da kunne man bare spredt printf() litt rundt omkring.

Det kan du om du caster.

 

 

Men når jeg debugger programmet steg for sted så vet jeg at det ikke er sånn.

Se over, du kan caste.

 

 

 

Du kan vel alltids caste ned

Det er nettopp det jeg ikke kan. Om jeg legger inn en std::cout med cast i programmet så funker det, men det funker ikke i debuggeren.

 

gdb kan caste. Endret av Lycantrophe
  • Liker 1
Lenke til kommentar
  • 3 uker senere...

Filosofisk spørsmål. Hvis man skulle ha programmering i skolen, hva tror dere om free-form (curly braces og semikolon) vs "semantic whitespace" (python/haskell-stil på indentering av blokker)?

 

På den ene siden har jeg lagt merke til at noen elever på khanacademy har problemer med semikolon, og semikolon vs. komma. Det kan man løse ved å fjerne semikolon.

 

De gir også blaffen i å formatere programmet pent, inkludert indentering. Det vil jo løses hvis indentering markerer blokker, og dermed er påkrevd. Spørsmålet er om små barnehjerner klarer å få til indentering når det er påkrevd, eller om de fortsatt ikke vil gjøre det, og programmet dermed ikke vil virke.

 

 

Lenke til kommentar

Ok, skjønner.

Jeg leste på noe, og kom over noe jeg ikke skjønte. Linken som skulle forklare var død.

http://merd.sourceforge.net/polymorphism.html

  • Statically typed languages introduce the "closed world" vs "open world" restriction. In a closed world we know every instance of a function, whereas in a open world we must allow the programmer to add new instance without changing the local meaning.
    Dynamically typed languages usually do not bother with such limitations allowing free overloading, blurring the differences between ad'hoc overloading and interface inheritance.
  • "ad'hoc overloading" is the closed world polymorphism. It is used in C++/Java to allow multi form constructors... It fits quite well in explicitly-typed languages, alas the simple & efficient implementation introduces traps.

 

Det jeg ikke skjønner er det som er understreket.

 

Edit: Under står det "Parametric and inheritance polymorphism are orthogonal."

 

Betyr det at han mener de passer sammen og utfyller hverandre, eller at de kolliderer og ikke passer sammen?

Endret av Emancipate
Lenke til kommentar

Det betyr at det ikke er motsetninger og konflikter mellom parametric og inheritance polymorphism (se: C++).

 

Her er forøvrig paperen: http://dl.acm.org/citation.cfm?id=203096&dl=ACM&coll=

 

Fra wikipedia:

https://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29

 

 


Giuseppe Castagna[8] observed that in a typed language with multiple dispatch, a generic function can have some arguments which control dispatch and some "left-over" arguments which do not. Because the method selection rule chooses the most specific applicable method, if a method overrides another method, then the overriding method will have more specific types for the controlling arguments. On the other hand, to ensure type safety the language still must require the left-over arguments to be at least as general. Using the previous terminology, types used for runtime method selection are covariant while types not used for runtime method selection of the method are contravariant. Conventional single-dispatch languages like Java also obey this rule: there only one argument is used for method selection (the receiver object, passed along to a method as the hidden argument this), and indeed the type of this is more specialized inside overriding methods than in the superclass.

Endret av Lycantrophe
Lenke til kommentar

Det betyr at det ikke er motsetninger og konflikter mellom parametric og inheritance polymorphism (se: C++).

Takk. Nytt spørsmål:

 

Hvordan kan det ha seg closures ikke bryter med purity? En pure function er jo en funksjon som kun er avhengig av sine parametre. Mens en closure er nettopp det motsatte. Så hvordan kan "purely functional programming languages" ha closures?

Lenke til kommentar

Hvordan kan det ha seg closures ikke bryter med purity?

let f1 x = (+ x)
let f2 = f1 2

f2 2
4
let x = 3 // konstant
let f2 = (+ x) // identisk med (+ 3)

f2 3
6
Du kan anse x som en implisitt partial application av (+).

 

En pure function er jo en funksjon som kun er avhengig av sine parametre.

Omgivelsen gir parameteren ved konstruksjon.

 

Mens en closure er nettopp det motsatte. Så hvordan kan "purely functional programming languages" ha closures?

Se over.
Lenke til kommentar

Ok, det gikk et lys opp for meg. Den indre funksjonen er ikke aksesserbar direkte, men KUN via at den returneres fra den ytre?

function outer(n)
    x = 2
    function inner(p)
        return n+x+p
    return inner

myfunc1 = outer(1)
myfunc2 = outer(2)
myfunc3 = outer::inner() // <- Og dette er altså det som er UMULIG,
// og gjør at purity og sunn fornuft ikke brytes??

// Og myfunc1 og myfunc2 refererer da til to separate funksjoner. Right? Så myfunc1 != myfunc2.
// der myfunc1 er return 1+2+p mens myfunc2 er return 2+2+p. Dette er da selvsagt "pure functions".

Lenke til kommentar

Hvilket språk skal dette være? I utgangspunktet ja, men i noen språk (typisk dynamic scope) kan x fort være både mutable og global.

 

Men du har nå idéen uansett. Det stemmer.

 

Husk at funksjoner også er verdier. Det er det som gjør at du kan returnere de, og i den sammenheng blir ikke closures så merkelig.

Endret av Lycantrophe
Lenke til kommentar

Vel, du har noen språk som ikke er så nøye på purity (Javascript er sikkert den verste her) som lar deg gjøre allverdens shenanigans. Ellers har du et stygt eksempel fra C++:

 

 

int x = 2
auto f = [&x](int y) { return x + y; };
 
assert(f(2) == 4);
x = 3;
assert(f(2) == 5);

 

Eller enda verre:

 

 

int x = 2
auto f = [&x](int y) { return x += y; };
 
assert(f(2) == 4);
assert(f(2) == 6);

 

Ikke gjør sånt. :----)

Lenke til kommentar
  • 1 måned senere...

Selv om jeg foretrekker  delphi ( pascal) så har ejg en utfordring til dere

 

problemet er at jeg har en teksstreng med masse tallverdier i,de er adskilt med komma

tallverdiene forløper i stigende orden  fra 0 til 504, men de kommer ikke nødvendigvis etter hverandre ( d.v.s at noen verdier mangler hvis man tenker på at teksstrengen inneholder alle verdier mellom 0 og 504.

 

utfordringen blir da korte ned innholdet slik at det f,eks står 0,3..10,15..20 o.s.v i stedet for 0,3,4,5,6,7,8,9,10, 15,16,17,18,19,20 o.s.v

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...