Avatar billede folle Nybegynder
22. juli 2001 - 13:10 Der er 24 kommentarer og
2 løsninger

Funktion som returner et array

Er det muligt at lave en funktion i C som returnerer et array???

Mit bud er:

int liste(int x,int y)[]
{
  int temp[2];
  temp[0]=x
  temp[1]=y
  return temp;
}

Når man compillerer får man en fejl som siger at man har lavet en funktion som returnerer et array. Compileren har ret, men hvorfor kan den ikke klare det???
Avatar billede morten2 Nybegynder
22. juli 2001 - 13:21 #1
Du kan ikke retunere et array på denne måde.
Eller sagt med andre ord:

En funktion kan ikke retunere et array. Den kan kun retunere en pointer på et array.


int* liste(int x,int y)
{
  int* temp = new int [2];
  temp[0]=x;
  temp[1]=y;
  return temp;
}
Avatar billede folle Nybegynder
22. juli 2001 - 14:45 #2
Bliver \"temp\" ikke nedlagt når funktionen afsluttes?
Avatar billede folle Nybegynder
22. juli 2001 - 15:46 #3
Den foreslåede funktion giver en fejl når den compilleres.

test.c: In function \'liste\':
test.c:11: \'new\' undeclared (first use in this function)
test.c:11: (Each undeclared identifier is reported only once
test.c:11: for each function it appears in.)
test.c:11: parse error before \'int\'
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:15 #4
folle >> har du lavet koden i en c++ compiler eller i en c compiler...??

\'new\' virker vist nok kun i c++ !!!

og jo \'temp\' bliver nedlagt når funktionen afsluttes..  men du returnerer jo adressen videre til array\'et ved kaldet:  \'return\'

så...: lav koden i c++ hvis det skal virke..!
Avatar billede folle Nybegynder
22. juli 2001 - 16:29 #5
Det virker hvis jeg bruger c++ compileren.

Jeg har fået opgaven i forbindelse med mit studie og en af betingelserne er at jeg skriver programmet i C. Kan man virkelig ikke returnere et array i C???
Avatar billede kamikaze Nybegynder
22. juli 2001 - 16:31 #6
Den returnerede pointer (arrayet) skal også initialiseres som en pointer. Den kan så refereres som et array. FX:

#include <iostream.h>
#include <conio.h>

int* GetArray()
{
  int* Temp = new int[3];
  Temp[0] = 10;
  Temp[1] = 20;
  Temp[2] = 30;
  return Temp;
}

void main()
{
  int* Temp = GetArray();

  cout << Temp[0] << endl;
  cout << Temp[1] << endl;
  cout << Temp[2] << endl;
  getch();
}

// Borland C++ 5.02
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:33 #7
ok denne version er lidt skummel men skulle virke:

int* liste(int x,int y)
{
  int tempdir[2];
  int* temp = tempdir;

  temp[0]=x;
  temp[1]=y;
  return temp;
}
Avatar billede kamikaze Nybegynder
22. juli 2001 - 16:33 #8
Ups!!! Jeg havde ikke lige set de nyeste indlæg...
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:35 #9
det går nogle gange meget stærkt her på eksperten...

man når lige at svare og så har andre også gjort det...
Avatar billede kamikaze Nybegynder
22. juli 2001 - 16:36 #10
YEPS!!!
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:37 #11
den burde også virke:

int* liste(int x,int y)
{
  int temp[2];

  temp[0]=x;
  temp[1]=y;
  return &temp;
}
Avatar billede kamikaze Nybegynder
22. juli 2001 - 16:37 #12
Jeg ved ikke så meget om ren C, men skal man ikke bruge malloc til at allokere memory???
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:38 #13
jo, men er vist ikke nødvendigt for et array på en 2-3 integers er det ??
Avatar billede kamikaze Nybegynder
22. juli 2001 - 16:40 #14
Det tror jeg... Jeg tror ikke dine 2 sidste forslag kommer til at virke!
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:43 #15
lad manden prøve dem...
Avatar billede kamikaze Nybegynder
22. juli 2001 - 16:46 #16
Selvfølgelig... Men der skal altså allokeres memory på en eller anden måde!
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:53 #17
denne virker...:



#include <stdio.h>

int* liste(int x,int y) {

  int temp[2];

  temp[0]=x;
  temp[1]=y;
  return &temp[0];
}


void main( ) {

int * tbl = liste( 2, 1 );
printf( \"(x,y) = (%d,%d)\\n\", tbl[0], tbl[1] );

}
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:56 #18
både med eller uden NEW/MALLOC bliver der allokeret hukommelse...

det er blot et spørgsmål om hvor...

når man bruger new/malloc skal man jo også huske at slette dem igen (delete osv..)
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:56 #19
eksemplet virker i \'C\'
Avatar billede karlkoder Nybegynder
22. juli 2001 - 16:59 #20
hvis du bruger STORE arrays er det et MUST at du allokerer hukommelsen selv med new/alloc men for 2-3 integers kan det være hip som hap...
Avatar billede kamikaze Nybegynder
22. juli 2001 - 17:05 #21
karlkoder >> jeg tager mine ord i mig igen!!!
Avatar billede karlkoder Nybegynder
22. juli 2001 - 17:48 #22
det er okay..
men kan ham \'folle\' bruge det ??
Avatar billede morten2 Nybegynder
22. juli 2001 - 17:53 #23
Koden

int* liste(int x,int y) {

  int temp[2];

  temp[0]=x;
  temp[1]=y;
  return &temp[0];
}

Er efter min mening dybt kriminel :-)

Arrayet int temp[2] bliver lokalt allokeret inde i funktionen. Når der retuneres fra funktionen er arrayet ikke længere \"legalt\" (deallokeret).

Det har ikke noget at gøre med om man bruger små eller store arrays.

new er et keyword i c++. Det findes ikke i c.
Brug

(*int)malloc(sizeof(int) * arraySize)

itedet.

Husk malloc deallokeres med free() og new med delete.


Avatar billede karlkoder Nybegynder
22. juli 2001 - 17:57 #24
morten2 >> du har ret..

men burde man egentlig ikke sende en reference til et array til funktionen istedet og så \'returnere\' denne.. ??

det ville jeg personlig gøre..
Avatar billede karlkoder Nybegynder
22. juli 2001 - 17:58 #25
egentligt burde arrayet være allokeret \'udenfor\' funktionen...
Avatar billede folle Nybegynder
22. juli 2001 - 18:01 #26
Nu har jeg fået det til at virke...
Tak for hjælpen :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester