/ 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
Hvordan regner man ?
Fra : Lasse Madsen


Dato : 21-08-02 13:28

Hej ...

Jeg har et seriel nummer feks 10013429 der via en formel skal regnes om til
et unique ID
til det har jeg opfunden en formel her er et eksempel på Seriel til Unique
ID

Seriel Nr: 10013429

Formel fra seriel til Unique:

Char1 = (13429 / ( 36*36*36 )) // resultat = 0
Char2 = (13429 / ( 36*36 )) // resultat =
10,31
Char3 = ((13429 / ( 36*36*Char2)) / 36) // resultat = 13,02
Char4 = ((13429 - ( 36*36*Char2 )) - ( 36*Char3)) // resultat = 1

Så har jeg en tabel jeg kan slå op i ...

Char1 kan kun være bokstaver fra A til Z disse har så værdien 0 til 25
(A=0,B=1 ....)

Char2 til 4 har værdier fra 0 til 9 samt fra A til Z dvs
0=0
....
9=9
A=10
....
Z=35

Tænker vi tilbage på regnestykket før fik vi resultatet
Char1=0,00
Char2=10,31
Char3=13,02
Char4=1,00

Så smider vi tallene væk efter kommaet og slå op i vores tabel og får:

Char1 = A
Char2 = A
Char3 = D
Char4 = 1

Men jeg er bare totalt lost !
1. jeg aner ikke hvordan jeg skal få hele seriel nummeret indtastet i en
text box lavet om til variabler jeg kan begynde at regne på
2. Jeg aner heller ikke hvordan jeg nemt kan sammenligne variablen med min
tabel uden at skulle lave en million IF THEN sætninger

Er der ikke nogen her inde som har nogle gode ideer eller kode fragmenter ?

M.v.h.
Lasse Madsen
elektronik mekaniker lærling



 
 
Finn Tolderlund (21-08-2002)
Kommentar
Fra : Finn Tolderlund


Dato : 21-08-02 13:55


"Lasse Madsen" <lm@vxd.dk> wrote in message
news:3d638794$0$88376$edfadb0f@dspool01.news.tele.dk...
> Jeg har et seriel nummer feks 10013429 der via en formel skal regnes om
til
> et unique ID
> til det har jeg opfunden en formel her er et eksempel på Seriel til
Unique
> ID

Hvorfor gøre det så besværligt?
Dit seriel nummer må da være et unikt nummer i forvejen?
Ellers er seriel nummeret ubrugeligt.
--
Finn Tolderlund



Lasse Madsen (21-08-2002)
Kommentar
Fra : Lasse Madsen


Dato : 21-08-02 14:09

> Hvorfor gøre det så besværligt?

Fordi programmet skal styre en 8bit mikroprocessor ... jo kortere streng jeg
skal få den til at dekode og encode jo hurtigere kan jeg afvikle programmet
i den



Claus Bernth / Sport~ (21-08-2002)
Kommentar
Fra : Claus Bernth / Sport~


Dato : 21-08-02 15:34

Så er det letteste vel bare at konvertere til BCD eller HEX?

BCD = Binary Coded Decimal => 4 bit per tal dvs. dit 8 cifrede serial bliver til
4 bytes.
HEX = I princippet fuldstændigt det samme bortset fra at tolkningen af
resultatet er anderledes

En lille programstump der gør det:
Private Sub Form_Load()
Dim i As Integer
Dim s As String
Dim a As Byte
Dim d As Double
s = "10013429000"
For i = 1 To Len(s)
d = (i / 2) + 0.5
a = Asc(Mid(s, i, 1)) - 48
a = a And 31
If i Mod 2 = 1 Then
a = a * 16
Mid(s, Fix(d), 1) = Chr(a)
Else
a = a + Asc(Mid(s, Fix(d), 1))
Mid(s, Fix(d), 1) = Chr(a)
End If
Next i
s = Mid(s, 1, Fix(d))
End Sub

Når programmet slutter er s = en streng på halvdelen af længden for strengen med
serial (afrundet op)

Alt hurlumhejet med at definere d som double, lægge til og køre fix() skyldes en
lille finurlighed i VB6's afrundingsrutine

Vh,
Claus








Lasse Madsen wrote:

> > Hvorfor gøre det så besværligt?
>
> Fordi programmet skal styre en 8bit mikroprocessor ... jo kortere streng jeg
> skal få den til at dekode og encode jo hurtigere kan jeg afvikle programmet
> i den


Claus Bernth / Sport~ (21-08-2002)
Kommentar
Fra : Claus Bernth / Sport~


Dato : 21-08-02 15:45


Claus Bernth / Sports-MC wrote:

> Når programmet slutter er s = en streng på halvdelen af længden for strengen med
> serial (afrundet op)

Hvis du har en fast længde på din serial-streng og længden altid er et lige tal har
kan du bruge koden som den er...

Ellers bør du nok lige huske at ved ulige længder bliver de 4 mindst betydende bit i
sidste byte altid 0000 - mere hvis du skal bruge strengen til noget senere...

Vh,
Claus


Lasse Madsen (22-08-2002)
Kommentar
Fra : Lasse Madsen


Dato : 22-08-02 12:44

Ja det er jo meget smart men nu er det sådan at jeg har over 600 styringer
der er lavet efter det gamle princip med en kode lavet i pascal og så vil
jeg ikke lave det om bare fordi jeg gerne vil lære lidt visual basic ...

Her er koden i pascal:

type // A-Z
TMArray = array[1..26] of Integer;

const
DataArray1: TMArray = (0,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);

DesArray: array[1..26] of Char = ('A','B','C','D','E','F','G',
'H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U',
'V','W','X','Y','Z');


type // 0-9 og A-Z
TMyArray = array[1..36] of Integer;

const
DataArray: TMyArray = (0,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);

DescArray: array[1..36] of Char = ('0','1','2','3','4','5','6',
'7','8','9','A','B','C','D',
'E','F','G','H','I','J','K',
'L','M','N','O','P','Q','R',
'S','T','U','V','W','X','Y','Z');


procedure TForm1.GdataClick(Sender: TObject);
//Beregner fra seriel nummer til uniqe ID
var
C1,C2,C3,C4,Serial1,cur:Integer;

begin
Serial1:= StrToInt(Sernum.Text);
// C1 til C4 = char
C1 := (SerIal1-10000000) div(36*36*36);
begin
C2 :=((Serial1-10000000)-(36*36*36*c1)) DIV (36*36);
begin
C3 :=((Serial1-10000000)-(36*36*36*C1)- (36*36*c2)) DIV 36;
begin
C4 :=((Serial1 -10000000)-(36*36*36*C1)-(36*36*C2)) - (36*c3) ;
// Beregning
begin
Cur := C1;
if Cur = 26 then Cur := -1;
C1 := Cur ;
Cha1 := DesArray[C1 + 1];
// Char 1
begin
Cur := C2;
if Cur = 36 then Cur := -1;
C2 := Cur ;
Cha2:= DescArray[C2 + 1];
// Char 2
begin
Cur := C3;
if Cur = 36 then Cur := -1;
C3 := Cur ;
Cha3 := DescArray[C3 + 1];
// Char 3
begin
Cur := C4;
if Cur = 36 then Cur := -1;
C4 := Cur ;
Cha4 := DescArray[C4 + 1];
// Char 4
globalID.text:=(cha1+cha2+cha3+cha4);
crtID.text:=(cha1+cha2+cha3+cha4);
end;end;end;end;end;end;end;


end;

m.v.h.
l. madsen



Claus Bernth / Sport~ (22-08-2002)
Kommentar
Fra : Claus Bernth / Sport~


Dato : 22-08-02 17:33

Lasse Madsen wrote:

> Ja det er jo meget smart men nu er det sådan at jeg har over 600 styringer
> der er lavet efter det gamle princip med en kode lavet i pascal og så vil
> jeg ikke lave det om bare fordi jeg gerne vil lære lidt visual basic ...

Hmm, du nævnte ikke at det skulle være præcis det samme... Blot at du ville
sammensætte til en kort streng! Nå, nok om det...

> Her er koden i pascal:

Det er meget fint men hvad gør DIV præcist ?

Jeg har forgæves prøvet at eftergøre dine beregninger i Excel men uden den
mindste form for held...

Dit eksempel i første post kommer ikke i nærheden af det du viser i
pascalkoden. Eks. beregning af C1 - C4 i din første post:
Char1 := (13429/(36*36*36)) // resultat = 0
Char2 := (13429/(36*36)) // resultat = 10,31
Char3 := ((13429/(36*36*Char2))/36) // resultat = 13,02
Char4 := ((13429-(36*36*Char2))-(36*Char3)) // resultat = 1

Som det ser ud i Pascalkoden:
Char1 := (10013429-10000000)/(36*36*36); // resultat = 0,288
Char2 :=((10013429-10000000)-(36*36*36*c1)) DIV (36*36);
// Ovenstående svarer til (13429-13429) / 1296 => resultat = 0
Char3 :=((10013429-10000000)-(36*36*36*C1)- (36*36*c2)) DIV 36;
// og da bliver mellem resultatet (13429-13429-0) / 0 => res =0
Char4 :=((10013429-10000000)-(36*36*36*C1)-(36*36*C2)) - (36*c3);
// Og igen her...

Altså C1=0,288 og C2 til C4=0

Enten har jeg overset noget elementært eller også sker der nogle overflow fejl
i Pascal programmet som gør at du får de nævnte resultater???

Envidere giver koden:
Cur := C1;
if Cur = 26 then Cur := -1;
C1 := Cur ;
Cha1 := DesArray[C1 + 1];
// Char 1

....en potentiel out-of-bound fejl på DesArray da det går fra 1-26 og du i
realiteten kan få et 0 som indeksværdi (hvis c1 = 26 når du starter). Jeg
kender ikke Pascal godt nok til at vide hvordan den håndterer dette men hvis
ikke jeg husker meget galt fisker du bare den integer der ligger i hukommelsen
lige før element-#1...? Er det korrekt opfattet?

Du er nok nødt til at dokumentere koden og mellemresultaterne bedre hvis det
skal kunne genskabes i VB



Vh,
Claus



Lasse Madsen (23-08-2002)
Kommentar
Fra : Lasse Madsen


Dato : 23-08-02 11:12

Hej Claus

I min første post beskriver jeg hvordan du skal regne det ud ...
og det går jo på at man skal smide alt efter kommaet væk (værken runde
op/ned eller noget)
så hvis jeg lige kommentere kan ud se at det kommer til at passe.

> Som det ser ud i Pascalkoden:
> Char1 := (10013429-10000000)/(36*36*36); // resultat = 0

> Char2 :=((10013429-10000000)-(36*36*36*c1)) DIV (36*36);
// Svarer til:((13429)-(36*36*36*0)) DIV (36*36)
// DIV betyder at du ganger hele tal altså UDEN komma...

og så kommer det også til at passe når du regner videre...

Så altså:

DIV = Divide without comma (noget i den stil)
dvs. at hvis der feks stod 4,99 dividerede du med 4 og stod der 3,10
dividerede du med 3
osv...


> ...en potentiel out-of-bound fejl på DesArray da det går fra 1-26 og du i
Hehe ... I min første post beskriver jeg hvordan systemet virker ... og at
Char-1 kun kan antage værdier fra 0 til 25 derfor kan en "out-of-bound" fejl
ikke forkomme ...


Håber det hjælper lidt ???
Mange tak for den fine feedback

M.v.h.
L. madsen



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste