Pytania zaimplementowac funkcje c++

0

Zad
Zaprojektować i zaimplementować funkcję w języku C++ wypełniającą tabli-cę T o rozmiarze n kolejnymi liczbami naturalnymi zaczynając od wartości 5. Tablicę utworzyć wewnątrz funkcji i odebrać jako argument od funkcji poprzez wskaźnik (wykorzystać funkcję utworz).

Nie wiem czy dobrze to rozumiem w funkcji mam utworzyc dynamiczna tablice (wypelnic ja) a nastepnie zwrocic ja jako argument ale wtedy nie bardzo wiem co powinnienem wpisac w deklaracji funkcji w mainie (chodzi mi normalnie zawsze bym tam dal adres tablicy na 1 element i rozmiar ale skoro musze zrobic w funkcji utworzyc tablice to nie bardzo wiem o co chodzi ). Nie bardzo wiem co ta funkcja powinna przyjac jako argumenty .

 #include <iostream>

using namespace std;

int *utworz (int tab,int r )  // tutaj musze wskaznik do obiektu int dlatego ze przydzielilem dynamicznie pamiec ?
{
    int* tablica = new int [r]; // tutaj stworzono tablice czyli nie musze do funkcji przesylac argumentu tab ? skoro tutaj stworzylem tablice
    for (int i = 0 ; i < r ; i++)
    {
        // tu sobie ja wypelnie
    }
 return tab ; // dobrze to jest?
}
int main()
{
    int rozmiar;
    cout << "podaj rozmiar tablicy:" ;
    cin >> rozmiar;
    //int* tablica = new int [rozmiar] //  No chyba ze tutaj moglbym stworzyc tablice to wtedy w deklaracji funkcji dalo by rade przeslac ja :P
    utworz(tablica,rozmiar);         // Tu bvm tablice przeslal poprostu ale musze ja stworzyc w funkcji utworz czyli taka deklaracja odpada? No bo po co tworzyc tablice w mainie skoro musze w funkcji ?
    
      return 0;
}

 

Czy moze w mainie stworzyc tablice wypelnic ja n elementami a nastepnie przeslac do funkcji i tam wypelnic ja wartosciami o +5 ?
co to znaczy odebrać jako argument od funkcji poprzez wskaźnik ?

0

skoro masz: Tablicę utworzyć wewnątrz funkcji i odebrać jako argument od funkcji poprzez wskaźnik to chyba utwórz powinno wyglądać tak:

 void utworz (int **tab,int r )
0

Mógłbyś trochę przybliżyć ten zapis void utworz (int **tab,int r ) . Jezeli dobrze zrozumialem i tak musze przeslac tablice z maina ? tzn zainicjalizowac w glownej funkcji i dopiero potem do void utworz?

0

@kaczus każe Ci zrobić podwójny wskaźnik, ale nie ma za tym (IMHO) żadnej racjonalnej argumentacji.
Po prostu przekaż wskaźnik do funkcji i ją tam wypełnij.

1

No tak jest w zadaniu. A ponieważ masz przydzielić pamięć w funkcji, to musisz przekazać adres do modyfikacji, więc albo ** albo *&.
I jeszcze jedna uwaga - nie zapomnij zwolnić na końcu programu tej pamięci!

1

Faktycznie, jestem debilem ;)
Wartosc wskaznika będzie kopią.
Ja to rozwiązałem tak:

void FillFunc( int*& tab, const unsigned size )
{
    tab = new int[size];
// Dzialania
}

main()
{
    int* tab;
    FillFunc( tab, jakis_rozmiar );
}
0

Jestem poczatkujacym i jeszcze nigdy sie nie spotkalem z zapisem *& ;p

0
 
 #include <iostream>

using namespace std;

void utworz (int *tab,int r )
{
 tab = new int [r];
    for (int i = 0 ; i < r ; i++,tab++)
    {
        cout << *tab<< endl;

    }
}
int main()
{
    int rozmiar = 100;
    int *tab;
    utworz(tab,rozmiar);
      return 0;
}

Zrobilem tak ale nie wiem dlaczego takie dziwne wartosci chcialem wypelnic liczbami naturalni zaczynajac od 0 az do spelnionego warunku.
Czy to przez to ze mam w mainie int*tab; i poki co to pokazuje na smieci?

0
#include <iostream>
 
using namespace std;
void wypelnij(int** tab, const int rozm) {
	if(rozm < 0)
		return;
	*tab = new int[rozm];
	for(int i = 0; i < rozm ; i++) {
		tab[0][i] = i * 5;
	}
}
void wypisz( int** tab, const int rozm) {
	for(int i = 0; i < rozm ; i++) {
		cout<<tab[0][i]<< "\n";
	}
}
void zwolnij(int** tab) {
	if(tab[0] != NULL)
		delete [] tab[0];
}
int main() {

    int* tab;
	cout<<tab<<"\n";
	int rozm = 10;
    wypelnij(&tab, rozm);
    wypisz(&tab, rozm);
    zwolnij(&tab);	
	return 0;	
} 

Polecam zabawe z refencja, bo te wskazniki sa zdradliwe i brzydkie

0
int utwórz(int *tab,int n) { for (int i = 0; i < n; i++) { tab[i] = i + 5;} return *tab;}

int main(){
	int tab[5];
	utwórz(tab, 5);
}

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