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/que[...]amically-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, botów: 0