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ć?
Przekazywanie funkcji dwuwymiarowych do funkcji
- Rejestracja: dni
- Ostatnio: dni
- Postów: 16
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;
}
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 13042
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)
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
#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;
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2500
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 16
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ć?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
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 []
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2500
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;
- Rejestracja: dni
- Ostatnio: dni
- Postów: 16
#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?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
#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;
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 16
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
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
Nie lepiej zrobić tablice par w takim przypadku?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 16
Pewnie tak :D , ale czy da rade zrobić tak z jedną tablicą?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
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;
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
Mam wrażenie, że zraziliśmy Cię do C++ ;D
- Rejestracja: dni
- Ostatnio: dni
- Postów: 16
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
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
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>>