Pascal - External:SIGSEGV
program dopis16;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
var
pole:array [0..255] of string;
k,kousek:string;
i,y,m,n,j:integer;
begin
readln(k);
readln(n);
y:=0;
i:=0;
m:=0;
repeat
readln(pole[m]);
kousek:=pole[m];
m:=m+1;
repeat
i:=i+1;
repeat
y:=y+1;
if (y=length(k)) and (i<>length(kousek)) then
begin
writeln('NE');
end;
until (kousek[i]=k[y]);
until (length(kousek)=i) or (y=length(k));
if (length(kousek)=i) and (y<=length(k)) then
writeln('ANO');
until (m=n);
readln;
end.
Tady je můj program. Na prvním řádku zadám řetězec, na dalším počet dalších, kratších řetězců a potom je zadávám. Vypíše mi to jestli se z každého kratšího řetězce dá složit ten hlavní. Problém je v tom, že po zadání 2 řetězce mi vyskočí okno s hláškou External:SIGSEGV a program se zasekne. Ví někdo jak to napravit?
Debuggerem bys to zjistil přímo. Pokud ho ale z nějakých důvodů nechceš použít, pak testuj jednotlivé funkční celky (nejen od toho jsou funkce) jako puzzle, od nejmenších až po celý program.
Takže bych začal testovat, jestli funkci zkoumající sestavení řetězce z pole kousek a celý program (díky jednoduchosti programu to je všechno.) Chce to určité programátorské myšlení a umět programovat top-bottom(načrtnu celý program a dostávám se k detailům) nebo bottom-up(začnu s elementárními funkcemi a prostoupím k hotovému programu) a přijít, kdy je jaký způsob vhodnější.
Napsat takovýhle prográmek na 48 řádků(i přes to, že jsem započítal prádzné řádky) musí být velké úmění. Ještě když se k tomu připočte vícenásobné zanoření, tak se v tom opravdu člověk ztratí.
Opakuji znova, že daný program všeho všudy potřebuje 1 proměnné a sice na hlavní řetězec.
Opravdu to musí být PissCall? Na můj návrh si koukal?
PS, kdo tam najde jedno místo, které se dá optimalizovat, vyhrává cenu.
V ničem jiném neumím. To že je to hodně složité mě moc netrápí, jsem rád že to mám aspoň takhle. Ta chyba je nějak spojena s tím polem. Dokud tam nebylo a načítal jsem jenom jeden kratší řetězec, tak vše fungovalo.
Nikdo nepřišel na to co s tím?
mno...
ty asi chceš napřed všechny podřetězce načíst do pole a pak zpracovat, ale to tvůj program nedělá. Ty načteš hlavní řetězec (k), zřejmě počet podřetězců (n) a pak se pokoušíš načíst do pole podřetězce. Jenže načteš jeden do pole a začneš hned porovnávat.
A tam se v tom zamotáš.
Takže napřed načíst všechno do pole
a teď máš všechny podřetězce v poli a můžeš porovnávat -
jestli chceš mermo použít proměnnou kousek tak postupně dávat kousek:=pole[m] a v dalším cyklu testovat řetězec kousek proti řetězci k.
Pozor ať se ti cykly nezkříží.
A nenech se otrávit. Každý nějak začínal.