/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Underligt problem med arrays
Fra : Gert Hansen


Dato : 03-02-04 23:16

Hejsa gutter


Jeg er lige stødt på et fænomen jeg ikke troede var muligt. Jeg vil gemme 5
koordinater i en array:

spoly: array[1..5] of TPoint;

jeg kører et loop som læser koordinaterne fra en tekst-fil og gemmer dem i
min array:

for i:=1 to n_sides do [n_sides er lig 5]
begin
[...]
end;

Bagefter tegner jeg et polygon (som er en array af tpoints), men den tegner
forkert. Ved nærmer undersøgelse viser det sig at koordinaterne ligger i:

spoly[2]..spoly[6]

Men jeg har ikke defineret register 6, så burde programmet ikke crashe med
en Memory-exception? Både da den skriver til reg 6 og da jeg siden læser reg
6???


Hvad er der galt? Skal jeg bare acceptere det, og så køre array'en som 2..6
eller 0..5?



/GertH
Bruger D6



 
 
Ingolf (04-02-2004)
Kommentar
Fra : Ingolf


Dato : 04-02-04 00:14

"Gert Hansen" <gert@hansen-net.dk> wrote in message
news:bvp6mv$1sc1$1@news.cybercity.dk...
> Hejsa gutter
>
>
> Jeg er lige stødt på et fænomen jeg ikke troede var muligt. Jeg vil gemme
5
> koordinater i en array:
>
> spoly: array[1..5] of TPoint;
>
> jeg kører et loop som læser koordinaterne fra en tekst-fil og gemmer dem i
> min array:
>
> for i:=1 to n_sides do [n_sides er lig 5]
> begin
> [...]
> end;
>
> Bagefter tegner jeg et polygon (som er en array af tpoints), men den
tegner
> forkert. Ved nærmer undersøgelse viser det sig at koordinaterne ligger i:
>
> spoly[2]..spoly[6]
>
> Men jeg har ikke defineret register 6, så burde programmet ikke crashe med
> en Memory-exception? Både da den skriver til reg 6 og da jeg siden læser
reg
> 6???

Du skal tænde for den del af compileren der hoder øje med 'ranges' og
'overflows'. Project->Options->Compiler. Sæt hak i alt under 'debugging', og
selvfølgelig 'ranges'.

>
> Hvad er der galt? Skal jeg bare acceptere det, og så køre array'en som
2..6
> eller 0..5?
>

Øhh mente du ikke "spoly: array[1..5] of TPoint;" ? Og hvordan initialiserer
du filen?

Bør være i retning af nedenstående...
[...]
var
fil : file of TPoint;

assignfile(fil,'c:\minfin.dat');
rewrite(fil);
[...]

Skrivning af data:
[...]
for x:=0 to 5 do blockwrite(fil,spoly[x],sizeof(TPoint));




Ukendt (04-02-2004)
Kommentar
Fra : Ukendt


Dato : 04-02-04 07:37

"Gert Hansen" <gert@hansen-net.dk> wrote in message
news:bvp6mv$1sc1$1@news.cybercity.dk...
> Hvad er der galt? Skal jeg bare acceptere det, og så køre array'en som
2..6
> eller 0..5?

Du kommer nok til at ryste op med noget kildekode, hvis du vil have
hjælp.


Nicolai Hansen (04-02-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 04-02-04 07:38

> Hejsa gutter

Hej dér :)

> Jeg er lige stødt på et fænomen jeg ikke troede var muligt. Jeg vil gemme 5
> koordinater i en array:
>
> spoly: array[1..5] of TPoint;
>
> jeg kører et loop som læser koordinaterne fra en tekst-fil og gemmer dem i
> min array:
>
> for i:=1 to n_sides do [n_sides er lig 5]
> begin
> [...]
> end;
>
> Bagefter tegner jeg et polygon (som er en array af tpoints), men den tegner
> forkert. Ved nærmer undersøgelse viser det sig at koordinaterne ligger i:
>
> spoly[2]..spoly[6]

Det lyder ret usandsynligt - kan du evt. poste koden så vi kan kigge
på den?

> Men jeg har ikke defineret register 6, så burde programmet ikke crashe med
> en Memory-exception? Både da den skriver til reg 6 og da jeg siden læser reg
> 6???

Det kommer an på hvad der ligger i hukommelsen lige efter dit spoly
array. Og om du har range checking slået til eller fra :)

> Hvad er der galt? Skal jeg bare acceptere det, og så køre array'en som 2..6
> eller 0..5?

Du skal ihvertfald ikke begynde at køre array'en som 2..6 - det
hjælper dig næppe på længere sigt :) Skriv noget kode her, så kan det
være at en eller anden kan finde en fejl i den.
Evt. kan du prøve at indsætte et breakpoint og tilføje dit array til
watch listen, og så steppe dig vej ned gennem programmet. Der er et
par flere tricks man kan bruge hvis du er interesseret i at gå denne
vej

Gert Hansen (04-02-2004)
Kommentar
Fra : Gert Hansen


Dato : 04-02-04 11:08

OK - I får noget kode:


const
polymax=5;

var
Form2: TForm2;
n_sides: integer;
spoly: array[1..polymax] of TPoint;

{divString en en funktion som kan hive tallene ud af min komma-separerede
text
tekst-eksempel: 5:0,16,24,8,16,-24,-16,-24,-24,8


procedure definePoly;
var
lstr,rstr: string;
i: integer;
begin
divString(form2.Memo1.Lines[at_line],lstr,rstr,':');
n_sides:=strtoint(lstr);
for i:=1 to n_sides do
begin
divString(rstr,lstr,rstr,',');
spoly[i].X:=strtoint(lstr);
divString(rstr,lstr,rstr,',');
spoly[i].Y:=strtoint(lstr);
end;
form2.debugCoords;
end;


procedure TForm2.debugCoords;
var
i: integer;
begin
form1.Memo1.Lines.Add(inttostr(n_sides));
for i:=1to n_sides+1 do
begin
form1.Memo1.Lines.Add(inttostr(spoly[i].x)+','+inttostr(spoly[i].y));
end;
end;



Gert Hansen (04-02-2004)
Kommentar
Fra : Gert Hansen


Dato : 04-02-04 11:12

> tekst-eksempel: 5: 0,16, 24,8, 16,-24, -16,-24, -24,8

5 ~ 5 koordinater
10 tal som udgør koordinaterne



resultatet i min debugMemo bliver:
5 {n_sides}
0,0 spoly[1].x,y
0,16 spoly[2].x,y
24,8 spoly[3].x,y
16,-24 spoly[4].x,y
-16,-24 spoly[5].x,y
-24,8 spoly[6].x,y



Nicolai Hansen (05-02-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 05-02-04 12:56

> {divString en en funktion som kan hive tallene ud af min komma-separerede
> text

^^^^ det var denne her jeg var mest interesseret i :)

Gert Hansen (05-02-2004)
Kommentar
Fra : Gert Hansen


Dato : 05-02-04 15:15

Den fungerer upåklageligt:

procedure divString(instr: string; var lstr: string; var rstr: string; divs:
string);
var
i: integer;
left: boolean;
begin
left:=true;
lstr:='';
rstr:='';
for i:=1 to length(instr) do
begin
if not left then
rstr:=rstr+instr[i]
else if instr[i]=divs[1] then
left:=false
else
lstr:=lstr+instr[i];
end;
end;

"Nicolai Hansen" <nic@aub.dk> skrev i en meddelelse
news:d96764ff.0402050355.1700873b@posting.google.com...
> > {divString en en funktion som kan hive tallene ud af min
komma-separerede
> > text
>
> ^^^^ det var denne her jeg var mest interesseret i :)



Nicolai Hansen (06-02-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 06-02-04 09:09

> Den fungerer upåklageligt:
>
> procedure divString(instr: string; var lstr: string; var rstr: string; divs:
> string);
> var
> i: integer;
> left: boolean;
> begin
> left:=true;
> lstr:='';
> rstr:='';
> for i:=1 to length(instr) do
> begin
> if not left then
> rstr:=rstr+instr[i]
> else if instr[i]=divs[1] then
> left:=false
> else
> lstr:=lstr+instr[i];
> end;
> end;

ser fint ud umiddelbart. har du prøvet at udlæse din lstr inde i dit strtoint loop?

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

Månedens bedste
Årets bedste
Sidste års bedste