July 29, 2005
July 29, 2005
October 7, 2002
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å.
November 23, 2001
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.
May 8, 2001
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
July 29, 2005
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
July 29, 2005
July 28, 2003
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.
}
1 Guest(s)