Jak zwrócić z funkcji tablicę z danymi ?

0

Potrzebuje rozwiązać taki problem. Chcę mieć funkcję która przyjmuje wartość string. W tej wartości jest zapytanie wyjmujące dane z bazy. Wartości może być kilka więc chciałbym by funkcja zwróciła mi tablicę wyników. I teraz tak. Nie chcę robić jakiejś globalnej tablicy bo to bez sensu.

  1. Czy to znaczy, że powinienem do funkcji jako argument przekazać nazwę tablicy do jakiej funkcja ma zwrócić dane?
  2. Czy powinienem przekazać wskaźnik do tej tablicy?
    I druga sprawa mianowicie nie wiem ile będzie elementów tablicy to jak stworzyć taką tablicę dynamiczną ?
0

Są 2 wersje. Albo zwracasz wskaźnik na pierwszy element nowozalokowanej tablicy lub też przekazujesz tablicę jako parametr do funkcji. Wybierz wygodniejsze dla Ciebie rozwiązanie.

0

A jak przekazać tablice jako parametr jak nie wiem ile w niej będzie elementów ? Powołać tablice dynamiczna i przekazać do niej wskaźnik ?

1

Możesz też użyć jakiegoś wrappera, np. std::vector. Dodatkowo w pakiecie otrzymasz kod leak-free.

0

Nie no jeszcze ni ejestem tak zaawansowany na wrapery i nie wiem co to leak free :D

0

Akurat std::vector to jedna z pierwszych konstrukcji, które poznaje się w STL. Co do drugiego - sprawdź sobie w słowniku. Masz takie doświadczenie w programowaniu, że takie zagadnienia powinieneś zjadać na śniadanie, z użyciem googli chociażby. Czy naprawdę tak trudno było wpisać w wyszukiwarkę 'C++ how to return array'?

0

Z tego co wyczytałem to można utworzyć tablicę statyczną gdzie przed kompilacją podaje się rozmiar lub dynamiczną, rozmiar podawany po kompilacji przez np użytkownika.
Czyli najpierw muszę przeliczyć ile zapytanie z bazy wyświetli wyników a później tę ilość wpisać
w zadeklarowaną tablicę dynamiczną ? Bo chciałem żeby rekordy zostały przepisane do tablicy tej mojej zadeklarowanej
dynamicznie ale dopiero podczas wpisania byłoby wiadomo ile jest elementów a nie przed. Czy da się to zrobić ?

0

Przecież mówimy o tym od samego początku.

0

Dostałeś już odpowiedź. Użyj vectora. Ma wszystko czego potrzebujesz. Metodą push_back() dodajesz elementy do końca tablicy, a dodatkowa pamięć jest przydzielana automatycznie.

0

No to tworze tablice dynamiczną wzięte ze strony:

int **tablica = new int * [n];
for (int j=0; j<n; j++){
tablica[j] = new int[n];
}

teraz można się odwołać do tej tablicy jako tablica[0][0]=5;

Wysyłam teraz wskaźnik tablicy do funkcji tak ? i ta funkcja wybiera dane z bazy i
ma przypisane wartości : result res = trans.exec("SELECT * FROM tabelka");
Czyli w mojej zmienej res[0][0] jest pierwsza kolumna tabeli w res[0][1] jest druga kolumna w tabeli

I teraz chce przepisać z tablicy res do mojej nowej balicy tablica
Jest taka funkcja kpiujaca dane
void * memcpy( void * adres_docelowy, const void * adres_zrodlowy, size_t ilosc );
I co tu wpisać skad wziac tą ilość jesli chce cała tablice to moge pominąc ten parametr?
i wpisac:
void * memcpy( void * tablica, const void * res, NULL );
Potrzebuje żeby zrozumieć zrobić prostą operację:

  1. wywołaj funkcje
  2. pokaż jej gdzie ma zwrócić dane
  3. Wybierz dane z bazy
  4. przypisz do tego miejsca co wksazałeś
  5. zwróć.
  6. po przetworzeniu zwolnij pamiec tablicy
  7. ta daaaam
0

No to tworze tablice dynamiczną wzięte ze strony:
uparty jesteś…

I co tu wpisać skad wziac tą ilość jesli chce cała tablice to moge pominąc ten parametr?
Nie możesz. Trzeba podać liczbę bajtów, czyli rozmiar elementu razy ilość elementów.

0

Bo generalnie chodzi o taki kod:

vector< vector<string> > ph;

work trans(*conn);
result res = trans.exec(value);
cout << "roz tablicy" << sizeof(res) << endl;
ph.assign( res, res );
trans.commit();

Chcę skopiować do kontenera dwuwymiarowa tablicę
ale przy kompilacji mam taki komunikat:

error: no type named 'iterator_category' in 'class pqxx::result'
error: no type named 'value_type' in 'class pqxx::result'

Od wczoraj o tym myslę i nie mogę wpaść na rozwiązanie

0

czym jest u ciebie result? jak ta klasa wygląda?

0

To jest ta klasa z biblioteki pqxx i ona jest tu: http://pqxx.org/devprojects/libpqxx/doc/stable/html/Reference/a00076.html
Jak zrobie cout << res[0]["id"] albo res[0][0] no to wysweitla elementy tablicy po indexie lub nazwie pola
wiec założyłem, że jest to tablica.

Nie wiem jak to zrobić prawidłowo z tym kopiowaniem tablicy do vectora być może znajde później odpowiedź ale obecnie zrobiłem tak:

vector< vector<string> > tabQuery;
		
	work trans(*conn);
	result res = trans.exec(value);
	/* set size of vector 1 level */
	tabQuery.resize(res.size()); 
	for (result::size_type i = 0; i != res.size(); ++i) {
		/* resize of vector level 2 */
		tabQuery[i].resize(res[i].size());
		for (int ii = 0; ii != res[i].size(); ii++) {
			tabQuery[i][ii] = (res[i][ii]).c_str();
		}
	}
	trans.commit();

Czyli:

  1. zadeklaruj vector dwuwymiarowy
  2. Ile jest wyników z bazy res = trans.exec(value); i jako res.size() daje mi wynik
  3. zmień wielkość vectora na taki rozmiar tablicy tabQuery.resize(res.size());
  4. Dla wszystkich takich wyników zadeklaruj ile jest kolumn w tabeli: for (result::size_type i = 0; i != res.size(); ++i) {
  5. tabQuery[i].resize(res[i].size()); tu wlasnie deklaruje kolumny dla kazdej tabQuery[1] zmieniam rozmiar na ilość kolumn res[i].size()
  6. do kazdej vartosci vectora tabQuery[i][ii] = (res[i][ii]).c_str(); przypisz wynik z bazy

To działa , teraz musze jakoś wyciągnąć vector przed funkcje i dać do niego wskaźnik czy żeby jakoś zwracał ten vecotr do głównego
programu. Sprawdze czy da się to jakoś przypisać zamiast znaku rownosci to pushbackiem ? tabQuery[i][ii].push_back(res[i][ii]).c_str()) ?

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