Przekazywanie funkcji dwuwymiarowych do funkcji

0

Witam. Jestem początkującym w tych sprawach, więc proszę wybaczyć mi moje pytanie. Chciałbym przekazać do funkcji dwie tablice: jednowymiarową i dwuwymiarową, lecz ich wielkości są zmiennymi. Próbowałem zrobić to normalnym sposobem, lecz cały czas wyskakują jakieś błędy. Jak poprawnie powinienem to zrobić?

2

Pokaż ten "normalny sposób" i te błędy.

0

Przykładowy program.

void func(int l,int n[l],int sum){
    for(unsigned int i=0;i<l;i++){sum+=n[i];}
}
int main()
{
    int l, sum=0;
    cin >> l;
    int n[l];
    for (unsigned int i=0;i<l;i++){
        cin >> n[i];
    }
    func(l, n[l], sum);
    cout << sum;
    return 0;
}
 
3

Nope, nope, nope, trzy błędy:
1.Długość tablicy jest liczbą nieujemną, zatem wykorzystuj typ size_t.
2.Twoja funkcja przyjmuje argumenty i zwraca jedną wartość, po co bawić się w przekazywanie zmiennej? Nie wspominając o tym, że powinna to być referencja (&sum).
3.Bezsensowne nazewnictwo.

Sensowna wersja: int sum(int* tablica, size_t dlugosc)

1
#include <iostream>

void func (int **array, size_t x, size_t y) { }

int main() {
	int **ehehe;
	size_t k, l;
	// tu alokujesz pamiec dla tablicy [k][l]. Tak czy siak musisz tak zrobic skoro wielkosc tablicy nie jest znana z gory
	func (ehehe, k, l);
	return 0;
}
2
int n[l];

To nie jest poprawne. Nie można tworzyć tablic o rozmiarze znanym dopiero w czasie wykonania. Pewne kompilatory to łykają, ale na etapie nauki nie korzystaj z tego. Do tablic dynamicznych masz

int* n = new int[l];
....
// juz ta tablica nie jest nam potrzebna
delete[] n;

Aczkolwiek najlepiej korzystać z std::vector.

void func(int l, int n[l], int sum)

int n[].

func(l, n[l], sum);

func(l, n, sum) - masz przekazać tablicę (technicznie rzecz biorąc wskaźnik do początku tablicy), a nie jeden element tablicy. Zresztą tablica o l elementach nie ma elementu n[l], bo indeksy są od 0 do l-1.

0
twonek napisał(a):
int n[l];

To nie jest poprawne. Nie można tworzyć tablic o rozmiarze znanym dopiero w czasie wykonania. Pewne kompilatory to łykają, ale na etapie nauki nie korzystaj z tego. Do tablic dynamicznych masz

int* n = new int[l];

Tak, wiem że tam się nie powinno robić, ale jak dla mnie (nie ogarniam jeszcze wskaźników) jest tak łatwiej. Piszę programy na Olimpiadę Informatyczną Gimnazjalistów, a oni to akceptują, więc na razie nie będę tego zmieniał.

Opiszę jeszcze raz problem. Chcę przekazać funkcji dwie tablice - jedno- i dwuwymiarową. Ona będzie coś tam na nich robiła w międzyczasie wywoływała sama siebie. Chcę, żeby to były cały czas te same tablice - chodzi o to, że jak zrobię w tej funkcji na tej tablicy to żeby jak funkcja się skończy to te zmiany to zostały. Jak to zrobić?

1
void func (int **tablica_dwuwymiarowa, size_t pierwszy_wymiar, size_t drugi_wymiar, int *tablica_jednowymiarowa, size_t wymiar)

wywołanie:

int **tablica_dwuwymiarowa;
size_t k, l; // wymiary tablicy dwuwymiarowej

int *tablica_jednowymiarowa;
size_t t; // rozmiar tablicy jednowymiarowej

func (tablica_dwuwymiarowa, k, l, tablica_jednowymiarowa, t);

To jedyny poprawny sposób.

0

No jasne. Deklarujesz wskaźnik, coś piszesz pod niego a poźniej piszesz gdzie? Po jakiejś pamięci dziwnej. Musisz zaalokować tę pamięć przez operator new[] a poźniej ją zwolnić - operator delete []

0

No bo nie rezerwowałeś pamięci dla tej tablicy.

int* tablica_jednowymiarowa;

to jest tylko wskaźnik;

int* tab = new int[rozmiar];
... //uzycie
delete[] tab;

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