• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja która dostaje jako argument wskaznik do jednowymiarowej dynamicznej tablicy (C++)

VPS Starter Arubacloud
–1 głos
1,644 wizyt
pytanie zadane 22 lutego 2019 w C i C++ przez vog Początkujący (370 p.)

Witam mam problem z dokończeniem zadania. Z pierwszą częścią sobie poradziłem, ale druga to już dla mnie schody, niestety nie mogę sobie z tym poradzić mimo wieeeelu prób znalezienia odpowiedzi w necie, a moje wykłady ze szkoły niestety są w temacie dla mnie nie zrozumiałe. (treść zaczynająca się od dużej czcionki, to co dalej tam jest) Baaaardzo proszę o pomoc, chcę to w końcu załapać. :(

Polecenie:  Napisz funkcję, która otrzymuje jako argument dodatnią liczbę całkowitą n, a następnie tworzy dynamiczną n-elementową tablicę o elementach typu int i zwraca jako wartość wskaźnik do jej pierwszego elementu ORAZ FUNKCJĘ, która dostaje jako argument wskaźnik do jednowymiarowej dynamicznej tablicy o elementach typu int i zwalnia pamięć zajmowaną przez przekazaną w argumencie tablicę.

 

#include <iostream>
#include <cstdlib>
using namespace std;
int n;

    int stworz_tab(int rozmiar){    //FUNKCJA 1
        int *tablica;
        tablica = new int[rozmiar];
        tablica[0]= 2019;
        return *tablica;
        }

    void tab_delete(int *T[])   //FUNKCJA 2
        {
        for(int i=0; i<n; i++){
            T[i]= i+1;
            cout<<i+1<<". -"T[i]<< " ";
                              }
        delete[]T;
        }

        
int main(){

int pierwszy_el_tab;

//dla funkcji nr1- stworz:
    cout<<"Ile elementow tab. dynamicznej wygenerowac: ";
    cin>> n;
    pierwszy_el_tab = stworz_tab(n);     //wywol funkcji 1
    cout << "tablica[0] oto jej zawartosc - " << pierwszy_el_tab << endl;

//dla funkcji nr2:

int *t_tab = new int[n];
int *wsk = &t_tab[n];

delete[]t_tab;

tab_delete(t_tab);    //wywol. funkcji 2



    system("pause > nul");
    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 22 lutego 2019 przez adrian17 Ekspert (348,220 p.)
int stworz_tab(int rozmiar)

Ta funkcja zwraca inta, nie wskaźnik.

void tab_delete(int *T[])

Ta funkcja bierze tablicę wkaźników na inty, nie wskaźnik.Wystarczy *ptr.

komentarz 22 lutego 2019 przez vog Początkujący (370 p.)
Bez urazy, na prawdę ale mam wrażenie że albo ja nie zrozumiałem polecenia albo Ty. Skoro funkcja1 ma dostać int n, to nie widzę powodu aby dostała wskaźnik. natomiast druga funkcja wydaje mi się, że powinna wyglądać tak void funkcja(int T[]), grzebię cały czas w książkach i szukam. Bynajmniej nie wyczerpuje to mojego problemu bo program nie jest kompletny a zależy mi by był. Skoro są tutaj licznie ogarnięci proszę o pomoc.
komentarz 22 lutego 2019 przez adrian17 Ekspert (348,220 p.)

Napisz funkcję, która otrzymuje jako argument dodatnią liczbę całkowitą n, a następnie tworzy dynamiczną n-elementową tablicę o elementach typu int i zwraca jako wartość wskaźnik do jej pierwszego elementu

int stworz_tab(int rozmiar)

Twoja funkcja bierze inta i zwraca inta, a zgodnie z treścią zadania ma zwracać wskaźnik.

ORAZ FUNKCJĘ, która dostaje jako argument wskaźnik do jednowymiarowej dynamicznej tablicy o elementach typu int

To jest albo `int *ptr`, albo `int ptr[]`, w tym przypadku bez znaczenia.

(EDIT: technicznie to może być `int **ptr` albo `int *ptr[]`, ale ale nie jest to potrzebne by po prostu zwolnić tablicę, więc zakładam, że zadanie nie chce byś bez powodu dodawał warstwę wskaźników bez dobrego powodu.)

komentarz 22 lutego 2019 przez vog Początkujący (370 p.)

Twoja funkcja bierze inta i zwraca inta, a zgodnie z treścią zadania ma zwracać wskaźnik.

int stworz_tab(int rozmiar)

pobiera, to się zgadza, natomiast na return daję *tablica;   - więc na prawdę nie mam pojęcia gdzie popełniam błąd może w main(), na prawdę moja wiedza to jeszcze (że tak zażartuję) nie wyżyny a jakieś tam początki początków, staram się lecz nie mam pojęcia w tym przypadku.

komentarz 22 lutego 2019 przez adrian17 Ekspert (348,220 p.)

natomiast na return daję *tablica

Więc zwracasz 2019 (bo *tablica to to samo co tablica[0]).

Informacja, jaki typ jest zwracany, jest - tak jak dla argumentów - w deklaracji funkcji.

void f(int x); // bierze int
void f(int * x); // bierze wskaznik na int

int f(); // zwraca int
int * f(); // zwraca wskaznik na int
int & f(); // zwraca referencje na int
std::string ** f(); // zwraca podwojny wskaznik na std::string (nie rób tak)

etc.

Więc w Twoim przypadku, skoro zadanie mówi

Napisz funkcję, która otrzymuje jako argument dodatnią liczbę całkowitą n, a następnie tworzy dynamiczną n-elementową tablicę o elementach typu int i zwraca jako wartość wskaźnik do jej pierwszego elementu

To funkcja powinna wyglądać tak:

int* stworz_tab(int rozmiar)
komentarz 22 lutego 2019 przez vog Początkujący (370 p.)

Ok, czyli żeby zadziałało poprawnie powienienem przerobić w main tę instrukcję:

pierwszy_el_tab = stworz_tab(n);

w taki sposób?

pierwszy_el_tab = *stworz_tab(n);

czy ewentualnie coś jeszcze powinno zostać poprawione?

komentarz 22 lutego 2019 przez adrian17 Ekspert (348,220 p.)

pierwszy_el_tab = *stworz_tab(n);

potem będziesz ten wskaźnik przekazywał z powrotem do funkcji zwalniającej pamięć, więc powinieneś przechować go w zmiennej.

komentarz 22 lutego 2019 przez vog Początkujący (370 p.)
ok dzięki popróbuję
0 głosów
odpowiedź 23 lutego 2019 przez mokrowski Mędrzec (156,220 p.)

Napisz funkcję, która otrzymuje jako argument dodatnią liczbę całkowitą n, a następnie tworzy dynamiczną n-elementową tablicę o elementach typu int i zwraca jako wartość wskaźnik do jej pierwszego elementu.

Do "zapisu wielkości kontenerów" w C i C++, służy typ std::size_t (w C.. size_t). Jest on pozbawiony znaku, spełnia więc założenia polecenia. Jeśli nie miałeś na zajęciach tego typu, mniejszy błąd popełnisz jeśli przekażesz unsigned int a nie int. Typ int przenosi również wartości ujemne.

Dodatkowo tablicy nie powinieneś tworzyć z ilością elementów 0 (zero) (poza tym zero nie jest wartością dodatnią). Stąd wymagana jest kontrola ilości danych przesyłanych. Nie ma informacji w jaki sposób masz dokonać takiej kontroli. Z prostych sposobów, możesz wpisać asercję która nie pozwoli na wywołanie z wartością n == 0. Inną konwencją jest zwrócenie nullptr we wskaźniku lub rzucenie wyjątku.

Dość rozsądne jest także wyzerowanie zawartości tablicy zwracanej co uzyskasz dodając do konstrukcji { i }.

Tak więc:

#include <cstddef>
#include <cassert>

int * createTable(std::size_t size)
{
    assert(size > 0);
    return new int[size]{};
}

ORAZ FUNKCJĘ, która dostaje jako argument wskaźnik do jednowymiarowej dynamicznej tablicy o elementach typu int i zwalnia pamięć zajmowaną przez przekazaną w argumencie tablicę.

Tu bym nie "przekombinowywał". Być może polecenie nie do końca jest precyzyjne ale IMHO chodzi o przekazanie zwykłego wskaźnika i jego zwolnienie. Jeśli nawet wskaźnik będzie wskazywał na nullptr, delete [] prawidłowo go zwolni nie robiąc nic.

void disposeTable(int * table)
{
    delete [] table;
}

 

Podobne pytania

0 głosów
1 odpowiedź 635 wizyt
–1 głos
3 odpowiedzi 1,166 wizyt
pytanie zadane 9 września 2018 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 522 wizyt
pytanie zadane 4 kwietnia 2019 w C i C++ przez four Użytkownik (720 p.)

92,834 zapytań

141,778 odpowiedzi

320,827 komentarzy

62,164 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...