C99 - рекурсивное распределение / перераспределение двумерных динамических массивов - PullRequest
0 голосов
/ 27 ноября 2018

Доброе утро

перед кодом, я не хочу, чтобы вы, ребята, дали мне код, чтобы я мог его использовать, так как я бы не узнал, почему это так происходит.Я хочу узнать, почему этот код не работает и как правильно использовать выделение памяти, чтобы я не потерпел неудачу снова в будущем.

Проблема, с которой я столкнулся, связана с функцией в моем коде, цель которой, учитывая двумерный динамический массив символов (Matrix) и другой динамический массив слов (List), найти все пути вМатрица, в которой находятся слова из списка, затем сохраняет эти пути в другом динамическом массиве (Paths).Моя проблема не в том, как найти эти пути, а в том, как их сохранить, так как все мои попытки найти решение встретились с ошибками перераспределения памяти.

это рассматриваемая функция:

notes:

этот код находит путь, сохраняет его в temp, а затем ДОЛЖЕН выделить память для копирования temp в path и затем повторить.Без выделенной части кода и нескольких printfs код показывает все пути правильно.Но показ и хранение - это две разные вещи

int ** path - the dyn array for the paths

int ** num_caminhos - the number of paths

char * palavra - the word to currently search for

int ID - the ID of the word, for later reference

void pesquisa(int ** path, int *num_caminhos, char **matriz, int num_colunas, int num_linhas, char * palavra, int l, int c, int li, int ci, int * temp, int d, int ID){
if (matriz[l][c]==palavra[d]){
    if ((l-1)>=0 && palavra[d+1]==matriz[l-1][c]){
        temp[5+d]=1;
        pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l-1, c, li, ci, temp, d+1, ID);}
    if ((l-1)>=0 && (c+1)<num_colunas && palavra[d+1]==matriz[l-1][c+1]){
        temp[5+d]=2;
        pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l-1, c+1, li, ci, temp, d+1, ID);}
    if (((c+1)<num_colunas) && (palavra[d+1]==matriz[l][c+1])){
        temp[5+d]=3;
        pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l, c+1, li, ci, temp, d+1, ID);}
    if ((l+1)<num_linhas && (c+1)<num_colunas && palavra[d+1]==matriz[l+1][c+1]){
        temp[5+d]=4;
        pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l+1, c+1, li, ci, temp, d+1, ID);}
    if ((l+1)<num_linhas && palavra[d+1]==matriz[l+1][c]){
        temp[5+d]=5;
        pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l+1, c, li, ci, temp, d+1, ID);}
    if ((l+1)<num_linhas && (c-1)>=0 && palavra[d+1]==matriz[l+1][c-1]){
        temp[5+d]=6;    
        pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l+1, c-1, li, ci, temp, d+1, ID);}
    if ((c-1)>=0  && palavra[d+1]==matriz[l][c-1]){
        temp[5+d]=7;
        pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l, c-1, li, ci, temp, d+1, ID);}
    if ((l-1)>=0 && (c-1)>=0 && palavra[d+1]==matriz[l-1][c-1]){
        temp[5+d]=8;
        pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l-1, c-1, li, ci, temp, d+1, ID);}
}
if ((d==strlen(palavra)-1) && (palavra[0]==matriz[li][ci])){
    path=realloc(path, ((*num_caminhos)+1)*sizeof(int *));
    path[*num_caminhos]=malloc((strlen(palavra)+5)*sizeof(int));
    temp[0]=ID;
    temp[1]=li;
    temp[2]=ci;
    temp[3]=l;
    temp[4]=c;
    for (int i=0; i<5+d; i++){
        path[*num_caminhos][i]=temp[i];
    }
    *num_caminhos=*num_caminhos+1;
    return;
}

}

извините, если код показывает слишком много "любительских" ошибок: P.Я склонен исправлять их, когда узнаю больше.Просто последняя деталь, к сожалению, я вынужден использовать выделение памяти dyn как часть цели этого кода.

...