Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
pawegio
Sędziwy Jeż
Posty: 31 Rejestracja: 20 sie 2009, 11:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:
Post
autor: pawegio » 31 paź 2009, 22:56
Witam,
aby przekazać wektor do funkcji używa się operatora adresu i wygląda to tak:
Co jeśli chcę przekazać do funkcji tablice wektorów, np. vector<int> tab[200000] ?
1).
2).
Kod: Zaznacz cały
funkcja(vector<vector <int>&>& tab) {
...
}
3).
Żadna z tych trzech opcji nie działa. Jak to zaimplementować?
beluosus
Zakręcona Traszka
Posty: 695 Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:
Post
autor: beluosus » 31 paź 2009, 23:43
Priorytety operatorów kłaniają się.
pawegio
Sędziwy Jeż
Posty: 31 Rejestracja: 20 sie 2009, 11:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:
Post
autor: pawegio » 31 paź 2009, 23:50
Ok problem ominąłem chyba, ale dzięki za radę na przyszłość, jednak teraz pojawia się teraz inny problem. Wyskakuje to moje ulubione Segmentation fault przy takim kodzie:
Kod: Zaznacz cały
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int n,m,a,b;
vector<int> d[200000];
vector<int> V;
void bfsGo(int start) {
queue<int> q;
V[start] = 1;
q.push(start);
while (!q.empty()) {
int u;
u = q.front();
q.pop();
for (int i = 0; i < n; ++i)
if (d[u][i] && !V[i]) {
V[i] = 1;
q.push(i);
}
}
}
void bfs() {
for (int i = 0; i < n; ++i)
if (!V[i]) {
bfsGo(i);
}
}
int main() {
scanf("%d %d",&n,&m);
V.clear(); V.resize(n,0);
for(int i=0;i<m;i++) {
scanf("%d %d",&a,&b);
d[b].push_back(a);
d[a].push_back(b);
}
bfs();
return 0;
}
beluosus
Zakręcona Traszka
Posty: 695 Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:
Post
autor: beluosus » 01 lis 2009, 00:06
Nie bardzo chce mi się analizować, bo to strasznie pokręcone jest ale w tym miejscu najwyraźniej odwołujesz się do nieistniejącego elementu:
Kod: Zaznacz cały
for (int i = 0; i < n; ++i)
if (d[u][i] && !V[i]) {
V[i] = 1;
q.push(i);
}
pawegio
Sędziwy Jeż
Posty: 31 Rejestracja: 20 sie 2009, 11:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:
Post
autor: pawegio » 01 lis 2009, 00:13
a jak w tym wypadku przekazać wielkość tablicy d do tej funkcji? Bo już po paru debugach widzę gdzie tkwi błąd...
EDIT: Ok, już wiem...
luzakwielki
Wytworny Kaczor
Posty: 264 Rejestracja: 19 lis 2008, 11:42
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Post
autor: luzakwielki » 01 lis 2009, 00:20
pawegio pisze: a jak w tym wypadku przekazać wielkość tablicy d do tej funkcji? Bo już po paru debugach widzę gdzie tkwi błąd...
Dać wielkość jaką może mieć, a nie pisać poza zaalokowaną pamięcią (puść debug i sprawdź jakie jest "u" i "i" w "d" i czy nie jest większe niż zaalokowałeś).
pawegio
Sędziwy Jeż
Posty: 31 Rejestracja: 20 sie 2009, 11:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:
Post
autor: pawegio » 02 lis 2009, 18:40
problem rozwiązany, bfs który napisałem pasowałby do tablicy dwuwymiarowej jako grafu, ale nie do tablicy wektorów, gdzie graf trochie inaczej się reprezentuje... Umnknął mi ten fakt i te dwie struktury potraktowałem jako identyczne.
luzakwielki
Wytworny Kaczor
Posty: 264 Rejestracja: 19 lis 2008, 11:42
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Post
autor: luzakwielki » 02 lis 2009, 23:13
pawegio pisze: problem rozwiązany, bfs który napisałem pasowałby do tablicy dwuwymiarowej jako grafu, ale nie do tablicy wektorów, gdzie graf trochie inaczej się reprezentuje... Umnknął mi ten fakt i te dwie struktury potraktowałem jako identyczne.
To nie dwie struktyry, a jedna (wektor z c++ to rozszerzalna tablica (gdy chcesz więcej wepchać więcej danych do tablicy niż zaalokowałeś robi realloc tablicy)).
mikolajs
Wytworny Kaczor
Posty: 352 Rejestracja: 15 paź 2008, 18:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma
Post
autor: mikolajs » 03 lis 2009, 14:25
A nie lepiej zamiast: vector<int> d[200000];
konsekwentnie vector<vector<int> > d;
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości