Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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?

Předmět Autor Datum
Debuggerem bys to zjistil přímo. Pokud ho ale z nějakých důvodů nechceš použít, pak testuj jednotliv…
mnua.al 19.12.2013 19:20
mnua.al
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…
qui 19.12.2013 19:34
qui
Nikdo nepřišel na to co s tím?
qui 19.12.2013 20:37
qui
mno... ty asi chceš napřed všechny podřetězce načíst do pole a pak zpracovat, ale to tvůj program ne… poslední
viva 19.12.2013 23:02
viva

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.

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

...
  readln(k); //hlavni retezec
  readln(n); //pocet podretezcu
  m:=0;
  repeat
    readln(pole[m]);
    m:=m+1;
  until m=n;
...

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.

Zpět do poradny Odpovědět na původní otázku Nahoru