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

dodawanie elemntu do tablicy wykorzystujac strukture

Object Storage Arubacloud
0 głosów
175 wizyt
pytanie zadane 27 marca 2019 w C i C++ przez robertos18 Obywatel (1,120 p.)
edycja 28 marca 2019 przez robertos18

majac utworzoną strukturę chce stworzyć funkcje create i bedzie zwracac wskaznik do utworzonej struktury, następnie chce stworzyć funkcje add  ma zwrocic wskaznik do tej zmodyfikowanej struktury jako ze głownie zajmuje się front endem składnia c++ sprawia mi ogromne problemy i prosiłbym specjalistów c++ o pomoc.. Udało mi sie napisac tyle: 

#include <iostream>

using namespace std;
typedef int element_t;

struct container {
    element_t* address;
    unsigned int size;
    unsigned int capacity;
};

container* create(unsigned int capacity) {
    container* obj = new container;
    obj->address = new element_t[capacity];
    obj->size = 0;
    obj->capacity = capacity;
    return obj;
}


int main()
{


    return 0;

}



najwięcej problemów mam z funkcja dodającą element zupelnie nie potrafie się za to zabrac... 

1 odpowiedź

+1 głos
odpowiedź 27 marca 2019 przez criss Mędrzec (172,590 p.)
wybrane 27 marca 2019 przez robertos18
 
Najlepsza
Jak dla mnie jest ok, tylko nie mam pojęcia po co mnozysz przez 2 w 24 linii. Nie powinieneś dodać 1?
komentarz 27 marca 2019 przez robertos18 Obywatel (1,120 p.)
edycja 27 marca 2019 przez robertos18

przed dodaniem elementu sprawdzam czy w tablicy jest jeszcze miejsce jesli go brak to powiekszam dwukrotnie pojemnosc.. czy to tez jest dobrze napisane? teraz tak mysle ze powinno byc chyba : 

 a->size=a->capacity*2;

?

1
komentarz 27 marca 2019 przez criss Mędrzec (172,590 p.)

No nie. Przede wszystkim pojemność oznaczasz jako capacity, a nie size. A zwiększenie pojemności powinno się wiązać z realokacją pamięci na którą wskazuje address, inaczej nie ma mowy o żadnym powiększaniu.

Coś w tym stylu:

bool add(struct container* a,int element)
{
    if (a->size==a->capacity)
    {
        a->capacity *= 2;
        // zwalniasz starą pamięć i alokujesz nową ktora pomiesci nowe capacity
    }
    a->address[a->size] = element;
    ++(a->size);
    return true; //w zasadzie funkcja może być void, bo po co to zwracać
}
komentarz 27 marca 2019 przez robertos18 Obywatel (1,120 p.)

mam jeszcze pytanie z funkcja wyszukujaca element gdzie argumenty to wskaznik do struktury i szukana liczba i ona ma zwrocic adres wyszukiwanego elementu jeżeli występuje on w tablicy lub NULL jeżeli takiego elementu w tablicy nie ma

tutaj juz mam wiekszy problem nie wiem czy poprawnie zwracam ten adres i czy tak mogę zwrocic NULL..

int search(struct container* a,  int num)  
{      
    for(int i = 0; i < a->size; ++i)    
    {    
        if(a->address[i]==num)    
        {
            return &num;
        }
    }
    return NULL;
}

 

1
komentarz 27 marca 2019 przez criss Mędrzec (172,590 p.)
Teraz zwracasz adres argumentu, który jest zmienną lokalną. Czyli absolutnie nie możesz tak robić.

Co chcesz srobic, to zwrócić adres elementu kontenera czyli &a->address[i] albo po prostu a->address+i.
komentarz 27 marca 2019 przez robertos18 Obywatel (1,120 p.)

wpisując 

 if(a->address[i]==num)
        {
            return  &a->address[i];
        }

wyskakuje mi bład takiej postaci

"error: invalid conversion from 'element_t* {aka int*}' to 'int' [-fpermissive]|"

1
komentarz 27 marca 2019 przez criss Mędrzec (172,590 p.)
Bo twoja funkcja zwraca int. Przecież chciałeś zwracać wskaźnik (int*)
komentarz 27 marca 2019 przez robertos18 Obywatel (1,120 p.)

zatem wystarczy dopisac gwiazdkę ? 

int* search(struct container* a,  int num)
{
    for(int i = 0; i < a->size; ++i)
    {
        if(a->address[i]==num)
        {
            return  &a->address[i];
        }
    }
    return NULL;
}

 

1
komentarz 27 marca 2019 przez criss Mędrzec (172,590 p.)
Tak
komentarz 27 marca 2019 przez robertos18 Obywatel (1,120 p.)
mam jeszcze prosbę pomógłbyś mi teraz wywołac to w main? składnia w c++ jest dla mnie strasznie zawiła i przy wywoływaniu wyskakuja mi błędy..
komentarz 27 marca 2019 przez criss Mędrzec (172,590 p.)
Pokaż co teraz masz
komentarz 27 marca 2019 przez robertos18 Obywatel (1,120 p.)

mam tyle napisane i widze, ze to są totalne głupoty

struct container p;
      int capacity;
      cin>>capacity;
      container *tab=new container[capacity];
      create(capacity);
      for(int i=0; i<capacity; i++)
    {
        cin>>tab[i];
    }

 

1
komentarz 27 marca 2019 przez criss Mędrzec (172,590 p.)

Zgadza się :D

Napisze po prostu jakieś przykłady:

void deinit(container* a) {
   delete a->address; //zwolnij pamiec wewn tablicy
}

int main() {

unsigned int capacity;
cin >> capacity;
// w c++ nie potrzebujesz dodawać `struct` przed
container* p = create(capacity);
add(p, 5);
add(p, 4);
add(p, 8);
int* found = search(a, 8);
if (found)
   cout << *found << '\n';
deinit(p);
delete p; // zniszcz obiekt i zwolnij jego pamiec (create alokuje dynamicznie wiec jest to konieczne)
}
komentarz 27 marca 2019 przez robertos18 Obywatel (1,120 p.)

dziekuje bardzo  widząc taki przykład mozna się wiele nauczyc! 

int* found = search(a, 8);

nie powinno byc 

int* found = search(p, 8);

gdyz błedem jest ze a nie jest zadeklarowana

1
komentarz 27 marca 2019 przez criss Mędrzec (172,590 p.)
Tak, sorry, pomyłka

Podobne pytania

0 głosów
1 odpowiedź 137 wizyt
0 głosów
1 odpowiedź 207 wizyt
pytanie zadane 13 stycznia 2018 w C i C++ przez przemek1101 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 3,505 wizyt
pytanie zadane 19 września 2017 w C i C++ przez Sic Dyskutant (8,510 p.)

92,631 zapytań

141,498 odpowiedzi

319,869 komentarzy

62,011 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!

...