Koodasin vähän C++:aa ja...

Thursday, December 24th 2009 at 02:16 in Technology

...muistin miksi pidän dynaamisesta tyypityksestä:

error: passing ‘const std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >’ as ‘this’ argument of ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]’ discards qualifiers

PS. Hyvää joulua! :-)

7 Comments
Smuli 24.12.2009 02:35:55

Moro Kennu,

sulla on aina hyvät tweetit. Anna palautetta www.sereive.com. Kiitti!

t, smuli

Sami Lehtinen 16.1.2010 10:05:14

Eipä se dynaaminenkaan aina niin juhlaa ole. Tuossa OTR GAE (Python) proggiksen yhteydessä taistelua näiden asioiden kanssa. Ensimmäistä jotain oikeasti hyödyllistä tekevää Python ohjelmaa kirjoittelin.

Päänvaivaa tuotti se, että osa kirjastoista haluaa datan ehdottomasti byte-array muodossa. Toiset haluaa saman datan integer-array muodossa, jossain vaiheessa data on sitten oltava stringinä (ascii) ja välillä unicode stringinä. Eikä muunnokset noiden välillä muuten mene automaattisesti. Tuli rakas Java mieleen kun kirjoitteli apufunktioita datan muutamiseksi muodosta toiseen. Mutta kyllä se siitä.

Joustavammilla kielillä jotka käsittelevät tietoa tietona, sen muodolla ei ole niin paljon väliä. 256 bittiä dataa on 256 bittiä dataa ja sillä selvä. Oli sitten merkkijono, tavuja tai niitä merkkejä esittäviä numeerisia arvoja.

Kennu 16.1.2010 16:16:25

Eikös juuri tuollainen ole Pythonissa tosi helppoa, tyyliin stringistä integer-arrayksi näin:

[ord(c) for c in 'hello'] => [104, 101, 108, 108, 111]

Mikähän on Pythonissa byte-array? En ole sellaiseen törmännytkään. Python 3:ssa on kyllä bytes-tyyppi, joka on byte-string. Omasta mielestäni Python 2:n merkkijonojen erottelu str- ja unicode-tyyppeihin on ollut Pythonin suurin heikkous. Python 3 ilmeisesti korjaa sen aika pitkälle niin, että str-tyyppi kattaa selkeästi kaikki merkkijonot, ja bytes-tyyppiä taas käytetään geneerisiin tavupuskureihin, joiden enkoodaus ei ole tiedossa.

Sami Lehtinen 17.1.2010 15:48:44

Juu, byte array on Pythonissa korrektisti ilmaistuna lista. Mutta se että merkkijono 'merkkijono' ei kelpaa, vaan pitää toimittaa lista tavuista ['m','e'...] on aika turhaa. Varsinkin kun tuo yksi kirjasto vaati nimenomaisesti integereinä noi nuo arvot. Juuri kuten esimerkissäsi oli. Jos homma toimisi todella joustavasti pitäisi byte listan ja merkkijonon käydä suoraan päittäin. Kuten se kävisi C pointtereilla. Python3:ssa tietysti unicode stringit voisi olla kiva haaste, kun tavut eivät vastaa enää merkkejä.

Eihän nuo muunnokset ongelmia aiheuta, kun niihin on tottunut tai luonut täysin valmiit apufunktiot. Mutta ensimmäistä kertaa vierasta kieltä kokeillessa tuli tosissaan java-fiilikset pintaan. ;)

Tässä funktio jolla muunnan heksadesimaalin int listaksi.

@staticmethod
def HexToIntList( hexStr ): try: ints = []

  hexStr = ''.join( hexStr.split(" ") )

  for i in range(0, len(hexStr), 2):
      ints.append( int (hexStr[i:i+2], 16 ) )

  return ints
except ValueError:
  return None
Kennu 17.1.2010 16:29:17

C:n heikko tyypitys on tietysti joskus kätevää low-level-ohjelmoinnissa, mutta se kyllä kostautuu aika äkkiä sovellusohjelmoinnissa ikävien bugien muodossa. Suurin osa maailman tietoturva-aukoistahan on juuri niitä.

Mielenkiintoinen tuo HexToIntList-metodisi ;-) Pythonissa on muuten tapana käyttää pieniä kirjaimia ja alaviivoja metodien ja muuttujien nimissä, esim. hex_to_int_list.

Itse ehkä tekisin saman jotenkin näin:

import re def hex_to_int_list(hex_str): return [int(x, 16) for x in re.findall('(.{2})', hex_str.replace(' ', ''))]

Sami Lehtinen 18.1.2010 10:33:45

Pakko myöntää, että olen harrastanut nyt ns "PHP-koodaajan" hyveitä. Eli tehnyt vaan koodia miten sattuu joka toimii ainakin sinne päin. Tutorialit ja perusdokumentointi on edelleen lukematta. Mutta saa sitä näköjään pythonilla jotain toimivaa aikaiseksi vaikka ei edes osaa.

Syy miksi Pythonin puoleen käännyin, oli GAE. Toisekseen Pythonilla näyttää erilaisten datasettien käsittely olevan suunnattoman kätevää verrattuna moneen muuhun vaihtoehtoon.

Mutta juuri pythonin parhaat ominaisuudet on täysin harmaalla sektorilla johtuen siitä että tutorialit on lukematta ja ymmärtämättä.

Sami Lehtinen 23.1.2010 12:38:21

http://zephyrfalcon.org/labs/python_pitfalls.html

Tuo kannattaa kastoa. Varsinkin noiden self referenssien kanssa saa sössittyä hyvin. Oli tausta sitten Javassa tai jossain muussa kielessä.

Kun lähtee sillä asenteella, että eihän tässä mitään perusteita tarvitse lukea kun osaan homman. Niin metsään menee. ;)


You can use Markdown to format your comment:

  • > quoted text
  • *italic* text
  • **bold** text
  • `code block` (multi-line is ok, whitespace is preserved)
  • [link text](http://www.google.com "link title")

Separate paragraphs in your text with two newlines