Skocz do zawartości

Dodawanie Dwóch Tablic, Bez Przepisywania//C++


Savpether

Rekomendowane odpowiedzi

Witam, czy jest w C/C++ funkcja nie STLowa i nie będaca kontenerem, która pozwoli mi dodać drugą tablicę do pierwszej, bez nadpisywania tej pierwszej? Przepisywanie element po elemencie jest dla mnie za wolne.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem czy jest funkcja, ale wystarczy zrobic tablice wskazników zawierajaca N=liczba_el(array1)+liczba_el(array2) elementów, gdzie wskazniki przetrzymuja adresy pamieci kolejnych elementów z obu tablic. W ten sposób nie musisz nic kopiowac, wystarczy znac adresy pierwszych elementów tablic (czyli &array1 i &array2) i liczbe elementów.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, mój program spelnia te zalozenia. Tworze trzecia tablice o wielkosci dwóch poprzednich razem wzietych, mam tez adresy do pierwszych elementów dwóch pierwszych tablic. Mam przekopiowac adresy poszczególnych elementów kolejno do tej trzeciej?

Odnośnik do komentarza
Udostępnij na innych stronach

Nie o wielkosci, a o lacznej liczbie elementów dwóch pozostalych. Nie musisz kopiowac, bo jesli znasz typ to znasz tez jego wielkosc i wystarczy, ze przesuniesz wskaznik o iles bitów i w ten sposób uzyskasz adres kolejnego elementu w jednej z tych tablic. W ogóle to wydaje mi sie, ze wystarczy inkrementowac wskaznik i w ten sposób wskaznik przesunie sie na kolejny element, czyli &array1++, ale to musisz sprawdzic. Taki jakby pseudo-prawdziwy kod:

num_el = sizeof(array1) / sizeof(array1[0])+sizeof(array2) / sizeof(array2[0]);

int *array3[num_el]; //tablica o liczbie el.

Tu jakas petla od 0 do num_el

array3 = &array1;

&array1++;

I jak przejdzie to array1 to array2 tak samo.

 

Pózniej dostep do wartosci przez *(array3), a do adresów array3.

Cos w tym stylu.

  • Upvote 1
Odnośnik do komentarza
Udostępnij na innych stronach

Ok czaje, to pomoze, ale mam kolejny problem, mianowicie, jak zrobie tak:

cout << kopce[i]->tab_el[0]->priorytet << endl;

 

To wszystko jest ok, ale wtedy, gdy zamiast "0" dam kolejne indeksy dolaczonej tablicy to wywala blad. Sposób na to jest taki, ze zamiast pisac tab_el[28], trzeba pisac tak jak mówisz tab_el+28 i by bylo dobrze, gdyby to przechodzilo, ale tak nie jest. Jak zrobie:

cout << kopce[i]->tab_el+0->priorytet << endl;

To wywala mi:

[savpether@NB-Piotr Projekt 3]$ g++ -o main main.cpp
main.cpp: In function ‘int dolaczanie(kopiec**)’:
main.cpp:156:62: error: base operand of ‘->’ is not a pointer

 

Co ciekawe, gdyby tab_el zawierala elementy, a nie wskazniki na strukture z elementami (tab_el->priorytet), to by dzialalo, bo takie cos:

cout << kopce[i]->tab_el+28 << endl;

Dziala. Masz pomysl jak to inaczej zapisac by dzialalo?

Odnośnik do komentarza
Udostępnij na innych stronach

Ja juz teraz nie wiem co Ty z tym robisz, czym sa te zmienne. Takimi fragmentami to ciezko zrozumiec, ale dodawanie zwyczajnie liczb do wskaznika, a inkrementacja wskaznika to dwie zupelnie rózne operacje. Tylko inkrementujac wskaznik otrzymasz kolejny element. Jesli ten projekt jest za duzy zeby tu wrzucic to napisz kawalek kodu do wykonania tak jak wyzej opisalem. Czyli utwórz dwie zwykle tablice, potem tablice wskazników i przypisz do jej elementów adresy do elementów z dwóch poprzednich tablic. Spróbuj odczytywac wartosci jak podalem wyzej. Wklej tu taki programik i pokaz w czym problem.

 

EDIT: I tak juz mam wlaczonego Netbeansa, wiec dla relaksu wklepalem kilka linijek i okazalo sie, ze cos namieszalem wczesniej. Tak bedzie ok:

#include <cstdlib>
#include <iostream>
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
int array1[3] = {5,4,3};
int array2[3] = {2,1,0};
int num_el = sizeof(array1) / sizeof(array1[0])+sizeof(array2) / sizeof(array2[0]);
int *array3[num_el];
for (int i=0; i<sizeof(array1) / sizeof(array1[0]); i++) {
	array3[i] = &array1[i];
}
for (int i=sizeof(array1) / sizeof(array1[0]), j=0; i<num_el; i++, j++) {
	array3[i] = &array2[j];
}

for( int i=0; i<num_el; i++) {
	cout << "El numer " << i << " ma wartosc " << *(array3[i]) << endl;
}

return 0;
}

I wyjscie to:

El numer 0 ma wartosc 5

El numer 1 ma wartosc 4

El numer 2 ma wartosc 3

El numer 3 ma wartosc 2

El numer 4 ma wartosc 1

 

EDIT2: No a z tymi wskaznikami:

int main(int argc, char** argv) {
   int array1[3] = {5,4,3};
   int array2[3] = {2,1,0};
   int *array_p1 = &array1[0];
   int *array_p2 = &array2[0];
   int num_el = sizeof(array1) / sizeof(array1[0])+sizeof(array2) / sizeof(array2[0]);
   int *array3[num_el];
   for (int i=0; i<sizeof(array1) / sizeof(array1[0]); i++) {
    array3[i] = array_p1;
    array_p1++;
   }
   for (int i=sizeof(array1) / sizeof(array1[0]); i<num_el; i++) {
    array3[i] = array_p2;
    array_p2=array_p2+1;
   }

   for( int i=0; i<num_el; i++) {
    cout << "El numer " << i << " ma wartosc " << *(array3[i]) << endl;
   }

   return 0;
}

Czyli jak widzisz dziala zarówno array_p1++ jak i array_p2=array_p2+1.

Edytowane przez thof
Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...