Permalänk
Medlem

problem med segmentation fault

Sitter här och testar med lite process schedulering i C och får ett problem med segmentation fault. Men jag kan inte hitta något fel i koden som ska kunna ställa till det. Någon som kan hjälpa.
Kom ihåg att koden är under utveckling så den är lite rörig.

#include <stdio.h>
#include <stdlib.h>

/* Function Prototype Declarations */
void fcfs (int pid[], int burst[], int priority[], int pNo);
/*void listprocs (int pid[], int burst[], int priority[]);
void rr (int pid[], int burst[], int priority[], int working[], int waiting[], int quantum);*/

/* Main Program Segment */
int main (void) {

int pNo; /*Antal processer*/
int pid[pNo]; /* Process ID */
int burstFCFS[pNo]; /* CPU Burst Time för FCFS */
int burstRR[pNo]; /*CPU Burst Time för RR*/
int priority[pNo]; /* Priority */
int working[pNo]; /* Working time, for round-robin scheduling */
int waiting[pNo]; /* Waiting time, for round-robin scheduling */
int q;
int i, j;

printf("Input number of processes (1 to 10) for each queue: ");
scanf("%d", &pNo);

for(i=0; i <= pNo; i++){
printf("Enter values for burst times for FCFS: ");
scanf("%d", &burstFCFS[i]);
}

/*for(i=0; i<pNo; i++){
printf("Enter arrival times: ");
scanf("%d", &);
}*/

printf("Enter quantum for RR:: ");
scanf("%d", &q);

for(j=0; i <= pNo; j++){
printf("Enter values for burst times for RR: ");
scanf("%d", &burstRR[j]);
}

/* Perform simulations */
/*listprocs(pid, burst, priority);*/
/*rr(pid, burstRR, priority, working, waiting, q);*/
fcfs(pid, burstFCFS, priority, pNo);

return(0);
};

/* First-Come-First-Served scheduling simulation */
void fcfs (int pid[], int burst[], int priority[], int pNo) {
int time = 0, start, end, i;
/*struct process *tmp = proc;*/

printf("BEGIN:\tFirst-Come-First-Served scheduling simulation\n");

for(i = 0; i <= pNo; i++){
start = time;
time += burst[i];
end = time;
printf("Process: %d\tEnd Time: %d\tWaiting: %d\tTurnaround: %d\n", pid[i], time, start, end);
}

printf("END:\tFirst-Come-First-served scheduling simulation\n\n");
}

Visa signatur

Pentium 4 2.4 Ghz, Abit IS7-E, 500gb hd, Gainward Geforce FX5900 128 mb, 1024 mb ddr 400 mhz

Permalänk
Medlem

kastade en snabb blick...

int pNo som du har i början, du använder ju den direkt utan att ha satt något värde. Denna måste väl förövrigt vara const int, jag tycker du borde få kompileringsfel.

const int pNo = 25; då fungerar iaf alla arrayerna du deklarerar där under.

Men det kanske jag som är dum... har bråttom..

Permalänk
Medlem

Hehe okej, där ser man, det var så enkelt. Glömde bort det med const, då fungerade det.
Tack för hjälpen

Visa signatur

Pentium 4 2.4 Ghz, Abit IS7-E, 500gb hd, Gainward Geforce FX5900 128 mb, 1024 mb ddr 400 mhz

Permalänk
Glömsk

Gör dig själv en tjänst och lär dig hur man använder en debugger. Livet blir så mycket enklare.

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

struct fel

Jag glömde bort att det var samma program jag skrev om på den här tråden också, men det här är en fortsättning på tråden http://forum.sweclockers.com/showthread.php?s=&threadid=57330...
Jag har korrigerat i koden som jag lade upp där, jag har kommit förbi det problemet, nu har jag istället problem med att jag inte får in all information jag läser in i structen. Jag förstår ingenting och har testat allt jag kommer på. Någon som ser något fel?

Koden ser ut så här nu:

#include <stdio.h> #include <stdlib.h> struct process { int pid; /* Process ID */ int burst; /* CPU Burst Time */ int working; /* Working time, for round-robin scheduling */ int waiting; /* Waiting time, for round-robin scheduling */ struct process *next; }; typedef struct process Process; /*Synonym för struct process*/ typedef Process *ProcessList; /*Synonym för Process*/ /* Funktions prototyper*/ struct process *init_process (int pid, int burst); void listprocs (struct process *proc); void fcfs (int pid[], int burst[], const int pNo); void rr (struct process *proc, int quantum, const int pNo); int main (void) { ProcessList startList = NULL; struct process *plist, *ptmp; const int pNo = 10; /*Antal processer*/ int pid[pNo]; /* Process ID */ int burstFCFS[pNo]; /* CPU Burst Time för FCFS */ int burstRR[pNo]; int q, pass; int i, j, k, l; pass = 0; printf("Input number of processes (1 to 10) for each queue: "); scanf("%d", &pNo); pid[0] = 1; for(i = 1; i < pNo; i++){ pid[i] = pid[i-1] + 1; } printf("Enter values for burst times for FCFS: \n"); for(j=0; j < pNo; j++){ scanf("%d", &burstFCFS[j]); } printf("Enter quantum for RR:: "); scanf("%d", &q); pass = 0; plist = NULL; printf("Enter values for burst times for RR: \n"); while(pass < pNo){ scanf("%d", &burstRR[k]); plist = init_process(pass+1, burstRR[k]); plist->next; pass++; }; /* Kör simuleringarna */ listprocs(plist); fcfs(pid, burstFCFS, pNo); rr(plist, q, pNo); return(0); }; struct process *init_process (int pid, int burst) { struct process *proc; proc = malloc(sizeof(struct process)); if (proc == NULL) { printf("Fatal error: memory allocation failure.\nTerminating.\n"); exit(1); }; proc->pid = pid; proc->burst = burst; proc->working = 0; proc->waiting = 0; proc->next = NULL; return(proc); }; /* Process listing */ void listprocs (struct process *proc) { struct process *tmp = proc; printf("BEGIN:\tProcess Listing\n"); while (tmp != NULL) { printf("PID: %d\t\tBurst: %d\n", tmp->pid, tmp->burst); tmp = tmp->next; }; printf("END:\tProcess Listing\n\n"); }; /* First-Come-First-Served scheduling simulation */ void fcfs (int pid[], int burst[], const int pNo) { int time = 0, start, end, i; printf("BEGIN:\tFirst-Come-First-Served scheduling simulation\n"); for(i = 0; i < pNo; i++){ start = time; time += burst[i]; end = time; printf("Process: %d\tEnd Time: %d\tWaiting: %d\tTurnaround: %d\n", pid[i], time, start, end); } printf("END:\tFirst-Come-First-served scheduling simulation\n\n"); } /* Round-Robin scheduling simulation */ void rr (struct process *proc, int quantum, const int pNo) { int end, i, pass, jobsremain; struct process *copy, *tmpsrc, *tmp, *slot; pass = 0; printf("BEGIN:\tRound-Robin scheduling simulation (Quantum: %d)\n", quantum); /*Kopiera process listan*/ tmpsrc = proc; copy = NULL; tmp = NULL; while (tmpsrc != NULL) { if (copy == NULL) { copy = init_process(tmpsrc->pid, tmpsrc->burst); tmp = copy; } else { tmp->next = init_process(tmpsrc->pid, tmpsrc->burst); tmp = tmp->next; }; tmpsrc = tmpsrc->next; }; /* Huvudrutinen*/ jobsremain = 1; slot = NULL; while (jobsremain) { jobsremain = 0; /* Välja nästa lediga slot */ if (slot == NULL) { slot = copy; jobsremain = 1; } else { pass = 0; do { if (slot->next == NULL) { pass++; slot = copy; } else { slot = slot->next; }; } while (pass <= 2 && slot->burst == slot->working); if (pass <= 2) { jobsremain = 1; }; }; /* Kör en cykel */ tmp = copy; while (tmp != NULL) { if (tmp->burst > tmp->working) { if (tmp == slot) { tmp->working += quantum; } else { tmp->waiting += quantum; }; }; tmp = tmp->next; }; }; tmp = copy; /*Skriv ut resultaten*/ while(tmp != NULL) { printf("Process: %d\tWorking: %d\tWaiting: %d\tTurnaround: %d\n", tmp->pid, tmp->working, tmp->waiting, tmp->working + proc->waiting); tmpsrc = tmp; tmp = tmp->next; free(tmpsrc); }; printf("END:\tRR scheduling simulation\n\n"); };

Någon som kan se vad är fel? Jag försöker alltså som sagt skriva in grejer i structen, men bara det sista jag skriver in verkar ligga där..

Visa signatur

Pentium 4 2.4 Ghz, Abit IS7-E, 500gb hd, Gainward Geforce FX5900 128 mb, 1024 mb ddr 400 mhz

Permalänk
Medlem

scanf("%d", &burstRR[k]);

k sätts aldrig, så du försöka accessa ett element bortom arrayens dimension.

Ett tips kan ju vara att kompilera med varningar påslaget också, så får man bland annat den här:

swec.c:35: warning: writing into constant object (argument 2)

Där försöker du skriva till pNo, som är definierad som const, och som dessutom används som arraystorlek (mha ett gcc-extension, får man anta). Det där är inte rätt sätt att göra en array av dynamisk storlek, använd malloc istället.

Jag kan bara upprepa Psionicists rekommendation om att använda en debugger, då hade du fått en backtrace direkt.

Permalänk
Medlem

jag visste väl att det var några helt galna fel med dessa två rader från förra frågeställningen...
copy = tmpsrc->pid, tmpsrc->burst;
tmp->next = tmpsrc->pid, tmpsrc->burst;

jaja, ang. vad som är fel nu så kan du åtgärda det som m0rris påpekat först, och jag säger också: Aktivera varningarna! Oj så mycket lättare det kommer att bli...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m0rris

scanf("%d", &burstRR[k]);

k sätts aldrig, så du försöka accessa ett element bortom arrayens dimension.

Ett tips kan ju vara att kompilera med varningar påslaget också, så får man bland annat den här:

swec.c:35: warning: writing into constant object (argument 2)

Där försöker du skriva till pNo, som är definierad som const, och som dessutom används som arraystorlek (mha ett gcc-extension, får man anta). Det där är inte rätt sätt att göra en array av dynamisk storlek, använd malloc istället.

Jag kan bara upprepa Psionicists rekommendation om att använda en debugger, då hade du fått en backtrace direkt.

skälet till att det stod k där var att jag använde en for loop där tidigare, men ändrade till en while loop av någon anledning, nu har jag ändrat till en variabel som heter pass.
Jag har försökt mig på att använda malloc och variabeln pNo är inte const längre, jag har bara gjort ändringar i main så jag lägger in den koden:

int main (void) { ProcessList startList = NULL; struct process *plist, *ptmp; int pNo; int *p; /*Antal processer*/ int pid[10]; /* Process ID */ int burstFCFS[10]; /* CPU Burst Time för FCFS */ int burstRR[10]; int q, pass; int i, j, k, l; p = (int*)malloc(sizeof(int)* pNo); pass = 0; printf("Input number of processes (1 to 10) for each queue: "); scanf("%d", &pNo); pid[0] = 1; for(i = 1; i < pNo; i++){ pid[i] = pid[i-1] + 1; } printf("Enter values for burst times for FCFS: \n"); for(j=0; j < pNo; j++){ scanf("%d", &burstFCFS[j]); } printf("Enter quantum for RR:: "); scanf("%d", &q); pass = 0; plist = NULL; printf("Enter values for burst times for RR: \n"); while(pass < pNo){ scanf("%d", &burstRR[pass]); plist = init_process(pass+1, burstRR[pass]); plist->next; pass++; }; /* Kör simuleringarna */ listprocs(plist); fcfs(pid, burstFCFS, pNo); rr(plist, q, pNo); return(0); };

Jag är dock lite osäker på om jag fick till det riktigt med den dynamiska arrayen som du nämner. Jag får nu bara varningar om oanvända variabler, men det är något jag kommer åtgärda när jag är färdig.
Önskar jag kunde använda en debugger, men har inte riktigt tid att lära mig att använda en nu, har bara lite kort erfarenhet av det från för ungefär 2 år sen.. Men det är absolut något jag ska sätta mig in i när det här är klart. Har förstått att det skulle underlätta.

Visa signatur

Pentium 4 2.4 Ghz, Abit IS7-E, 500gb hd, Gainward Geforce FX5900 128 mb, 1024 mb ddr 400 mhz

Permalänk
Medlem

Jag noterade precis att du faktiskt säger att pNo ska vara mellan 1 och 10, så då behöver du egentligen inte allokera arrayerna dynamiskt, utan räcker med pid[10] som du har där. My bad. Koden funkar som det är nu, så du kan ta bort det där med malloc().

Däremot kan det vara bra att kolla att pNo faktiskt inte överstiger 10, eftersom du då också skulle försöka accessa element utanför arrayens gränser.

En grej till förresten, i sista whileloopen har du:

plist->next;

Det statementet gör ingenting. Jag antar du försöker göra nån sorts länkad lista, så du behöver nog assigna något till plist->next. Kanske behålla en referens till plist från förra loopen och sätta dess next till den här loopens plist?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m0rris
Jag noterade precis att du faktiskt säger att pNo ska vara mellan 1 och 10, så då behöver du egentligen inte allokera arrayerna dynamiskt, utan räcker med pid[10] som du har där. My bad. Koden funkar som det är nu, så du kan ta bort det där med malloc().

Däremot kan det vara bra att kolla att pNo faktiskt inte överstiger 10, eftersom du då också skulle försöka accessa element utanför arrayens gränser.

En grej till förresten, i sista whileloopen har du:

plist->next;

Det statementet gör ingenting. Jag antar du försöker göra nån sorts länkad lista, så du behöver nog assigna något till plist->next. Kanske behålla en referens till plist från förra loopen och sätta dess next till den här loopens plist?

Jag skrev inte det till en början, utan ändrade till 10, det stod pNo till en början där, men som koden är nu skulle jag lika gärna kunna sätta pNo som storleken på arrayerna?

antar att det är denna array du menar, jag har nu gjort dessa ändringar, men nu verkar det ännu sämre, nu verkar listan helt tom istället för att ha sista argumentet i sig.

while(pass < pNo){ scanf("%d", &burstRR[pass]); plist = init_process(pass+1, burstRR[pass]); ptmp = plist; plist = plist->next; pass++; };

Visa signatur

Pentium 4 2.4 Ghz, Abit IS7-E, 500gb hd, Gainward Geforce FX5900 128 mb, 1024 mb ddr 400 mhz

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av aal
Jag skrev inte det till en början, utan ändrade till 10, det stod pNo till en början där, men som koden är nu skulle jag lika gärna kunna sätta pNo som storleken på arrayerna?

Varför inte bara lämna dem som array[10] istället för array[pNo]? Det senare är ett gcc-extension, och fyller väldigt lite funktion här. Inte så jättesnyggt att skapa arrayer baserade på pNo och sedan ändra pNo.

Citat:

Ursprungligen inskrivet av aal

while(pass < pNo){ scanf("%d", &burstRR[pass]); plist = init_process(pass+1, burstRR[pass]); ptmp = plist; plist = plist->next; pass++; };

Det ser inte riktigt rätt ut, ptmp används ju aldrig, och plist ändras till plist->next som jag antar är NULL från början. Kanske nåt sånt här istället:

ptmp = NULL; while(pass < pNo){ scanf("%d", &burstRR[pass]); plist = init_process(pass+1, burstRR[pass]); plist->next = ptmp; ptmp = plist; pass++; };

Så att plist->next sätts till den föregående iterations plist varje gång.

Permalänk
Medlem

Tack nu funkade det bättre, men av någon anledning så går det inte så bra när det kommer ner till funktionen rr, programmet stannar upp i körningen efter det här:

Input number of processes (1 to 10) for each queue: 3 Enter values for burst times for FCFS: 24 3 3 Enter quantum for RR:: 4 Enter values for burst times for RR: 24 3 4 BEGIN: Process Listing PID: 3 Burst: 4 PID: 2 Burst: 3 PID: 1 Burst: 24 END: Process Listing BEGIN: First-Come-First-Served scheduling simulation Process: 1 End Time: 24 Waiting: 0 Turnaround: 24 Process: 2 End Time: 27 Waiting: 24 Turnaround: 27 Process: 3 End Time: 30 Waiting: 27 Turnaround: 30 END: First-Come-First-served scheduling simulation BEGIN: Round-Robin scheduling simulation (Quantum: 4)

koden i funktionerna är desamma som tidigare. Kan det vara så att det tas emot på fel sätt i funktionen?

EDIT: Vid en testkörning upptäckte jag nu att om jag sätter quantum till 1 så fungerar programmet, någon som kan förstå varför, jag är helt låst på vad som får programmet att låsa för att quantum är större än 1.. Tacksam för hjälp..

Visa signatur

Pentium 4 2.4 Ghz, Abit IS7-E, 500gb hd, Gainward Geforce FX5900 128 mb, 1024 mb ddr 400 mhz