Tablica dynamiczna

0

Witam, mam taki kod (fragment), który ma na celu dodanie elementu do tablicy dynamicznej. Wykład to klasa a ostatni wiersz to podstawienie jakiegoś przykładowego wykładu. Na początku buff oraz tab wskazują na NULL, n = 0. Oto kod:

*buff = new Wyklad[n];
memcpy(*buff, *tab, n);
delete[] *tab;
*tab = new Wyklad[n + 1];
memcpy(*tab, *buff, n);
delete[] *buff;
n++;
tab[n] = przykladowywyklad;

A oto lista błędów :P :

main.cpp: In function âint main()â:
main.cpp:32: error: no match for âoperator=â in â buff = (operator new [](((size_t)(((((unsigned int)n) 6u) + 1u) 4u))), ((((unsigned int)<anonymous>) <unknown operator="operator"> ((unsigned int)n)), (<statement>, (((Wyklad)<anonymous>) + 4u))))â
dane.h:42: note: candidates are: Wyklad& Wyklad::operator=(const Wyklad&)
main.cpp:33: error: cannot convert âWykladâ to âvoidâ for argument â1â to âvoid memcpy(void, const void, size_t)â
main.cpp:34: error: type âclass Wykladâ argument given to âdeleteâ, expected pointer
main.cpp:35: error: no match for âoperator=â in â tab = (operator new [](((size_t)(((((unsigned int)(n + 1)) 6u) + 1u) 4u))), ((((unsigned int)<anonymous>) <unknown operator="operator"> ((unsigned int)(n + 1))), (<statement>, (((Wyklad)<anonymous>) + 4u))))â
dane.h:42: note: candidates are: Wyklad& Wyklad::operator=(const Wyklad&)
main.cpp:36: error: cannot convert âWykladâ to âvoidâ for argument â1â to âvoid memcpy(void, const void, size_t)â
main.cpp:37: error: type âclass Wykladâ argument given to âdeleteâ, expected pointer

Z góry dziękuję za odpowiedź.

0

Huh? Skoro buff i tab są wskaźnikami to po Ci wszędzie te dereferencje? Tzn te gwiazdki.

0
Wyklad *tab=0;
unsigned r=0; // aktualny rozmiar

// Zwiększenie lub zmniejszenie rozmiaru
void ResizeUpOrDown(unsigned n,const Wyklad &przykladowywyklad=Wyklad()) // można prosto Wyklad przykladowywyklad
  {
   if(r!=n)
     {
      Wyklad *tmp=new Wyklad[n];
      if(r)
        {
         unsigned m=r<n?r:n;
         for(unsigned i=0;i<m;++i) tmp[i]=tab[i]; // można memcpy(tmp,tab,m*sizeof(Wyklad)); o ile Wyklad nie zawiera cżeści dynamicznych
         for(unsigned i=m;i<n;++i) tmp[i]=przykladowywyklad;
         delete[] tab;
        }
      tab=tmp;
      r=n;
     }
  }

// lub dodanie jednego

void GrowByOne(const Wyklad &przykladowywyklad=Wyklad()) // można prosto Wyklad przykladowywyklad
  {
   Wyklad *tmp=new Wyklad[r+1];
   if(r)
     {
      for(unsigned i=0;i<r;++i) tmp[i]=tab[i]; // można memcpy(tmp,tab,r*sizeof(Wyklad)); o ile Wyklad nie zawiera cżeści dynamicznych
      tmp[r]=przykladowywyklad;
      delete[] tab;
     }
   tab=tmp;
   ++r;
  }

Pamiętaj że jak masz takie zwiększanie o jeden to vector<> jest zdecydowanie lepszy.

0

Dzięki za odpowiedzi, pomogło :) mam tylko pytanie co do mojego rozwiązania, nawet jeśli faktycznie usunę dereferencje to wciąż jest problem, wiesza się tak jakby wychodził poza tablicę. Jak zakomentuję n++ to działa. Da sie coś z tym zrobić?

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