Преобразуйте функции, которые получают статический 2D-массив, в функции, которые получают указатели - PullRequest
0 голосов
/ 22 мая 2018

У меня есть код, который запрограммирован в статической памяти (функции, которые получают статический 2D-массив) (статический код не будет компилироваться, 2D-массив не имеет измерения), и мне нужно перевести его в динамическую память с указателями (функции, которые получают указатели).

Код статической памяти:

void mas_corto(unsigned int c[][], unsigned int a[][], int P[][], unsigned int nNodos)
{
int i,j,k;
for (i = 0; i < nNodos; i++){
    for(j=0; j < nNodos; j++){
        // Inicializamos con el coste de los caminos directos
        A[i][j] = C[i][j]; P[i][j] = -1;
    }
}
for (k = 0; k < nNodos; k++)
    for (i = 0; i < nNodos; i++)
        for (j=0; j< nNodos; j++)
            if (A[i][k]+A[k][j] < A[i][j])
            {
                A[i][j] = A[i][k] + A[k][j];
                P[i][j] = k;
            }
}

void camino (int P[][], int i, int j)
{
int k;
if ((k=P[i][j])== -1)
    return;
camino(i,k);
printf("%d",k);
camino(k,j);
}

#define boolean int
void warshall (boolean c[][], boolean a[][], unsigned int nNodos)
{
int i,j,k;
for (i = 0; i < nNodos; i++)
    for (j=0; j< nNodos; j++)
        A[i][j] = C[i][j];
    for (k = 0; k < nNodos; k++)
        for (i = 0; i < nNodos; i++)
            for (j=0; j< nNodos; j++)
                A[i][j] = A[i][j] || A[i][k] && A[k][j];
}

Как видите, функции получают статический двумерный статический массив, и мне нужно преобразовать их в двумерные указатели, например:

void mas_corto(unsigned int **C, unsigned int **A, int **P, unsigned int nNodos)
{
    // CODE TRANSLATED
}

void camino (int **P, int i, int j)
{
    // CODE TRANSLATED
}

#define boolean int
void warshall (boolean **C, boolean **A, unsigned int nNodos)
{
    // CODE TRANSLATED
}

Но я не знаю, как я могу перевести код, содержащийся внутри статической функции, в функции указателя.Есть идеи, как мне этого добиться?(Мне нужно перевести / adpat статический код функции в указатели, другими словами, мне нужно заполнить там, где появляется // CODE TRANSLATED)

Спасибо.

1 Ответ

0 голосов
/ 22 мая 2018

На самом деле вы можете использовать массивы, так как вы делаете , знаете размер и C поддерживает массивы переменной длины.

Просто измените порядок аргументов, чтобы поставить немногосначала размер, и вы можете использовать его в оставшихся аргументах:

void mas_corto(unsigned int nNodos, unsigned int c[][nNodos], unsigned int a[][nNodos], int P[][nNodos]) { ... }
...