Przekazywanie tablicy obiektu do funkcji - Problem

0

Witam. Pisze pewien program na zaliczenie semestru i zbliżam się ku końcowi ale pojawił sie pewien problem i proszę o pomoc.
Mam sobie klase
class moja_clasa
{
public:
std::string typ;
std::string wartosc;
int count;
}
Obiekt tej klasy tworzę przy akcji on_push_button a raczej tablice klasy

moja_clasa common[117];

wpisuje sobie wartości w pęlti w pole wartość w cała ta tablice. Potem potrzebuję przekazać ten obiekt jako parametr do innej funkcji, gdyż muszę operować na tym samym common cały czas.
A dokładniej to wygląda tak:

w push buttonie wywołuje test(&commmon[117]);

void test(moja_clasa asd[117)
{
//odwouje sie do obiektu tak
for(int i=0;i<117;i++)
{
if (asd[i].wartosc=="napis") asd[i].count=asd[i].count+1;
}
//i pojawia sie pewien problem ze moj program sie po prostu wysypuję. zakladam ze w jakis dziwny spsob funcja nie dostala tej classy common w ktorej byly juz wartosci.
}
Zaznaczam ze to wszystko dzieje sie podczas akcji pushbutton. Nie mam pojecia dlaczego tak sie dzieje. Patrzyłem w kilku kursach i jest teoretycznie wszystko sie zgadza. Kompiluje sie bez błędów tylko na tej akcji jest crash a kompilator zwrócił "program nieoczekiwanie zakonczył prace"
Proszę o pomoc i z góry dzieki.

0

Jeżeli tworzysz tablice obiektów to wywoływany jest konstruktor domyślny(chyba że sam określisz jaki konstruktor ma by wywołany) w tym konstruktorze domyślnym musisz nadać jakieś początkowe wartości zmiennym w klasie bo jeśli tego nie zrobisz zawierają one "śmieci" a w funkcji test() odwołujesz się do tych śmieci..

Zamień również funkcję test na:

void test(moja_clasa *asd)
{
//odwouje sie do obiektu tak 
for(int i=0;i<117;i++)
 {
 if (asd[i].wartosc=="napis") asd[i].count++;
 }

a wywołuj funkcję tak:

test(common);
0

Gdy chciałem wywołać bez & kompilator zwracał

 błąd:no matching function for call to 'EXIFFile::Edit(Ui::MainWindow*&, wspolne_dane*&)'
 candidate is: void EXIFFile::Edit(Ui::MainWindow*, wspolne_dane**)

Teraz robię tak.

//moja klasa
class wspolne_dane
{
public:
    std::string tag_name;
    std::string typ_tag;
    int count;
};
//zadeklarowanie w akcji push i reszta działań jest podczas tej akcji.
 wspolne_dane *common[117];
//wpisuje wartosci dla tej tablicy
        for (int i=0;i<ui->listWidget_7->count();i++)
         {
            common[i]=new wspolne_dane;
            common[i]->tag_name=ui->listWidget_7->item(i)->text().toStdString();
            common[i]->count=0;
            common[i]->typ_tag="brak";
         }
//sprawdziłem czy nie wyjechało nic poza i wszystko przeszło gładko gdy wyświetliłem teraz z mojej klasy
//potem chcialem cokolwiek wyświetlić znów z mojej klasy tyle ze w innej funkcji i program dostaje crash... 
funkcja(ui,&common[117]);  //wywolanie

void funkcja (Ui::MainWindow *ui, wspolne_dane *dane[117])
{
QString test;
test=test.fromStdString(dane[1]->tag_name); //po wykomentowaniu tej linijki jest ok...
ui->listwidget->addItem(test);
}
0

Spróbuj tak:

class wspolne_dane
{
public:
    std::string tag_name;
    std::string typ_tag;
    int count;
};

 wspolne_dane *common[117];

        for (int i=0;i<ui->listWidget_7->count();i++)
         {
            common[i]=new wspolne_dane;
            common[i]->tag_name=ui->listWidget_7->item(i)->text().toStdString();
            common[i]->count=0;
            common[i]->typ_tag="brak";
         }
 
funkcja(ui,&common[numer_obiektu]]);  //wywolanie
 
void funkcja (Ui::MainWindow *ui, wspolne_dane *dane)
{
ui->listwidget->addItem(dane->tag_name);
}

Jeżeli dobrze zrozumiałem o co Ci chodzi to void funkcja (Ui::MainWindow *ui, wspolne_dane *dane) przyjmuje wskaźnik do ui::MainWindow oraz wskaźnik do konkretnego obiektu wspolne_dane, funkcja ta dodaje Item do listwidget przekazując jako argument składową tag_name.

Wywołanie musi odbyć się tak: funkcja(ui,&common[numer_obiektu]); gdzie numer_obiektu to numer obiektu którego zmienną tag_name chcesz dodać do listwidget, więc jeśli chcesz dodać całą tablice musisz użyć pętli for dla każdego obiektu

0

Niestety to rozwiązanie odpada. Bo w tej wywolanej funkcji bede potrzebował operować na całej tej 117 elementowej tablicy. W takim razie prosiłbym o sugestie jakiej struktury muszę użyć by przekazać całość i by pracować na orginale.

0

No to po prostu zrób tak:

 
class wspolne_dane
{
public:
    std::string tag_name;
    std::string typ_tag;
    int count;
};
 
 wspolne_dane common[117];
 
        for (int i=0;i<ui->listWidget_7->count();i++)
         {
            common[i].tag_name=ui->listWidget_7->item(i)->text().toStdString();
            common[i].count=0;
            common[i].typ_tag="brak";
         }
 
funkcja(ui,common);  //wywolanie
 
void funkcja (Ui::MainWindow *ui, wspolne_dane *dane)
{
// tutaj w dane "zawarte" są wszystkie elementy i odwołujesz się normalnie przez index 
}
0

Dzięki za pomoc ale zrobiłem trochę inaczej.
Przekazałem
funkcja(common,117); // wywolanie
void funkcja (moja_klasa commmon[], int rozmiar) //cialo
{
}

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