Avatar billede claus_w Nybegynder
05. maj 2001 - 10:40 Der er 15 kommentarer og
1 løsning

Split string

Jeg har en variabel som indeholder nogle forkellige stings. De kan f.eks. se således ud:

D
I-5
K-5-5
M-20-5
N-30-5-5
N-35-10-5
N-35-10-5-5
Z-45-30-15-5

Den starter altså altid med ét bogstav det er så bare forskelligt hvor mange tal der kommer efter.

Jeg ønsker at dele disse bogstaver og tal op i nogle variabler. I Perl bruger jeg en funktion som hedder split().. hvordan kan jeg gøre det i Delphi?

Avatar billede mukke Nybegynder
05. maj 2001 - 10:59 #1
kan du ikke lavet noget lignende:

var
  MitArray: array[1..20] of byte;
  a,b,c  : byte;
  streng  : string;
  letter  : char;
begin
  // ...
  letter : streng[1];
  b := 3;
  c := 1;
  for a:=4 to length(streng) do
  begin
    while streng[a] <> \'-\' do
      inc(a);
    mitArray[c] := inttoStr(copy(streng, b, a-b));
    inc(c);
    inc(a);
    b := a;
  end;

end;
Avatar billede claus_w Nybegynder
05. maj 2001 - 11:23 #2
For denne fejl:

[Error] logbog.pas(202): Assignment to FOR-Loop variable \'a\'

og linie 202 ser således ud:
      inc(a);
Avatar billede mukke Nybegynder
05. maj 2001 - 11:29 #3
ok, så må vi klare os uden for - var ikke helt sikker på om delphi vill evære med til det der :)

istedet for:

for ...
begin
..
end;

kan du prøve med:
a:= 4;
while (a < length(streng) do
begin
..
inc(a);
end;
Avatar billede claus_w Nybegynder
05. maj 2001 - 11:33 #4
ehh... ved ikke om jeg er helt med..

gidder du ikke lige skrive det sammen?
Avatar billede mukke Nybegynder
05. maj 2001 - 11:48 #5
var
  MitArray: array[1..20] of byte;
  a,b,c  : byte;
  streng  : string;
  letter  : char;
begin
  // ...
  letter : streng[1];
  b := 3;
  c := 1;
  a:= 4;
  while a < length(streng) do
  begin
    while streng[a] <> \'-\' do
      inc(a);
    mitArray[c] := inttoStr(copy(streng, b, a-b));
    inc(c);
    inc(a);
    b := a;
    inc(a);
  end;
end;
Avatar billede claus_w Nybegynder
05. maj 2001 - 11:53 #6
Endnu en fejl:
[Error] logbog.pas(205): There is no overloaded version of \'IntToStr\' that can be called with these arguments

linie 205:
    mitArray[c] := inttoStr(copy(streng, b, a-b));
Avatar billede mukke Nybegynder
05. maj 2001 - 11:57 #7
ok - der er naturligvis StrtoInt ;-)

btw - hvor længer har du programmeret i delphi?
Avatar billede claus_w Nybegynder
05. maj 2001 - 12:02 #8
I en uge... men har stort set læst på det hver dag :(

Grunden til dette er at jeg har teknologi projekt og som produkt dertil har jeg valgt at programmere hvad jeg dengang troede ville være en simpelt program - En elektronisk dykkerlogbog. Men nu er jeg sq bustet for der er 1000 ting jeg endnu ikke har lært og det skal afleveres på mandag :(
Avatar billede mukke Nybegynder
05. maj 2001 - 12:04 #9
hmm.. dårlig ide at bestemme sig for pludselig at lære delphi med en sådan deadline - hold dig til perl og lær delphi når d har tid ;-)
Avatar billede claus_w Nybegynder
05. maj 2001 - 12:07 #10
Det er desværre for sent nu... ér også nået pænt langt.. men det er tit de simple ting som jeg bruger tid på..
Avatar billede claus_w Nybegynder
05. maj 2001 - 12:20 #11
Nu får jeg en: \"Access violation at address 00487343 in module \'Project1.exe\'\" og programmet går ned.. hvordan kan det være?

Det er sket efter jeg indsatte denne linie:
MG.Caption := streng[1];

i steddet for at bruge variablen letter.

MG er en normal TLabel,

Avatar billede mukke Nybegynder
05. maj 2001 - 12:30 #12
skyldes sandsynligvis at der refererers til et indeks der ikek findes - hvis f.eks. streng er tom, så vil streng[1] give den fejl.

Prøv at lave en step-run så du kan se helt præcis hvornår det sker.
Avatar billede claus_w Nybegynder
05. maj 2001 - 12:38 #13
jeb, du havde ret.. satte den lige til at tjekke for indhold.. nu virker dén del...
Avatar billede claus_w Nybegynder
05. maj 2001 - 12:49 #14
når strengen kun har ét tal efter bogstavet (f.eks. D-5) giver mitArray[1] 184 - men så snart stengen bliver længere (f.eks. F-15-5) giver mitArray[1] det rigtige (15)..

Hvordan kan det være? syntes ikke det giver nogen mening :(
Avatar billede mukke Nybegynder
05. maj 2001 - 12:54 #15
Det er muligvis fordi det sidste tal aldrig bliver gemt - så de 184 er den værdi der var der fra starten... prøv evt med følgende kode til allersidst:

if b <= length(streng) then
begin
  mitArray[c] = StrtoInt(Copy(Streng, b, length(streng)-b+1));
  inc(c);
end;
Avatar billede claus_w Nybegynder
05. maj 2001 - 13:06 #16
Så virker det!! :))

mange tak for hjælpen.. det har virkeligt været en stor hjælp..

Sig til hvis der på noget tidspunkt er noget jeg kan hjælpe dig med..

tror du har fortjent noget mere end 30 point ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester