returnera en vektor från en funktion i c++|Programmering / Grafisk formgivning|Forum|Nordichardware

Search
Forum Scope


Match



Forum Options



Minimum search word length is 3 characters - maximum search word length is 84 characters
Lost password?
The forums are currently locked and only available for read only access
sp_Feed sp_TopicIcon
returnera en vektor från en funktion i c++
kalle_1
Almost a full-blooded keyboard-warrior
Medlem
Forum Posts: 206
Member Since:
July 29, 2005
sp_UserOfflineSmall Offline
1
June 7, 2005 - 6:28 pm
sp_Permalink sp_Print

som ovan jag vet inte hur man kan returnera en vektor från en funktion till main

ex
int test()
{
int vek[5] ={1,2,3,4,5};
return ????
}

Izomatic
Kommer du hit ofta?
Medlem
Forum Posts: 757
Member Since:
August 5, 2002
sp_UserOfflineSmall Offline
905080
June 7, 2005 - 6:46 pm
sp_Permalink sp_Print

Länge sedan c++, men jag skulle tro att det är "return vek"

Avatar
johan_lojan
Kommer du hit ofta?
Medlem
Forum Posts: 925
Member Since:
October 24, 2003
sp_UserOfflineSmall Offline
905084
June 7, 2005 - 6:48 pm
sp_Permalink sp_Print

Izomatic wrote: Länge sedan c++, men jag skulle tro att det är "return vek"

Sant.

Kronos
Mina inlägg skrivs i binär kod
Medlem
Forum Posts: 116
Member Since:
July 4, 2003
sp_UserOfflineSmall Offline
905089
June 7, 2005 - 6:56 pm
sp_Permalink sp_Print

En vektor går inte att returnera som en int.
Man måste använda sig av pekare eller referenser.

kalle_1
Almost a full-blooded keyboard-warrior
Medlem
Forum Posts: 206
Member Since:
July 29, 2005
sp_UserOfflineSmall Offline
905101
June 7, 2005 - 7:14 pm
sp_Permalink sp_Print

har testat men den skickar bara ett värde även med pekare referenser fungerar ej

squarepusher
Member
Medlem
Forum Posts: 2154
Member Since:
May 29, 2001
sp_UserOfflineSmall Offline
905109
June 7, 2005 - 7:30 pm
sp_Permalink sp_Print

varför måste du returnera hela vektorn till main?

Zymme
Siktar mot toppen
Medlem
Forum Posts: 69
Member Since:
October 17, 2004
sp_UserOfflineSmall Offline
905123
June 7, 2005 - 7:52 pm
sp_Permalink sp_Print

satt o jävlades med det här ett bra tag nån gång för länge sen men kom aldrig på hur man gjorde så man fick börja om från början o göra på nått annat sätt... hoppas nån vet =)

edit: fick inte pekare eller referenser att funka på nått vettigt sätt heller.

TERdON
Member
Medlem
Forum Posts: 2919
Member Since:
October 7, 2002
sp_UserOfflineSmall Offline
905154
June 7, 2005 - 8:53 pm
sp_Permalink sp_Print

Det är pekare eller referenser som är rätt (TM) sätt att göra det på (men då får du nog läsa på om minneshantering i C/C++ också), men det går att göra en fullösning och köra med en struct också.

http://forums.devshed.com/t31237/s.html

jarlen
Kommer du hit ofta?
Medlem
Forum Posts: 1233
Member Since:
November 23, 2001
sp_UserOfflineSmall Offline
905274
June 8, 2005 - 7:04 am
sp_Permalink sp_Print

Nu är inte jag så inne på C++ ännu, då jag bara läst C (ANSI). Där måste man skicka med en pekare till heltalsarrayen (int[]) och sedan arbeta utifrån detta i funktionen antingen med multiplicering av adresser ,vek[4], eller pekarartimetik (jättesnabbt), (vek)+5..

Du arbetar alltså endast mot minnesadresserna där arrayen ligger och inte mot en kopia av arrayen som du har där för att sedan skicka tillbaka hela till main med return.

jonaz
Kommer du hit ofta?
Medlem
Forum Posts: 940
Member Since:
May 8, 2001
sp_UserOfflineSmall Offline
905309
June 8, 2005 - 8:57 am
sp_Permalink sp_Print

kalle wrote: som ovan jag vet inte hur man kan returnera en vektor från en funktion till main

ex
int test()
{
int vek[5] ={1,2,3,4,5};
return ????
}

Här är ett sätt att göra det. En vektor i c/cpp (ej att förväxla med klassen Vector som kanske borde användas när man kodar cpp) är bara en pekare till det första elementet i vektorn.

Om du initierar din array på det sätt som du har gjort kommer du inte att ha mkt nytta av den efter den har returnerats till main. Utrymmet för din array har nämligen inte allokerats och kommer att "skrivas över"... Testa själv så kommer du att se att det blir fel ganska snabbt.


#include <iostream.h>

int* test() {
int *vek = new int[5];
for( int i=0; i<5; i++ ) {
vek[i] = i+1;
}
return vek;
}

int main() {
int *result = test();
for( int i=0; i<5; i++ ) {
cout << result[i] << endl;
// Alternativ:
//cout << *result++ << endl;
}
return 0;
}

Desktop: Gigabyte GA-MA770-DS3 | AMD Phenom II 955 BE | 8GB PC6400 | Samsung 1TB + 500GB | Powercolor HD3870
3DMark 2006: 11932 3DMark Vantage: P5137
Laptop: Macbook Pro 2012 | 8GB | Samsung 830 128GB SSD
HTPC: Mac Mini | 3GB | 500GB

kalle_1
Almost a full-blooded keyboard-warrior
Medlem
Forum Posts: 206
Member Since:
July 29, 2005
sp_UserOfflineSmall Offline
905439
June 8, 2005 - 12:45 pm
sp_Permalink sp_Print

jonaz wrote: [quote=kalle]som ovan jag vet inte hur man kan returnera en vektor från en funktion till main

ex
int test()
{
int vek[5] ={1,2,3,4,5};
return ????
}

Här är ett sätt att göra det. En vektor i c/cpp (ej att förväxla med klassen Vector som kanske borde användas när man kodar cpp) är bara en pekare till det första elementet i vektorn.

Om du initierar din array på det sätt som du har gjort kommer du inte att ha mkt nytta av den efter den har returnerats till main. Utrymmet för din array har nämligen inte allokerats och kommer att "skrivas över"... Testa själv så kommer du att se att det blir fel ganska snabbt.


#include <iostream.h>

int* test() {
int *vek = new int[5];
for( int i=0; i<5; i++ ) {
vek[i] = i+1;
}
return vek;
}

int main() {
int *result = test();
for( int i=0; i<5; i++ ) {
cout << result[i] << endl;
// Alternativ:
//cout << *result++ << endl;
}
return 0;
}

tack jonaz

jag är lite osäker på det med pekare och referenser men detta kommer göra att jag förstår mer

kalle_1
Almost a full-blooded keyboard-warrior
Medlem
Forum Posts: 206
Member Since:
July 29, 2005
sp_UserOfflineSmall Offline
905503
June 8, 2005 - 2:19 pm
sp_Permalink sp_Print

en fråga till var placerar man delete

TERdON
Member
Medlem
Forum Posts: 2919
Member Since:
October 7, 2002
sp_UserOfflineSmall Offline
905740
June 8, 2005 - 7:18 pm
sp_Permalink sp_Print

Ytterligare en lösning, men ENORMT ful är att använda en global variabel. Så ful att jag egentligen inte borde skriva den här...

Avatar
dae
Kommer du hit ofta?
Medlem
Forum Posts: 410
Member Since:
July 28, 2003
sp_UserOfflineSmall Offline
905896
June 9, 2005 - 7:10 am
sp_Permalink sp_Print

Det rätta sättet är att använda en std::vector-klass. Vanliga C-arrayer returnerar man bara inte, om man inte vet exakt vad man håller på med.
(Du frågade själv: 'var placerar man delete?')

Problemet är att det egentligen inte finns någon array-typ i C. En array är egentligen bara en pekare (en minnesadress). Om du returnerar en lokal array (som i din första post) returnerar du en address som inte längre är giltig (variabeln är ju bara allokerad så länge du befinner dig inne i funktionen i vilken variabeln är definierad). Alltså måste man allokera arrayen dynamiskt; men då får man istället problemet med frigöringen. Man bör undvika att allokera minne utan att frigöra det i samma funktion eftersom det är lätt hänt att man glömmer frigöra minnet senare (det finns naturligtvis undantag, det gör det alltid).

Om du vill att ha en funktion som initierar en C-array bör man göra som så:

// init_array antar att vec har minst 5 element
int* init_array(int *vec)
{
for (int i = 0; i < 5; i++)
vec[i] = i + 1;
return vec;
}

int main(int argc, char **argv)
{
int a_vector[5];
init_array(a_vector);
// a_vectors första 5 element är nu initierad

// Här kan man naturligtvis använda en vanlig int-variabel och
// indexera i a_vector istället.
for (int *v = a_vector; a < &a_vector[5 + 1]; v++)
std::cout << *v << std::endl;

int another_vector[4];
init_array(another_vector);
// Ajaj, i bästa fall har ditt program nu krashat. I värsta fall ser
// det ut som allt gick bra.
}
Forum Timezone: Europe/Stockholm
Most Users Ever Online: 1030
Currently Online:
Guest(s) 243
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Andreas Galistel: 16287
Jonas Klar: 15897
ilg@dd: 10810
Nyhet: 10607
Mind: 10550
Ctrl: 10355
Gueno: 9881
Guest: 9344
Snorch: 8881
Callister: 8468
Newest Members:
PetrbonFU PetrbonFU
Karine Bembry
Dolores Mcdaniels
Anibal McLeish
Francisca Alt
Alfie Everhart
Lester Huitt
Orlando Jorgensen
Mikki Lundgren
Dakota Kozlowski
Forum Stats:
Groups: 11
Forums: 59
Topics: 146630
Posts: 1300967

 

Member Stats:
Guest Posters: 2
Members: 79425
Moderators: 0
Admins: 11
Administrators: nordicadmin, Henrik Berntsson, Anton Karmehed, Carl Holmberg, Joel Oscarsson, Mikael Linnér, Mikael Schwartz, Andreas Paulsson, Nickebjrk, Mattias Pettersson, EmxL