Marx är nöjd med hjälpen!
Marx 110
Postad: 4 feb 2020 Redigerad: 4 feb 2020

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 70
Postad: 4 feb 2020

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

Marx 110
Postad: 4 feb 2020
postitlapp skrev:

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

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

Laguna 7722
Postad: 5 feb 2020 Redigerad: 5 feb 2020
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 381 – Leg. Lärare
Postad: 5 feb 2020 Redigerad: 5 feb 2020

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 110
Postad: 7 feb 2020
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