Principiantec++
28-03-2011, 10:24
Ciao a tutti.
Questo è il mio primo messaggio da utente principiante di C++.
Mi trovo a dover programmare un progetto per un seminario che ho frequentato e ho alcune difficoltà, ricorrendo costantemente, al momento del run del programma, nel messaggio "segmentation fault".
Ho cercato a lungo online suggerimenti su come risolvere questo problema. Nella maggior parte delle volte, sembra che questo problema ricorra se il programma non riesce ad uscire da un ciclo.
Nel mio caso ho una versione del programma funzionante, aggiungo poi un nuovo if all'interno di un ciclo precedentemente esistente e questo mi crea la segnalazione di segmentation fault.
Non capisco come risolvere questo problema.
Provo a postare solo la parte del programma che va a creare problemi, specificando a seguire le mie variabili.
Parte del programma funzionante, dove segno in rosso la parte che poi vado a modificare con un nuovo if:
for (int i=0; i<S; i++) {
y=0;
sum=0;
while (y<T*h*Nt) {
if (Demands[i]>sum*l) { //Demand of section i is not already satisfied
sum1=0;
sum2=0;
sum3=0;
sum4=0;
sum5=0;
sum7=0;
sum9=0;
temp1=Team[i][y];
temp2=Day[i][y];
temp3=TimeWindow[i][y];
//sum1
for (int j=0; j<S; j++) {
for (int p=0; p<Nt; p++) {
sum2=sum1+StaffRoster[j][temp1][temp2][p];
sum1=sum2;
}
}
//sum3
for (int j=0; j<S; j++) {
sum4=sum3+StaffRoster[j][temp1][temp2][temp3];
sum3=sum4;
}
FirstConsecutiveShift=temp3-1;
SecondConsecutiveShift=temp3+1;
//sum5
if (FirstConsecutiveShift<0) {
sum5=0;
}
else {
for (int j=0; j<S; j++) {
if (StaffRoster[j][temp1][temp2][FirstConsecutiveShift]>0) {
sum5=1;
FirstSectionToCheck=j;
}
}
}
//sum7
if (SecondConsecutiveShift==Nt) {
sum7=0;
}
else {
for (int j=0; j<S; j++) {
if (StaffRoster[j][temp1][temp2][SecondConsecutiveShift]>0) {
sum7=1;
SecondSectionToCheck=j;
}
}
}
//sum9
sum9=sum1-sum3-sum5-sum7;
//Start procedure to assign shifts
if (Holiday[temp2][temp1*2-1]+Holiday[temp2][temp1*2]>1) {
y++;
}
else {
if (sum9>0) {
y++;
}
else {
if (sum5>0) {
if (Adjacent[i][FirstSectionToCheck]>0) {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
else {
y++;
}
}
else {
if (sum7>0) {
if (Adjacent[i][SecondSectionToCheck]>0) {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
}
else {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
}
}
}
}
else {
//Demand of section i is already satisfied
y=T*h*Nt;
}
}
}
Questa parte di programma, inserita nel programma intero, in cui ho le seguenti variabili lette da file, che alloco con il comado new e poi cancello con il comando delete al termine dei calcoli, si compila correttamente e al momento del run non da nessun errore e l'output risulta corretto.
int S, T, l, h, m, Nt;
int FeasibleSections[S][T]; //che assume solo valori 0 e 1
int Adjacent[S][S]; //che assume solo valori 0 e 1
int Holiday[h][T*2]; //che assume solo valori 0 e 1
double Profits1[S];
double Profits2[Nt];
double Profits3[h];
double Costs[T][h*Nt];
int Demands[S];
E le seguenti calcolate durante passaggi precedenti del programma:
int Team[S][T*h*Nt];
int Day[S][T*h*Nt];
int TimeWindow[S][T*h*Nt];
int temp1, temp2, temp3, temp4;
int StaffRoster[S][T][h][Nt]; //che assume solo valore 0 o 1
int y;
int sum, sum1, sum2, sum3, sum4, sum5, sum7, sum9;
int FirstConsecutiveShift, SecondConsecutiveShift, FirstSectionToCheck, SecondSectionToCheck;
Se apporto la seguente modifica nel programma, indicata in blu, il programma si compila correttamente ma al momento del run mi dice "segmentation fault".
for (int i=0; i<S; i++) {
y=0;
sum=0;
while (y<T*h*Nt) {
if (Demands[i]>sum*l) { //Demand of section i is not already satisfied
sum1=0;
sum2=0;
sum3=0;
sum4=0;
sum5=0;
sum7=0;
sum9=0;
temp1=Team[i][y];
temp2=Day[i][y];
temp3=TimeWindow[i][y];
//sum1
for (int j=0; j<S; j++) {
for (int p=0; p<Nt; p++) {
sum2=sum1+StaffRoster[j][temp1][temp2][p];
sum1=sum2;
}
}
//sum3
for (int j=0; j<S; j++) {
sum4=sum3+StaffRoster[j][temp1][temp2][temp3];
sum3=sum4;
}
FirstConsecutiveShift=temp3-1;
SecondConsecutiveShift=temp3+1;
//sum5
if (FirstConsecutiveShift<0) {
sum5=0;
}
else {
for (int j=0; j<S; j++) {
if (StaffRoster[j][temp1][temp2][FirstConsecutiveShift]>0) {
sum5=1;
FirstSectionToCheck=j;
}
}
}
//sum7
if (SecondConsecutiveShift==Nt) {
sum7=0;
}
else {
for (int j=0; j<S; j++) {
if (StaffRoster[j][temp1][temp2][SecondConsecutiveShift]>0) {
sum7=1;
SecondSectionToCheck=j;
}
}
}
//sum9
sum9=sum1-sum3-sum5-sum7;
//Start procedure to assign shifts
if (Holiday[temp2][temp1*2-1]+Holiday[temp2][temp1*2]>1) {
y++;
}
else {
if (sum9>0) {
y++;
}
else {
if (sum3>0) {
y++;
}
else {
if (sum5>0) {
if (Adjacent[i][FirstSectionToCheck]>0) {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
else {
y++;
}
}
else {
if (sum7>0) {
if (Adjacent[i][SecondSectionToCheck]>0) {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
}
else {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
}
}
}
}
else {
//Demand of section i is already satisfied
y=T*h*Nt;
}
}
}
Mi aiutereste a capire come mai, inserendo questo IF, il run non funziona più?
Quali possono essere i possibili motivi di questa cosa?
Vi ringrazio per l'aiuto e spero di aver inserito correttamente tutti i dati necessari per capire la mia domanda.
Questo è il mio primo messaggio da utente principiante di C++.
Mi trovo a dover programmare un progetto per un seminario che ho frequentato e ho alcune difficoltà, ricorrendo costantemente, al momento del run del programma, nel messaggio "segmentation fault".
Ho cercato a lungo online suggerimenti su come risolvere questo problema. Nella maggior parte delle volte, sembra che questo problema ricorra se il programma non riesce ad uscire da un ciclo.
Nel mio caso ho una versione del programma funzionante, aggiungo poi un nuovo if all'interno di un ciclo precedentemente esistente e questo mi crea la segnalazione di segmentation fault.
Non capisco come risolvere questo problema.
Provo a postare solo la parte del programma che va a creare problemi, specificando a seguire le mie variabili.
Parte del programma funzionante, dove segno in rosso la parte che poi vado a modificare con un nuovo if:
for (int i=0; i<S; i++) {
y=0;
sum=0;
while (y<T*h*Nt) {
if (Demands[i]>sum*l) { //Demand of section i is not already satisfied
sum1=0;
sum2=0;
sum3=0;
sum4=0;
sum5=0;
sum7=0;
sum9=0;
temp1=Team[i][y];
temp2=Day[i][y];
temp3=TimeWindow[i][y];
//sum1
for (int j=0; j<S; j++) {
for (int p=0; p<Nt; p++) {
sum2=sum1+StaffRoster[j][temp1][temp2][p];
sum1=sum2;
}
}
//sum3
for (int j=0; j<S; j++) {
sum4=sum3+StaffRoster[j][temp1][temp2][temp3];
sum3=sum4;
}
FirstConsecutiveShift=temp3-1;
SecondConsecutiveShift=temp3+1;
//sum5
if (FirstConsecutiveShift<0) {
sum5=0;
}
else {
for (int j=0; j<S; j++) {
if (StaffRoster[j][temp1][temp2][FirstConsecutiveShift]>0) {
sum5=1;
FirstSectionToCheck=j;
}
}
}
//sum7
if (SecondConsecutiveShift==Nt) {
sum7=0;
}
else {
for (int j=0; j<S; j++) {
if (StaffRoster[j][temp1][temp2][SecondConsecutiveShift]>0) {
sum7=1;
SecondSectionToCheck=j;
}
}
}
//sum9
sum9=sum1-sum3-sum5-sum7;
//Start procedure to assign shifts
if (Holiday[temp2][temp1*2-1]+Holiday[temp2][temp1*2]>1) {
y++;
}
else {
if (sum9>0) {
y++;
}
else {
if (sum5>0) {
if (Adjacent[i][FirstSectionToCheck]>0) {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
else {
y++;
}
}
else {
if (sum7>0) {
if (Adjacent[i][SecondSectionToCheck]>0) {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
}
else {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
}
}
}
}
else {
//Demand of section i is already satisfied
y=T*h*Nt;
}
}
}
Questa parte di programma, inserita nel programma intero, in cui ho le seguenti variabili lette da file, che alloco con il comado new e poi cancello con il comando delete al termine dei calcoli, si compila correttamente e al momento del run non da nessun errore e l'output risulta corretto.
int S, T, l, h, m, Nt;
int FeasibleSections[S][T]; //che assume solo valori 0 e 1
int Adjacent[S][S]; //che assume solo valori 0 e 1
int Holiday[h][T*2]; //che assume solo valori 0 e 1
double Profits1[S];
double Profits2[Nt];
double Profits3[h];
double Costs[T][h*Nt];
int Demands[S];
E le seguenti calcolate durante passaggi precedenti del programma:
int Team[S][T*h*Nt];
int Day[S][T*h*Nt];
int TimeWindow[S][T*h*Nt];
int temp1, temp2, temp3, temp4;
int StaffRoster[S][T][h][Nt]; //che assume solo valore 0 o 1
int y;
int sum, sum1, sum2, sum3, sum4, sum5, sum7, sum9;
int FirstConsecutiveShift, SecondConsecutiveShift, FirstSectionToCheck, SecondSectionToCheck;
Se apporto la seguente modifica nel programma, indicata in blu, il programma si compila correttamente ma al momento del run mi dice "segmentation fault".
for (int i=0; i<S; i++) {
y=0;
sum=0;
while (y<T*h*Nt) {
if (Demands[i]>sum*l) { //Demand of section i is not already satisfied
sum1=0;
sum2=0;
sum3=0;
sum4=0;
sum5=0;
sum7=0;
sum9=0;
temp1=Team[i][y];
temp2=Day[i][y];
temp3=TimeWindow[i][y];
//sum1
for (int j=0; j<S; j++) {
for (int p=0; p<Nt; p++) {
sum2=sum1+StaffRoster[j][temp1][temp2][p];
sum1=sum2;
}
}
//sum3
for (int j=0; j<S; j++) {
sum4=sum3+StaffRoster[j][temp1][temp2][temp3];
sum3=sum4;
}
FirstConsecutiveShift=temp3-1;
SecondConsecutiveShift=temp3+1;
//sum5
if (FirstConsecutiveShift<0) {
sum5=0;
}
else {
for (int j=0; j<S; j++) {
if (StaffRoster[j][temp1][temp2][FirstConsecutiveShift]>0) {
sum5=1;
FirstSectionToCheck=j;
}
}
}
//sum7
if (SecondConsecutiveShift==Nt) {
sum7=0;
}
else {
for (int j=0; j<S; j++) {
if (StaffRoster[j][temp1][temp2][SecondConsecutiveShift]>0) {
sum7=1;
SecondSectionToCheck=j;
}
}
}
//sum9
sum9=sum1-sum3-sum5-sum7;
//Start procedure to assign shifts
if (Holiday[temp2][temp1*2-1]+Holiday[temp2][temp1*2]>1) {
y++;
}
else {
if (sum9>0) {
y++;
}
else {
if (sum3>0) {
y++;
}
else {
if (sum5>0) {
if (Adjacent[i][FirstSectionToCheck]>0) {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
else {
y++;
}
}
else {
if (sum7>0) {
if (Adjacent[i][SecondSectionToCheck]>0) {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
}
else {
StaffRoster[i][temp1][temp2][temp3]=1;
y++;
sum++;
}
}
}
}
}
else {
//Demand of section i is already satisfied
y=T*h*Nt;
}
}
}
Mi aiutereste a capire come mai, inserendo questo IF, il run non funziona più?
Quali possono essere i possibili motivi di questa cosa?
Vi ringrazio per l'aiuto e spero di aver inserito correttamente tutti i dati necessari per capire la mia domanda.