[C++] Przekazanie funckcji nazwy tablicy


(Krzkaczor) #1

Hej!

Mam kilka zmiennych int w programie. Dla każdej z nich chiałbym wyszukać wszystkie dzielniki i zapisać je potem do kilku tablic. Jako że zmiennych liczbowych jest kilka to nie chciałbym robić kilku funkcji robiących praktycznie to samo. Moje pytanie brzmi: jak przekazać do funkcji nazwe tablicy (może sam wskaźnik...) i jak operować na tej tablicy wewnątrz funkcji. Tablica jest dynamiczna (vector). Głowie się nad tym już jakiś czas a efektów nie ma...

Proszę o pomoc i pozdrawiam


([alex]) #2
void add(vector<int> &v,int x)

(Ryan) #3

Nazwy zmiennych (w tym tablic) nie istnieją. To syntaktyczny cukier który daje Ci język programowania. Chcesz tablicę tablic, tablicę wektorów albo wektor wektorów. Nie bardzo rozumiem w czym problem. Przykład (z palca):

// CalcSomething transfers ownership of results

int *CalcSomething(int value)

{

  int *results = NULL;

  int t = 0;

  int i = 0;


  t = (rand() % 10) + 2;

  results = (int*)malloc(sizeof(int) * (t + 1));

  if (results == NULL)

    goto _exit;


  for (i = 0; i < t; ++i)

    results[i] = i * value;

  results[t] = -1;


_exit:

  return results;

}


void foo()

{

  const int count = 5;

  int inputs[count] = {};

  int **outputs = NULL;

  int i = 0;

  int j = 0;


  outputs = (int**)malloc(sizeof(int*) * count);

  if (outputs == NULL)

    goto _exit;

  memset(outputs, 0, sizeof(int*) * count);


  for (i = 0; i < count; ++i)

  {

    outputs[i] = CalcSomething(i);

  }


  for (i = 0; i < count; ++i)

  {

    printf("Results for %d:\n", i);

    if (outputs[i][j] == NULL)

    {

      printf("[error]\n\n");

    }

    else

    {

      for (j = 0; outputs[i][j] != -1; ++j)

      {

        printf("%d ", outputs[i][j]);

      }

      printf("\n\n");

    }

  }


_exit:

  if (outputs)

  {

    for (i = 0; i < count; ++i)

    {

      if (outputs[i])

        free(outputs[i]);

    }

    free(outputs);

    outputs = NULL;

  }

}

Kod i tak musisz z deczka zmienić, bo używasz wektorów. Brzydka rzecz w tym kodzie to użycie magicznej wartości -1 jako terminatora tablicy - można to rozwiązać bardziej elegancko.

@[alex]: sądzę, że trudnością nie jest push_back a to, że autor potrzebuje vektor wektorów (zmienna ilość liczb wejściowych, każda z nich ma kilka wektor wyników, a nie jeden wynik).


(Krzkaczor) #4