dlaczego copy tak robi? czadzik

0

Witka

Właśnie wpadłem na coś takiego i nie wiem czemu sie tak dzieje, może ktoś wytłumaczyć?

//...
var 
    TxTbufor : array[1..200] of char;
    tekst : string[200];
    xxx : string;
    i : Integer;
begin
for i := 0 to 200 do TxTbufor[i] := 'X' ;

tekst := copy(txtbufor,0,200); // zremuj to a nie bedzie działać

xxx := copy(txtbufor,0,200);
Label1.Caption := xxx;
end;

jak zremuje zaznaczoną linijke to mi błąd wywali, a tak to piknie działa? wie ktoś??

DzienX

0

//...
var
TxTbufor : array[1..200] of char; <---------- too jest tablica od 1 do 200
tekst : string[200];
xxx : string;
i : Integer;
begin
for i := 0 to 200 do TxTbufor[i] := 'X' ;

tekst := copy(txtbufor,0,200); <------------ a tutaj kopiujesz od elementu 0, który nie istnieje bo masz tablice od jeden.
xxx := copy(txtbufor,0,200);
Label1.Caption := xxx;
end;

Możesz zmienić tablice na array[0..200] of char lub kopiować od jedynki:
tekst := copy(txtbufor,1,200);

0

Problem leży tu:

var
TxTbufor : array[1..200] of char;
[...]
xxx := copy(txtbufor,0,200);

W obu miejscach musi zaczynać się od tego samego indeksu. A dlaczego tam działa? Szczerze, nie mam pojęcia :] Też mnie to zastanawia... Może to chodzi o to, że w deklaracji

var s:string[200]

istnieje element s[0]

 a przy <code class="delphi">var s:string

zaczyna się dopiero od s[1]

.

//Dopisane po chwili zastanowienia - to raczej nie to :P Bo jak jest tamta linia, to dziala... [???] 

//
```delphi
tekst := copy(txtbufor,0,200);

Tu sie (?) nie wysypuje. Poza tym jeśli jest taki kod, jak KIDo przedstawił, to działa (!) Tylko jak wywali tę linię tekst:=... to nie działa... [???] [???] [???]

0

nie chodzi tutaj o 0 czy tam 1, bo to bez różnicy co tam jest, chodzi o to czemu jak jest ta linijka to działa a jak jej nie ma to nie działa
nie wierzycie sprawdźcie sobie w delphi ja mam 7

// nawet jak jest <font color="red">tekst := copy(txtbufor,1,2);</span> to dziala, chodzi tylko o istnienie tej linijki :D magicznej

0

No rzeczywiście ciekawa sprawa :-) . Ale zamiast bawic sie w dodatkowe zmienne i copy czemu nie zrobisz po prostu:

var 
      TxTbufor : array[1..200] of char;
      xxx : string;
      i : Integer;
begin
for i := 0 to 200 do TxTbufor[i] := 'X' ;
xxx := txtbufor;
Label1.Caption := xxx;
end;
0

nie chodzi tutaj o 0 czy tam 1, bo to bez różnicy co tam jest, chodzi o to czemu jak jest ta linijka to działa a jak jej nie ma to nie działa
nie wierzycie sprawdźcie sobie w delphi ja mam 7

// nawet jak jest <font color="red">tekst := copy(txtbufor,1,2);</span> to dziala, chodzi tylko o istnienie tej linijki :D magicznej

0 czy 1 to nie jest bez różnicy( zresztą popraw i sprawdz).
A jesli chodzi dlaczego ta linijka wpływa na to że program się nie wysypuje to sprawa jest prosta:
TxTbufor[0] := 'X' ; wpisuje się w pamięci przed miejscem zarezerwowanym dla tablicy, czyli w tym wypadku w miejce zarezerwowane dla tekst (i to tylko dla tego że masz tekst[200], a nie tekst )
Jak zaremujesz linjikę ze zmienną tekst to linker wywala tą zmienną ze skompilowanego programu i TxTbufor[0] := 'X' wpisze się też przed tablicą tyle że tym razem tam nie ma zmiennej tekst tylko kod programu (lub inne dane które nie mogą być zmieniane)

0

juz poprawiłem, dzienX, a 0 i 1 to chodziło mi o to ze chyba nie w tym problem, bo i tak sie odpalało

0

stringi dzialaja dopiero od 1. 0 jest przeznaczone na cos innego

0

To jeszcze zagadka.
Kto wie (przed uruchomieniem) co bedzie w labelu po wykonaniu tej
procedury?

procedure TForm1.Button1Click(Sender: TObject);
Var
  tab :  array[3..3] of integer ;
  txt : string[12] ;
  i : integer ;
begin
  txt:='Co tu będzie' ;
  i := 0 ;   tab[i]:= -1671071165 ;
  i := 1 ;   tab[i]:=1869291750 ;
  i := 2 ;   tab[i]:=563897708 ;
  Label1.Caption:= txt ;
end;
0

Wypisze to samo (kwestia tylko kodowania konsoli):

{$APPTYPE CONSOLE}
Var
  tab:array[0..2]of integer;
  tc:array[0..12]of char absolute tab;
begin
  tab[0]:=-1671071165 ;
  tab[1]:=1869291750 ;
  tab[2]:=563897708 ;
  tc[12]:=^@ ; // in any case
  writeln(tc);
end.

<font color="white">{cześć koleś!}</span>

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0