[delphi] błąd podczas zamiany małych liter na duże

Witam.

Piszę program, który odczytuje ciąg małych liter z pliku (ta część działa jak na razie dobrze), następnie zamieni je na duże, a następnie zapisze z powrotem do innego pliku (tego jeszcze nie ma). Niby zamiana znaków w pracy krokowej działa dobrze, jednak już przy pierwszym wykonaniu pętla przeskakuje (od zaznaczonej linijki), aż na sam koniec programu (żadne instrukcje się nie wykonują). Kompilator niestety nie jest zbyt gadatliwy, i nie pisze co mu nie pasuje :/. System windows 7 x64 kompilator delphi 2009.

var

  plik :text;

  i : integer;

  a:string;

  da:string;


  dlugosc:integer;

  znak:char;

  asci:integer;


begin

  assignfile(plik,'plik.txt');

  reset(plik);

  readln(plik,a);

  dlugosc:=length(a);

  for i := 1 to dlugosc do

    begin

      asci:=ord(a[i]);

      asci:=asci-32;

      znak:=char(asci);

      da[i]:=znak; // <-- od tej linijki się wysypuje

      writeln(da);

    end;






 close(plik);

 readln;


end.//<-- do tego momentu przeskakuje

Hehe, ale niezłą metodę sobie wymyśliłeś :wink:

W tym kodzie zbyt dużo rzeczy może pójść nie tak, co jeśli trafisz na dużą literę? Wtedy po odjęciu tych 32 wpadasz w nie ten zakres znaków który założyłeś… spacja to kod ascii 32, jak odejmiesz 32 to masz 0, nie widzę zabezpieczenie przed tym, writeln(da) powinno być poza pętlą zdaje się… zmienna plik nie powinna być czasami typu TextFile?

A tak btw. nie prościej użyć funkcji UpperCase?

var

  f: TextFile;

  a: String;

begin

  AssignFile(f, 'plik.txt');

  Reset(f);

  while not EoL(f) do

  begin

    readln(f, a);

    writeln(UpperCase(a));

  end;

  CloseFile(f);

end;

Błąd polega na tym że nie ustaliłeś rozmiaru napisu da :

dlugosc:=length(a);setlength(da,dlugosc); [/code]Z tym że rada od [b]M@ster[/b]'a jest o wiele lepsza niż to co ty napisałeś. Jeżeli koniecznie chcesz mieć to w innej zmiennej to: da:=UpperCase(a);

W założeniu zadania jest że to są tylko małe litery … nie chcę używać uppercase, bo to byłoby trochę za proste. Co do tego writeln, to masz rację (przeoczenie z mojej strony, gdyż wcześniej tak było). Z tą spacją i znakami słuszna uwaga (chociaż w moim przypadku to i tak by nie wystąpiło). Co do typu zmiennej to nie mam pojęcia, coś takiego na wykładzie nam strzelili, jednak raczej zastosuję textfile (w tutorialach wszędzie to podają). Wprowadziłem te wszystkie zmiany, jednak problem jak był, tak jest. Macie może jeszcze jakieś pomysły ?

var

  plik :TextFile;

  i : integer;

  a:string;

  da:string;


  dlugosc:integer;

  znak:char;

  asci:integer;


begin

  assignfile(plik,'plik.txt');

  reset(plik);

  readln(plik,a);

  dlugosc:=length(a);

  for i := 1 to dlugosc do

    begin

      asci:=ord(a[i]);

      if asci=32 then da[i]=' ';

      if (asci>96) and (asci<123) then

         begin

            asci:=asci-32;

            znak:=char(asci);

            da[i]:=znak;

         end;

    end;

  writeln(da);

  close(plik);

  readln;


end.

// edit @alex - nie zauważyłem twojego postu. Dzięki. Działa jak złoto.

Dalej nie zastosowałeś porady alexa… odwołujesz się do znaku stringa który jest zerowej długości.

Jest jeszcze jedna możliwość w pętle:

      znak:=a[i];'a'=znak) and (znak='z') then znak:=char(ord(znak)-32);da:=da+znak; [/code]