Po përpiqem të shkruaj një program ku në thelb po përpiqem të kuptoj kombinimin e një bllokimi të kombinimit. Marr dy hyrje nga përdoruesi, numrin e numrave që do të rrotullohen (të cilin e kam quajtur indeks maksimal) dhe numrin më të lartë në të cilin mund të shkojë çdo numërues (të cilin e kam quajtur numër maksimal). Duke marrë këto dy inpute, thjesht po përpiqem të futem me forcë në bravë.
Pra, për të zgjidhur këtë problem, u përpoqa të marr një qasje rekursive siç shihet nga funksioni openHelper. Sa herë që krijohet një kombinim i plotë, ai testohet nga një funksion i veçantë testCombo, dhe nxjerr një nga tre vlerat. Nxjerr 1 nëse kombinimi funksionoi, -2 nëse kombinimi dështoi dhe nuk mund të provoni më, dhe -1 nëse kombinimi dështoi, por mund të vazhdoni të supozoni.
Megjithatë, kur e testoj këtë duke përdorur valgrind, marr këtë gabim në mënyrë të përsëritur: Procesi përfundon me veprimin e paracaktuar të sinjalit 11 (SIGSEGV).
A ka diçka që po bëj gabim me krijimin e vargjeve apo ka diçka të gabuar me mënyrën se si e kam dizajnuar programin?
#include <stdio.h>
#include <stdlib.h>
int openHelper(int *input, int *output, int current_index, int max_index,
int max_number);
int open(max_value, max_indices)
{
int numbers[max_value];
int test[max_indices];
int i;
int x;
/* Create array of all possible numbers */
for(i = 0; i < max_value; i++){
numbers[i] = i;
}
x = openHelper(numbers, test, 0, (max_indices - 1), max_value);
return x;
}
int openHelper(int *input, int *output, int current_index, int max_index,
int max_number)
{
int i;
int x;
for(i = 0; i < max_number; i++){
output[current_index] = input[i];
if(current_index == max_index){
x = testCombo(output);
if(x != -1){
return x;
}
}
else{
openHelper(input, output, (current_index + 1), max_index,
max_number);
}
}
}
Kombinimi i testit funksionon duke pasur një numërues brenda programit. Pra, nëse numëruesi është vendosur në 10 pas 10 përpjekjesh, ai do të kthehet -2. Sa herë që provohet një kombinim, numëruesi zvogëlohet.