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;
0
 #include <iostream>
using namespace std;
void func(int *tablica_jednowymiarowa, size_t wymiar){
    for(int i=0;i<wymiar;i++){
        tablica_jednowymiarowa[i]-=1;
    }
}
int main(){

    int *tablica_jednowymiarowa;
    size_t l;
    cin >> l;
    for (int i=0;i<l;i++){
        cin >> tablica_jednowymiarowa[i];
    }

    func(tablica_jednowymiarowa, l);
     for(int i=0;i<l;i++){
        cout << tablica_jednowymiarowa[i];
    }

}

To już robi się dla mnie mocno skomplikowane, mógłbyś przeredagować ten kod?

1
#include <iostream>
using namespace std;

void func (int *tablica_jednowymiarowa, size_t wymiar) {
    for(int i = 0; i < wymiar; i++) {
        tablica_jednowymiarowa[i] -= 1;
    }
}

int main () {
    int *tablica_jednowymiarowa;
    size_t l;
    cin >> l;
    tablica_jednowymiarowa = new int[l]; // <----------

    for (int i = 0; i < l; i++) {
        cin >> tablica_jednowymiarowa[i];
    }
 
    func(tablica_jednowymiarowa, l);

     for (int i = 0; i < l; i++) {
        cout << tablica_jednowymiarowa[i];
    }

    delete [] tablica_jednowymiarowa; // <-------------
    return 0;
 
}
0

Rozumiem, teraz z dwuwymiarowymi. Program ma odczytać n razy po 2 wartości, dać tablicę funkcji, pierwsza wartość ma być sumą obu podanych, a następnie wydrukować je. Problem polega na tym, że 2 wymiar wynosi zawsze 2, więc po skompilowaniu tego programu,

#include <iostream>
using namespace std;

void func(int **liczby, size_t n, size_t m){
    for(int i=0;i<n;i++){
        liczby[i][0]+=liczby[i][1];
    }
}

int main() {

    int **liczby;
    size_t n, szer;
    cin >> n;
    szer=2;
    liczby = new int[n][szer];
    for(int i=0;i<n;i++){
        cin >> liczby[i][0] >> liczby[i][1];
    }
    func(liczby, n, 2);

    for(int i=0;i<n;i++){
        cout << liczby[i][0] << endl;
    }
    delete [] liczby;
    return 0;
}

program wywala mi błąd :
error: 'szer' cannot appear in a constant-expression

1

Nie lepiej zrobić tablice par w takim przypadku?

0

Pewnie tak :D , ale czy da rade zrobić tak z jedną tablicą?

1

Mówię o jednej tablicy - tablicy par.

#include <iostream>
using namespace std;
 
void func(pair<int, int> *liczby, size_t n){
    for(int i=0;i<n;i++){
        liczby[i].first+=liczby[i].second;
    }
}
 
int main() {
 
    pair<int, int> *liczby;
    size_t n, szer;
    cin >> n;
    liczby = new pair<int, int>[n];

    for(int i=0;i<n;i++){
        cin >> liczby[i].first >> liczby[i].second;
    }
    func(liczby, n);
 
    for(int i=0;i<n;i++){
        cout << liczby[i].first << endl;
    }
    delete [] liczby;
   
0

Dobra, wszystko już wiem. Dzięki za pomoc.

0

Mam wrażenie, że zraziliśmy Cię do C++ ;D

0

Trochę to skomplikowane, ale do wyboru mam jeszcze C i pascala, których prawie wcale nie znam, więc chcąc nie chcąc muszę :D

0

Zawsze możesz stworzyć dwie tablice - poźniej do pierwszej dodajesz odpowiednią wartość z drugiej. Nawet w ten niepoprawny sposób:

cin >> n;
int tablica1[n];
int tablica2[n];

tylko nie pokazuj kodu na forum, bo Cię zjedzą xd jednak mimo wszystko uważam, że powinieneś od początku uczyć się obsługiwać język w poprawny sposób. No i zostaje vector<pair<int, int>>

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