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

Zwracanie tablicy dynamicznej z funkcji

VPS Starter Arubacloud
0 głosów
2,003 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez sakro95 Nowicjusz (170 p.)
Chciałbym zwrócić tablice dynamiczną utworzoną w oddzielnej funkcji tak, żebym można było jej użyć w innych funkcjach.
Myślałem o zwrocie przez referencje, ale nie wiem jak to zrobić dla tablic dynamicznych, dlatego proszę o podanie przykładu.

3 odpowiedzi

+2 głosów
odpowiedź 9 marca 2016 przez Bravo555 Gaduła (3,970 p.)
 
Najlepsza

W C++ nazwa tablicy to wskaźnik do jej zerowego elementu, a ponieważ tablica to tylko grupa zmiennych będących obok siebie w pamięci, a możesz zwrócić tylko jedną wartość, to zwracasz ten wskaźnik.

int* createArray(int size)
{
    return new int[size];
}

int main()
{
    int* myArray = createArray(5);
    // odwołujesz się do myArray jak do zwykłej tablicy: myArray[n]
}

 

 

+1 głos
odpowiedź 9 marca 2016 przez niezalogowany

Szkoda, że sam nie dałeś kodu, ehh.

Funkcje w C/C++ mogą zwracać także wskaźnik

int* create_array(int size)
{
 int *t = new int[size];
 return t;
}

Coś takiego

komentarz 9 marca 2016 przez sakro95 Nowicjusz (170 p.)

Dziękuje za szybką odpowiedz, przesyłam mój kod. Problem polega na tym że dzięki tej funkcji chciałbym stworzyć dwie tablice, i chciałbym naddać im nazwy, jak z modyfikować podesłaną przez Pana funkcje, żeby to tak działało ?

 

void tablica(ifstream &fin)
{
	string linia;
	int m,n,*t1=NULL,*t = NULL;

	getline(fin,linia);

	m = atoi(linia.c_str());

	t = new int[m];

	for (int i = 0; i < m; i++)
	{
		fin >> t[i];
	}

	fin >> n;
	t1 = new int[n];

	for (int i = 0; i < n; i++)
	{
		fin >> t1[i];
	}
}

 

komentarz 9 marca 2016 przez niezalogowany
edycja 11 marca 2016

W takim razie możesz przekazać do funkcji jako argumenty 2 wskaźniki, pozwól że zmodyfikuję swój przykład (myślę, że w ramach demonstracji jest czytelniejszy);

void create_array(int** t1, int** t2,  int size)
{
 *t1 = new int[size];
 *t2 = new int[size];
}

@Edit: dzięki @maly za zwrócenie uwagi na błąd

komentarz 10 marca 2016 przez maly Nałogowiec (37,190 p.)

Żeby zmienić podany do funkcji wskaźnik trzeba go przekazać przez referencje.

void create_array(int*& t1, int*& t2,  int size)

 

komentarz 11 marca 2016 przez sakro95 Nowicjusz (170 p.)
Dlaczego używasz dwóch **?
komentarz 11 marca 2016 przez niezalogowany

Aby przekazać referencję na wskaźnik, przez co mogę go zmienić, a więc aby użyć tej funkcji to musisz zrobić coś takiego:

int *a, *b;

create_array(*a, *b, 20);

 

komentarz 11 marca 2016 przez sakro95 Nowicjusz (170 p.)
void tworca(int **&t, int **&t1, int size,int size1)
{
	*t = new int[size];
	*t1 = new int[size1];
}

tworca(*tab,*tab1,5,10);

 

Zrobiłem tak jak napisałeś, lecz nie mogę podczas kompilacji dostaje informacje że funkcja nie może zmienić argumentu z int na int **&

komentarz 11 marca 2016 przez niezalogowany
Czemu dodałeś &? Powinno być albo int** arg, albo int*& arg
komentarz 12 marca 2016 przez sakro95 Nowicjusz (170 p.)
Unhandled exception at 0x002AAF3D in Arkadiusz_Jastrzebski_01.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.

 

Taki dostaje błąd kiedy robie tak:
 

void tworca(int *&t, int size)
{
	*t = *new int[size];
}

i wywołuje to 

int *t=NULL;
tworca(t,m)

 

0 głosów
odpowiedź 9 marca 2016 przez jpacanowski VIP (101,940 p.)
#include <iostream>
 
using namespace std;
 
int** foo(int size)
{
    int** tab = new int*[size];
    for(int i = 0; i < size; i++)
        tab[i] = new int[size];
    return tab;
}
 
int main()
{
    int n = 10;
    int** t = foo(n);
 
    //operacje na tablicy
 
    for(int i = 0; i < n; i++)
        delete[] t[i];
    delete[] t;
    return 0;
}

Podobne pytania

–1 głos
2 odpowiedzi 303 wizyt
pytanie zadane 23 lutego 2016 w C i C++ przez KTK Nowicjusz (150 p.)
+5 głosów
4 odpowiedzi 6,451 wizyt
pytanie zadane 8 kwietnia 2015 w C i C++ przez Raba_Ababa Początkujący (390 p.)
0 głosów
2 odpowiedzi 549 wizyt
pytanie zadane 30 kwietnia 2017 w C i C++ przez kacperl95 Obywatel (1,980 p.)

92,765 zapytań

141,690 odpowiedzi

320,503 komentarzy

62,106 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!

...