/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
Tal til binær
Fra : Ukendt


Dato : 12-06-02 11:56

Hejsa

Jeg skal lave et tal om til et binær tal der skal benyttes til at gemme som
billede. Men hvordan laver jeg det om, så det kan bruges?

Niels



 
 
Harald Staff (12-06-2002)
Kommentar
Fra : Harald Staff


Dato : 12-06-02 13:08

Hei Niels

Function Dec2Bin(What As Long) As String
Dim Tell As Long
Dec2Bin = ""
Tell = What
Do
Dec2Bin = Tell Mod 2 & Dec2Bin
Tell = Int(Tell / 2)
Loop Until Tell < 1
End Function

Sub test()
MsgBox Dec2Bin(19)
End Sub

HTH. Beste hilsen Harald

"Niels" <noway> skrev i melding
news:3d072859$0$211$edfadb0f@dspool01.news.tele.dk...
> Hejsa
>
> Jeg skal lave et tal om til et binær tal der skal benyttes til at gemme
som
> billede. Men hvordan laver jeg det om, så det kan bruges?
>
> Niels
>
>



Bjarke Walling Peter~ (12-06-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 12-06-02 17:19

Harald Staff skrev:
[snip]
> Dec2Bin = Tell Mod 2 & Dec2Bin
[snip]

Her bør man skrive: Dec2Bin = CStr(Tell Mod 2) & Dec2Bin
.... selvom det virker uden.

Mvh. Bjarke



Tomas Christiansen (12-06-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 12-06-02 21:31

Bjarke Walling Petersen skrev:
> Harald Staff skrev:
> [snip]
> > Dec2Bin = Tell Mod 2 & Dec2Bin
> [snip]
>
> Her bør man skrive: Dec2Bin = CStr(Tell Mod 2) & Dec2Bin
> ... selvom det virker uden.

Både ja og nej.
Fidusen med at bruge & til streng-konkatenering fremfor + er jo netop
at & _gennemtvinger_ en konvertering til strenge _inden_ disse
konkateneres. Se selv beskrivelsen af &-operatoren:

"Used to force string concatenation of two expressions."

Bruger man derimod + som streng-konkateneringsoperator, bør man ALTID
bruge CStr på ikke-strenge.

-------
Tomas


Bjarke Walling Peter~ (12-06-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 12-06-02 22:40

Tomas Christiansen skrev:
> Bjarke Walling Petersen skrev:
> > Harald Staff skrev:
> > [snip]
> > > Dec2Bin = Tell Mod 2 & Dec2Bin
> > [snip]
> >
> > Her bør man skrive: Dec2Bin = CStr(Tell Mod 2) & Dec2Bin
> > ... selvom det virker uden.
>
> Både ja og nej.
> Fidusen med at bruge & til streng-konkatenering fremfor + er jo netop
> at & _gennemtvinger_ en konvertering til strenge _inden_ disse
> konkateneres. Se selv beskrivelsen af &-operatoren:
>
> "Used to force string concatenation of two expressions."
>
> Bruger man derimod + som streng-konkateneringsoperator, bør man ALTID
> bruge CStr på ikke-strenge.

På den måde har du ret, men personligt vil jeg foretrække at rette i et
program, der er altid bruger konverteringsfunktionerne, selvom det ikke er
nødvendigt. Det bør være en hovedregel altid at programmere stuktureret og
overskueligt. Derfor synes jeg godt man kan lære folk denne gode skik. I
øvrigt tager det ikke ekstra CPU-tid, da & jo selv vil udføre CStr på begge
variabler der skal konkatineres, hvis disse ikke allerede er strenge.

Mvh. Bjarke



Harald Staff (13-06-2002)
Kommentar
Fra : Harald Staff


Dato : 13-06-02 00:26

"Bjarke Walling Petersen" <bwp@bwp.dk> wrote in message
news:3d07bfd4$0$44150$edfadb0f@dspool01.news.tele.dk...
> Det bør være en hovedregel altid at programmere stuktureret og
> overskueligt. Derfor synes jeg godt man kan lære folk denne gode skik.

Nå, så koden min er uoverskuelig ? Og jeg programmerer ustruktureret ?

> øvrigt tager det ikke ekstra CPU-tid, da & jo selv vil udføre CStr på
begge
> variabler der skal konkatineres, hvis disse ikke allerede er strenge.

"Hvis ikke" tar tid i seg selv. Og det du ønsker er CStr(Cstr(x)) hvilket
tar dobbelt så lang tid.

(resten er sensureret -man har da gode skik'er så det renner efter...)



Tomas Christiansen (13-06-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 13-06-02 11:03

Harald Staff skrev:
> Nå, så koden min er uoverskuelig ? Og jeg programmerer ustruktureret ?

Jeg ved nu ikke om det er uoverskueligt, det synes jeg ikke, men der er nogle små skønhedsfejl og plads til forbedringer (og det er
der vel altid).

Du skriver:

> Function Dec2Bin(What As Long) As String
> Dim Tell As Long
> Dec2Bin = ""
> Tell = What

Dvs. at du signalerer til den, som bruger funktionen, at What vil kunne returnere en værdi (idet den overføres ByRef).
Men i koden skynder du dig at tage en kopi af den (Tell), for ikke at ødelægge dens værdi, og du ændrer slet ikke på What's værdi.

Hvis du vil vise dine intentioner, angiver du ByVal, hvis du ikke vil returnere en ny værdi i et argument.
Så behøver du heller ikke at tage (unødig) en kopi af argumentet.

Ydermere bruger du en almindelig (langsom) kommatalsdivision ("/"), for straks herefter at konvertere resultatet til heltal, selvom
det jo er en heltaltsdivision ("\") du ønsker.

En sidste ting, som man måske bør gøre opmærksom på, er at funktionen returnerer værdien nul, hvis den fodres med negative tal. Jeg
vil gerne vælge at returnere den tomme streng i stedet for "0", idet jeg derved signalerer at det ikke giver mening at bruge negatve
tal (i denne implementation).

Den omskrevne funktion bliver da (bemærk at CStr ikke benyttes - jeg ville nok bruge den i praksis):

Function Dec2Bin2(ByVal What As Long) As String
Dec2Bin2 = ""
If What >= 0 Then
Do
Dec2Bin2 = What Mod 2 & Dec2Bin2
What = What \ 2
Loop Until What = 0
End If
End Function

Bemærk at initialiseringen af Dec2Bin til den tomme streng er unødvendig, idet alle streng-variabler (og funktioners returværdi) fra
automatisk tildeles den tomme streng, når de oprettes, men jeg synes nu alligevel at det er god skik at gøre det.

-------
Tomas


Harald Staff (13-06-2002)
Kommentar
Fra : Harald Staff


Dato : 13-06-02 11:50

"Tomas Christiansen" <toc@blikroer.dk.removethis> skrev i melding
news:ae9qkg$2h1k$1@news.cybercity.dk...

> Hvis du vil vise dine intentioner, angiver du ByVal, hvis du ikke vil
returnere en ny værdi i et argument.
> Så behøver du heller ikke at tage (unødig) en kopi af argumentet.

Meget godt poeng.

> Ydermere bruger du en almindelig (langsom) kommatalsdivision ("/"), for
straks herefter at konvertere resultatet til heltal, selvom
> det jo er en heltaltsdivision ("\") du ønsker.

\ fungerer som koden står -dvs ved Long-variabel. Men ved større tall vil
den ikke, så jeg valgte å beholde den sådan for å nemt kunne redigere den.

> Bemærk at initialiseringen af Dec2Bin til den tomme streng er unødvendig,
idet alle streng-variabler (og funktioners returværdi) fra
> automatisk tildeles den tomme streng, når de oprettes, men jeg synes nu
alligevel at det er god skik at gøre det.

Enig.

Beste hilsen Harald





Bjarke Walling Peter~ (13-06-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 13-06-02 12:03

Harald Staff skrev:
> Nå, så koden min er uoverskuelig ? Og jeg programmerer ustruktureret ?

Små stykker kode, som det du postede, er nemme at overskue. Så jo, det var
fint nok overskueligt.
Men man, synes jeg, bør altid skrive CStr, hvor det er det man ønsker - en
konvertering fra én variabeltype til en streng.
Selvfølgelig er det ikke teknisk nødvendigt, men det er heller ikke teknisk
nødvendigt at programmere overskueligt og stuktureret.

> "Hvis ikke" tar tid i seg selv. Og det du ønsker er CStr(Cstr(x)) hvilket
> tar dobbelt så lang tid.
[snip]

Det er muligt, når man kører sit program i VB-miljøet. Men er jeg er
overbevidst om det ikke er tilfældet når du compilerer dit program. Her har
MS dummet sig meget, hvis compileren ikke også ændrer CStr(CStr(x)) til
CStr(x) ... for den reducerer nemlig andre matematiske udtryk - i hvert fald
til en vis grad:

"Visual Basic may rearrange arithmetic expressions to increase internal
efficiency." - MSDN Library

Men ok, hvem siger at MS aldrig har dummet sig ...

Jeg blev lidt interesseret i at se, hvormeget tid CStr tog i forhold til
'ikke CStr'. Så jeg lavede et lille testprojekt, der målte hvor lang tid
10.000 'sætninger' med og uden CStr tog. Jeg kørte det et par gange, både i
VB og compileret og fik følgende resultater:

I VB-miljøet:
Med CStr: 11,990 sek. gns. pr. 10.000 sætninger
Uden CStr: 11,790 sek. gns. pr. 10.000 sætninger
=> CStr er ca. 1,7% langsommere
Som .exe-fil:
Med CStr: 13,496 sek. gns. pr. 10.000 sætninger
Uden CStr: 13,678 sek. gns. pr. 10.000 sætninger
=> CStr er ca. 1,3% hurtigere

Dog siger det ikke så meget, da så små procentværdier ligeså godt kan være
en usikkerheder.

Mvh. Bjarke



Harald Staff (13-06-2002)
Kommentar
Fra : Harald Staff


Dato : 13-06-02 15:37

"Bjarke Walling Petersen" <bwp@bwp.dk> skrev i melding
news:3d087c0c$0$71635$edfadb0f@dspool01.news.tele.dk...
> I VB-miljøet:
> Med CStr: 11,990 sek. gns. pr. 10.000 sætninger
> Uden CStr: 11,790 sek. gns. pr. 10.000 sætninger
> => CStr er ca. 1,7% langsommere
> Som .exe-fil:
> Med CStr: 13,496 sek. gns. pr. 10.000 sætninger
> Uden CStr: 13,678 sek. gns. pr. 10.000 sætninger
> => CStr er ca. 1,3% hurtigere

Hurtigere kompilert ? I rest my case Tak skal du ha.

Beste hilsen Harald



Tomas Christiansen (13-06-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 13-06-02 10:12

Bjarke Walling Petersen skrev:
> > > Her bør man skrive: Dec2Bin = CStr(Tell Mod 2) & Dec2Bin
> > > ... selvom det virker uden.
> >
> > Både ja og nej.
> >
> > Bruger man derimod + som streng-konkateneringsoperator, bør man ALTID
> > bruge CStr på ikke-strenge.
>
> På den måde har du ret, men personligt vil jeg foretrække at rette i et
> program, der er altid bruger konverteringsfunktionerne, selvom det ikke er
> nødvendigt. Det bør være en hovedregel altid at programmere stuktureret og
> overskueligt. Derfor synes jeg godt man kan lære folk denne gode skik. I
> øvrigt tager det ikke ekstra CPU-tid, da & jo selv vil udføre CStr på begge
> variabler der skal konkatineres, hvis disse ikke allerede er strenge.

Det var jo også derfor at jeg skrev: "både ja og nej"

Jeg er ganske enig med dig mht. det at programmere struktureret og at VISE sine intentioner (med CStr).

Jeg kunne blot ikke lade være med at opponere, idet du ikke begrundede hvorfor man bør bruge CStr (idet årsagen jo er din - som også
er min - personlige holdning til programmering, men ikke er af teknisk karakter).

Mht. forbrug af CPU-tid er streng-konkatenering med + helt klart det hurtigste, men denne metode indeholder så mange faldgruber, at
den bør undgås (hvilket MS også selv anbefaler).

-------
Tomas


Bjarke Walling Peter~ (13-06-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 13-06-02 12:14

Tomas Christiansen skrev:
> Det var jo også derfor at jeg skrev: "både ja og nej"
>
> Jeg er ganske enig med dig mht. det at programmere struktureret og at VISE
sine intentioner (med CStr).
>
> Jeg kunne blot ikke lade være med at opponere, idet du ikke begrundede
hvorfor man bør bruge CStr (idet årsagen jo er din - som også
> er min - personlige holdning til programmering, men ikke er af teknisk
karakter).
[snip]

Ja, det er rigtigt. Men det er jo heller ikke en teknisk nødvendighed at
programmere overskueligt. Jeg mener at god skik ikke blot er at overholde de
tekniske regler, men f.eks. også sørge for at andre kan rette i ens
programmer og nemt forstå betydningen af det man gør.
Selvfølgelig har det ikke så stor betydning ved små stykker kode, der bliver
postet i denne nyhedsgruppe.

Men egentlig er det op til den enkelte programmør at bestemme sig for hans
programmeringsstil. Det kan være mit eget problem at jeg går og ærgrer mig
over der ikke er den samme mængde konventioner og retningslinier i Visual
Basic, som der f.eks. er i C++.

Mvh. Bjarke



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste