Przekazywanie tablicy do funkcji bez zmiany tej tablicy

0

Czy da się jakoś do funkcji przekazać tablicę, i operując na niej w tej funkcji nie zmieniać jej wartości ?
Z tego co wiem w takim przypadku:

void notChange(int s[], int s_size)
{
   for(int i = 0; i < s_size; i++)
      s[i] *= 3;
}

i gdy w main mamy tablicę tab to w funkcji notChange operujemy właśnie na tej tab, więc jej wartość się zmieni.
Natomiast ja chcę, aby w notChange tylko zachodziła zmiana, a w main już nie. Cóż - jedyny znany mi sposób to przekopiować tablicę s do jakiejś nowo utworzonej w funkcji notChange. Czy istnieje inny sposób ?

dodanie znacznika <code class="cpp"> + sformatowanie kodu - fp

0

Nie istnieje. Przecież ty chcesz mieć finalnie 2 tablice - jedną z wartościami początkowymi w main a drugą ze zmienionymi wartościami wewnątrz funkcji. Siłą rzeczy MUSISZ mieć tutaj dwie tablice...
No chyba że na koniec funkcji poodwracasz sobie wszystkie wykonane operacje, ale wątpie żeby było warto.

0

możesz zrobić klasę która opakuje tablicę w dodatkową warstwę
po ustawieniu flagi w klasie zmiany się nie będą odbywać na tablicy tylko zapisywać w nowej
przy odwoływaniu się do elementów najpierw sprawdzana jest druga tablica czy elementy w niej istnieją a dopiero później zwracane elementy z właściwej tablicy
przy usuwaniu flagi typu możesz usunąć drugą tablicę

z punktu widzenia aplikacji w main będą zapisywać się zmiany a w funkcji już nie przy czym jednocześnie dane nie będą zduplikowane dla całej tablicy a jedynie dla elementów zmienionych

0

Ba taka klasa (o której mówi @sgdsg w poście wyżej) już istnieje i nazywa się vector

2
void notChange(const int s[], int s_size)

(to nadal można ominąć używając const_cast, ale z założenia ten const oznacza, że zawartość tablicy się nie zmieni.

0
void _notChange(int s[], int s_size)
  {
   for(int i=0;i<s_size;++i) s[i]*=3;
  }

void notChange(const int s[], int s_size)
  {
   int *S=new int[s_size];
   try
     {
      memcpy(S,s,sizeof(int)*s_size);
      _notChange(s,s_size)
     }
   catch(...)
     {
      delete[] S;
      throw;
     }
   delete[] S;
  }
0

Czy da się jakoś do funkcji przekazać tablicę, i operując na niej w tej funkcji nie zmieniać jej wartości ?

Oprócz sposobów podanych powyżej można opakować w strukturę i dopiero tą przekazać do funkcji:

const int s_size = 3;//przykladowo
struct array {
    int arr[s_size];
};
void notChange(array s, int array_size)
{
        for(int i = 0; i < s_size; i++)
            s.arr[i] *= 3;
}
void Change(array& s, int s_size)
{
        for(int i = 0; i < s_size; i++)
            s.arr[i] *= 3;
} 

Sztuczka polega na przekazaniu struktury zawierającej tablicę przez wartość i wówczas tablica nie zostanie zmieniona (wewnątrz funkcji będzie używana kopia) lub przez referencję (ewnetualnie wskaźnik) i wówczas jej zawartość ulegnie zmianie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1