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ć?
Pokaż ten "normalny sposób" i te błędy.
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;
}
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)
#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;
}
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
.
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ć?
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.
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 []
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;
#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?
#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;
}
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
Nie lepiej zrobić tablice par w takim przypadku?
Pewnie tak :D , ale czy da rade zrobić tak z jedną tablicą?
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;
Dobra, wszystko już wiem. Dzięki za pomoc.
Mam wrażenie, że zraziliśmy Cię do C++ ;D
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
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>>