Toon posts:

[delphi] array error :?

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik was van plan het volgende stukje code:
code:
1
2
3
4
5
6
7
8
9
10
for i := i to length(inhoud) do
begin
if inhoud[i] = ',' then arit := arit + 1
else
    begin
        arsi := arsi + 1;
        setlength(diritems, arsi);
        diritems[i] := diritems[i] + output[i];
    end;
end;

te gaan gebruiken om een string af te zoeken op een komma, zodra die gevonden is zet ie de volgende karakters tot de volgende komma in een array index.
voorbeeldje:
string := 'aap,piet,kees';
hierdoor zou aap, piet en kees ieder in een aparte key komen te staan.
alleen wat nu etr probleem is (ja nu komt et :)) is dat ik de volgende error krijg:
Array type required

ik declareer mijn array als volgt:
diritems: array of string;

en kom niet met replies zoals: "je kan dit beter met pos en copy, etc doen"
want.. ik wil es ff kijken hoe snel dit nou eigelijk is :)

Verwijderd

Van welk type is output?? en heb je die wel goed gedeclareerd?

Zet anders je variabele declaraties er even bij.

Verwijderd

Topicstarter
damn output moest inhoud zijn!@#
tanx dat je me eraan herinnerde :)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 08:24

Tomatoman

Fulltime prutser

Al begrijp ik weinig van je code zolang er geen declaraties van de variabelen bijstaan, met welke waarden je ze initialiseert en bij welke regel de compiler klaagt, ik kan je al op voorhand vertellen dat het grootste deel van de processortijd in de SetLength procedure gaat zitten. Die alloceert geheugen voor een kopie van de array, plaatst de oude array-inhoud inclusief de nieuwe waarden erin en verwijdert tenslotte de oude array. Dit kost heel veel meer tijd dan alle andere bewerkingen in jouw code bij elkaar.

En om de open deur toch maar eens in te trappen: waarom wil je het wiel opnieuw uitvinden en gebruik je niet de functies die hiervoor bedoeld zijn? De namen ken je al: Pos, Copy, enzovoort.

Een goede grap mag vrienden kosten.


  • Paul
  • Registratie: September 2000
  • Laatst online: 21:43
Op vrijdag 10 mei 2002 20:38 schreef blasty het volgende:
Even wat opmerkingen:
• for i := i to
Weet je zeker dat dat i moet zijn en geen 1 (één)?
• diritems[i]
I wordt iedere iteratie eentje groter. Arsi alleen maar als er op die plek in inhoud geen ',' staat. Dit houdt dus in, dat I ALTIJD harder loopt dan arsi(bij de eerste komma is I al 1x vaker opgehoogd dan arsi). Je loopt nu dus kans dat je een ArrayIndexOutOfBoundsException krijgt.
• arit := arit + 1
Warning/Hint/Weet ik het: Value assigned to arit never used :P
• De bedoeling :?
Iedere keer dat je GEEN komma tegenkomt, maak je je string-array groter, en voeg je aan de i-de string de char op inhoud[i] toe? Is dat zo de bedoeling?

Conculderend: Bedoel je dit?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type TDirItems : array of string;
function foo(const inhoud: string): TDirItems;
var aantal   : integer;
    i     : integer;
begin
  aantal := 1;
  setLength(result, aantal);
  for i := 1 to length(inhoud) do
    begin
    if inhoud[i] = ',' then
      begin
        inc(aantal);
        setLength(result, aantal);
        dirItems[aantal - 1] := '';
      end
    else
      begin
        result[aantal - 1] := result[aantal - 1] + inhoud[i];
      end;
    end;
end;

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • jhksema
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:17
Geen idee of je 2 weken na je post nog iets leest, maar toch nog mijn inbreng:

Je zegt dat je het array als array of string definieert. D.w.z. een dynamisch array. Waarschijnlijk is de code die je geeft deel van een routine, die iets is als:
code:
1
routine(s: array of string);

Het lijkt nu wellicht dat die routine om een dynamisch array vraagt, maar in feite zijn het open array parameters. D.w.z. dat de routine een willekeurig array accepteerd. Dus danwel een 'gewoon' array, danwel een dynamisch array. In dat laatste geval dien je wel al m.b.v. SetLength het array geinitialiseerd te hebben.

Jij gebruikt de routine alsof je een dynamisch array hebt, dus roep je setlength aan in je code. Dat werkt natuurlijk nooit op arrays die een vaste grootte hebben. Vandaar de foutmelding.

Om nu te forceren dat een dynamisch array wordt meegegeven, moet je een type definieëren dat een dynamisch array voorstelt, en dit meegeven:
code:
1
2
TDynStrArray = Array of String
routine(s: TDynStrArray)

Lost dit je probleem op? (of heb ik het weer eens helemaal niet begrepen...)

  • Paul
  • Registratie: September 2000
  • Laatst online: 21:43
Op zaterdag 25 mei 2002 23:13 schreef jhksema het volgende:
Geen idee of je 2 weken na je post nog iets leest
Zelfs een dag erna al niet meer... (ja, 12 over 0 vind ik dan nog bij de vorige dag horen :) )

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Ik blijf me altijd afvragen waarom iemand een array of string gebruikt i.p.v. een TStringList?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Paul
  • Registratie: September 2000
  • Laatst online: 21:43
Op zondag 26 mei 2002 22:32 schreef Creepy het volgende:
Ik blijf me altijd afvragen waarom iemand een array of string gebruikt i.p.v. een TStringList?
Miscchien onwetendheid?
Maar je hebt wel gelijk.. TStrings heeft al een hoop voor je gedaan. Tegenwoordig wordt geheugengebruik minder en minder een issue, dus dat argument gaat ook niet echt op (al weet ik niet wat eeen TStringList extra gebruikt bovenop een Array of String;
Maar ik blijf erbij (zie mijn eerste post in dit topic) dat ik het een vreemde opzet van de topicstarter vind.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock

Pagina: 1