Marx är nöjd med hjälpen
Marx 357
Postad: 4 feb 2020 21:26 Redigerad: 4 feb 2020 21:27

Siffersumman av ett tal i Pascal

Jag har skrivit detta program med hjälp av "rekursiv funktion" i Pasal. Programmet ska räkna ut siffersumman av ett tal som ska matas in i programmet. Men efter compiling får jag detta svar 'segmentation fault'. Kan någon förklara vad det är som jag gjort fel och hur jag kan fixa det i så fall?

program digit_sum;
var
r,y,f,n:longint;
function sum(x:longint):longint;
begin
if x<10 then
sum:=x
else
r:=x mod 10;
y:=(x-r) div 10;
sum:=r+sum(y);
end;
begin
write('Enter a number: ');
read(n);
f:=sum(n);
write('The sum of digits is ',f);
end.

postitlapp 66
Postad: 4 feb 2020 21:37

Du fastnar i en oändlig loop till programmet kraschar.

Marx 357
Postad: 4 feb 2020 21:48
postitlapp skrev:

Du fastnar i en oändlig loop till programmet kraschar.

Hur? Vad behöver jag ändra på?

Laguna Online 28568
Postad: 5 feb 2020 05:24 Redigerad: 5 feb 2020 05:26
Marx skrev:
postitlapp skrev:

Du fastnar i en oändlig loop till programmet kraschar.

Hur? Vad behöver jag ändra på?

När x < 10 så utförs inte satsen efter "else", men de två efter det utförs. "else" omfattar bara en sats. Du får använda begin-end runt det som står efter "else".

Eftersom indenteringen är sabbad här (inte ditt fel, pluggakutens) så ser man inte hur det ser ut för dig, men om du använder nån editor som hjälper till med indenteringen, så ska första satsen efter "else" vara inskjuten, och resten inte, så då ser man tydligt att det är fel (om man har gjort såna fel tidigare).

Lindehaven 820 – Lärare
Postad: 5 feb 2020 10:25 Redigerad: 5 feb 2020 10:28

Det finns ytterligare ett problem. I funktionen sum så sätts värdet på den globala variabeln r varje gång vilket gör att programmet fungerar endast för ensiffriga eller tvåsiffriga tal. Gör variablerna r och y till lokala variabler i funktionen sum för att lösa detta.

Råd 1: använd globala variabler endast om du är tvungen.

Råd 2: tillåt inte funktioner att ändra värdet på globala variabler.

Marx 357
Postad: 7 feb 2020 11:30
Laguna skrev:
Marx skrev:
postitlapp skrev:

Du fastnar i en oändlig loop till programmet kraschar.

Hur? Vad behöver jag ändra på?

När x < 10 så utförs inte satsen efter "else", men de två efter det utförs. "else" omfattar bara en sats. Du får använda begin-end runt det som står efter "else".

Eftersom indenteringen är sabbad här (inte ditt fel, pluggakutens) så ser man inte hur det ser ut för dig, men om du använder nån editor som hjälper till med indenteringen, så ska första satsen efter "else" vara inskjuten, och resten inte, så då ser man tydligt att det är fel (om man har gjort såna fel tidigare).

Tack! Nu är problemet löst.

Svara Avbryt
Close