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
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.