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

cpp dodawanie dwóch tablic na wskaźnikach

Object Storage Arubacloud
0 głosów
574 wizyt
pytanie zadane 26 listopada 2017 w C i C++ przez Bish0p Obywatel (1,940 p.)

Witam

Miałem zrobić takie zadanie : dodaj do siebie dwie dynamiczne tablice jednowymiarowe. Wartości w tablicach jak i ich rozmiar należy przyjąc losowe. Do poszczególnych elementów tablicy należy się odwoływad bez użycia "[]".

I taki kod zrobiłem do tego (niestety nie działa):

#include<iostream>
#include<time.h>
#include<cstdlib>

using namespace std;

int tab1(int rozmiar);
int tab2(int rozmiar);

int main()
{
	cout << "Podaj rozmiary tablic :";
	int n;
	cin >> n;
	srand(time(NULL));
	int* wsk1 = tab1(n);			//Błąd
	int* wsk2 = tab2(n);			//Błąd
	cout << "Pierwsza tablica " << endl;
	for (int i = 0; i < n; i++)
	{
		cout << i + 1 << ". Zmienna ma wartosc " << *(wsk1 + i) << endl;
	}

	cout << "Druga tablica " << endl;
	for (int i = 0; i < n; i++)
	{
		cout << i + 1 << ". Zmienna ma wartosc " << *(wsk2 + i) << endl;
	}

	cout << "Suma tych dwoch tablic " << endl;

	for (int i = 0; i < n; i++)
	{
		cout << i + 1 << ". Zmienna ma wartosc " << *(wsk1 + i)+*(wsk2+i) << endl;
	}
	cout << endl;

	system("pause");
	return 0;
}

int tab1(int rozmiar)
{
	int*tab1 = new int[rozmiar];
	for (int i = 0; i < rozmiar; i++)
	{
		tab1[i] = rand() % 10;
	}
	return tab1;
}	

int tab2(int rozmiar)
{
	int*tab2 = new int[rozmiar];
	for (int i = 0; i < rozmiar; i++)
	{
		tab2[i] = rand() % 10;
	}
	return tab2;
}

Dowiedziałem się że problemem sa wskaźniki do których przypisuje adres tablicy (nie romumiem czemu)

A poprawnie powinno to zostać tak zrobione 


#include<iostream>
#include<time.h>
#include<cstdlib>

using namespace std;

int* tab1(int rozmiar)
{
	int*tab1 = new int[rozmiar];
	for (int i = 0; i < rozmiar; i++)
	{
		tab1[i] = rand() % 10;
	}
	return tab1;
}

int* tab2(int rozmiar)
{
	int*tab2 = new int[rozmiar];
	for (int i = 0; i < rozmiar; i++)
	{
		tab2[i] = rand() % 10;
	}
	return tab2;
}

int main()
{
	cout << "Podaj rozmiary tablic :";
	int n;
	cin >> n;
	srand(time(NULL));
	int*(*wsk1)(int) =&tab1;
	int*(*wsk2)(int) = &tab2;
	int *t1 = wsk1(n);
	int *t2 = wsk2(n);
	cout << "Pierwsza tablica " << endl;
	for (int i = 0; i < n; i++)
	{
		cout << i + 1 << ". Zmienna ma wartosc " << *(t1 + i) << endl;
	}

	cout << "Druga tablica " << endl;
	for (int i = 0; i < n; i++)
	{
		cout << i + 1 << ". Zmienna ma wartosc " << *(t2 + i) << endl;
	}

	cout << "Suma tych dwoch tablic " << endl;

	for (int i = 0; i < n; i++)
	{
		cout << i + 1 << ". Zmienna ma wartosc " << *(t1 + i) + *(t2 + i) << endl;
	}
	cout << endl;

	system("pause");
	return 0;
}


I bardzo bym prosił kogoś o wyjaśnienie czemu trzeba stosować taki dziwny zapis

int*(*wsk1)(int) =&tab1;
	int*(*wsk2)(int) = &tab2;
	int *t1 = wsk1(n);
	int *t2 = wsk2(n);

 

Z góry dziekuje

 

 

1 odpowiedź

+1 głos
odpowiedź 26 listopada 2017 przez criss Mędrzec (172,590 p.)
wybrane 26 listopada 2017 przez Bish0p
 
Najlepsza
Po pierwsze: dlaczego masz dwie funkcje realizujące dokładnie to samo? Po drugie - nie zgadza się typ zwracany w tych dwóch funkcjach. Widać, że mają zwracać wskaźnik (wskazujący początek tablicy), a u ciebie to jest po prostu int. Powinien być int*.

Co do trzeciego kodu. Tworzysz tam dwa wskaźniki na funkcje, przypisujesz do nich adresy funkcji tab1 i tab2 i wywołujez funkcje z poziomu tych wskaźników. Poprawne, ale kompletnie bezcelowe i bez sensu. Ktoś ci powiedział, że masz tak robić? Nie rób - nic to nie zmienia, tylko więcej kodu.

PS: <time.h>, zamień na <ctime>. time.h to nagłówek z biblioteki standardowej C.
komentarz 26 listopada 2017 przez Bish0p Obywatel (1,940 p.)

oki dzięki a wytłumaczysz mi o co chodzi z tym 

int*(*wsk1)(int) =&tab1;
    int*(*wsk2)(int) = &tab2;
    int *t1 = wsk1(n);
    int *t2 = wsk2(n);

z tego co widze to używamy tutaj rzutawania ale po co skoro zwyczajnie przesyłamy do wskaźnika adres tablicy

komentarz 26 listopada 2017 przez criss Mędrzec (172,590 p.)
Nie, nie ma tu żadnego rzutowania. Pewnie mylisz z zapisem wskaźnika na funkcje (wygoogluj). Cały ten kod już opisałem w drugim akapicie odpowiedzi.

Podobne pytania

0 głosów
1 odpowiedź 838 wizyt
0 głosów
1 odpowiedź 410 wizyt
pytanie zadane 12 stycznia 2017 w C i C++ przez kidcudi6 Nowicjusz (170 p.)
0 głosów
1 odpowiedź 531 wizyt

92,556 zapytań

141,404 odpowiedzi

319,562 komentarzy

61,942 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...