Programim dhe zhvillim, javascript, python, php, html

Permutacione me përsëritje në C; Gabime Valgrind

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.

30.01.2015

  • Ku thotë valgrind se ka ndodhur gabimi? Përpiloni pa optimizim dhe me informacionin e korrigjimit të aktivizuar për të marrë sa më shumë informacion nga valgrind; me GCC që do të ishte -g -O0. Përndryshe, ekzekutoni programin tuaj në një korrigjues të tillë si gdb; kur ndodh segfault, ju duhet të jeni në gjendje të merrni një gjurmë stack që tregon saktësisht se ku ndodh. 30.01.2015
  • Si supozohet që testCombo() të përcaktojë nëse mund të vazhdoni të supozoni? Nuk mund të vlerësojë nëse i keni provuar të gjitha kombinimet e mundshme, sepse nuk e di max_number. 30.01.2015

Përgjigjet:


1

Unë nuk shoh asgjë të gabuar me kodin tuaj. Ajo funksionon për mua, me një funksion testCombo() që kam krijuar sipas specifikimeve tuaja.

Megjithatë, siç e kam vërejtur në komente, testCombo() duket se nuk ka informacion të mjaftueshëm për të kryer punën e tij në mënyrë korrekte. Për më tepër, nëse madhësia e kombinimeve që po testoni (d.m.th. max_indices) është më e vogël se sa pret madhësia testCombo(), atëherë me shumë mundësi mund të lexohet nga fundi, gjë që mund të shkaktojë një segfault.

Me fjalë të tjera, fajin ia hedh testCombo(), por nuk mund të jem më konkret sepse nuk e keni paraqitur.

30.01.2015
Materiale të reja

Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

Faketojeni derisa ta arrini me të dhënat false
A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

Si të përdorni kërkesën API në Python
Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

Një udhëzues hap pas hapi për të zotëruar React
Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

AI dhe Psikologjia — Pjesa 2
Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

Esencialet e punës ditore të kodit tim VS
Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..