memcpy - kopiowanie tablic dynamicznych

0

tablica sie nie kopiuje

#include <cstring>
#include <iostream>
using namespace std;

void func(int n, double *tab) {
	double *kopia = new double[n];

	memcpy(kopia, tab, sizeof(tab));

	for (int i = 0; i < n; ++i)
		cout << kopia[i] << "\t";

	delete[]tab;
	delete[]kopia;

}

int main() {
	cout<<"Rozmiar: ";
	int n;
	cin >> n;
	cout<<"Uzupełnij tablice: "<<endl;
	double *tab = new double[n];
	for(int i=0;i<n;++i)
		cin>>tab[i];


	func(n,tab);
	return 0;
}

1

Ile wynosi sizeof(tab)?

0
	#include <cstring>
	#include <iostream>
	using namespace std;

	void func(int n, double *tab) {
		double *kopia = new double[n];

		memcpy(kopia, tab, sizeof(n)); // sprawdzałem też samo n

		for (int i = 0; i < n; ++i)
			cout << kopia[i] << "\t";

		delete[]tab;
		delete[]kopia;

	}

	int main() {
		cout<<"Rozmiar: ";
		int n;
		cin >> n;
		cout<<"Uzupełnij tablice: "<<endl;
		double *tab = new double[n];
		for(int i=0;i<n;++i)
			cin>>tab[i];


		func(n,tab);
		return 0;
	}

2

Dlaczego sizeof(n)?

1

Skoro n to liczba elementów, a sizeof(double) to rozmiar pojedynczego elementu, w jaki sposób możesz policzyć rozmiar całej tablicy w pamięci?

0

@Patryk27:
tu działa, więc moje błędne przypuszczenie jest takie, że w przypadku tablic dynamicznych przy takich samych rozmiarach też powinno działać

#include <cstring>
#include <iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	int tab1[n];
        int tab2[n];
	for (int i = 0; i < n; ++i)
		cin >> tab1[i];
	

	memcpy(tab2, tab1, sizeof(tab1));

	for (int i = 0; i < n; ++i)
		cout << tab2[i] << "\t";

	return 0;
}

0

Ok, a dlaczego cokolwiek przypuszczasz, zamiast zerknąć do dokumentacji i poczytać jak to całe sizeof działa? :-)

0

https://stackoverflow.com/questions/5126353/get-the-length-of-dynamically-allocated-array-in-c

Jak odpowiesz na oba moje pytania to może coś się rozjaśni.

2
//Rozwiązanie
#include <cstring>
#include <iostream>
using namespace std;

void func(int n, double *tab) {
	double *kopia = new double[n];

	memcpy(kopia, tab, n * sizeof(double));

	cout << "Skopiowana tablica: " << endl;
	for (int i = 0; i < n; ++i)
		cout << *(kopia + i) << "\t";

	delete[] tab;
	delete[] kopia;

}

int main() {
	cout << "Rozmiar: ";
	int n;
	cin >> n;
	cout << "Uzupełnij tablice: " << endl;
	double *tab = new double[n];
	for (int i = 0; i < n; ++i)
		cin >> tab[i];

	func(n, tab);
	return 0;
}

1

Muszę przyznać, że strasznie irytują mnie tego typu dyskusje o sizeof zamiast napisać wprost:

Początkujący programisto,

sizeof NIE SŁUŻY do sprawdzania rozmiaru tablicy
Z Twojego punktu widzenia - sizeof jest zupełnie nieprzydatny. Zapomnij o jego istnieniu.
No chyba że Twój nauczyciel programowania wyznaje zasadę uczenia C przed C++ - wtedy sizeof służy tylko i wyłącznie do jednego - do sprawdzania ile bajtów na Twoim komputerze zajmują typy int, float i double - żebyś mógł potem napisać np. 10*sizeof(double)

Jeśli gdzieś w sieci przeczytasz jak przy pomocy sizeof sprawdzić rozmiar tablicy - zmień stronę.

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