Avatar billede venja Nybegynder
11. april 2003 - 16:29 Der er 12 kommentarer og
1 løsning

Returnere 3 stk arrays (int xxxxx[ ][ ];) fra en funktion - - - ?

(min kode er nederst i teksten)

- jeg kalder denne funktion fra mit hovedprogram og vil så gerne returnere de tre arrays; date, time og data - findes der en let forståelig måde at gøre dette på ???
Avatar billede venja Nybegynder
11. april 2003 - 16:31 #1
*********************************************/

//    Funktionen OnHent() henter dato, tid
//    og random data fra filen "måledata.txt"

/*********************************************/
void CTal1Dlg::OnHent()
{
const int lines = 10;
const int sizeline =25;
const int sizedate =5;
const int sizetime =5;
const int sizedata =4;

int i;
int j;

int date[lines][sizedate];
int time[lines][sizetime];
int data[lines][sizedata];

char line[lines][sizeline];

FILE *fp;

fp = fopen("måledata.txt", "r");

for(i=0;i<lines;i++)
    fgets(line[i],sizeline,fp);
 
fclose(fp);

for(i=0;i<lines;i++)
    {
        for(j=0;j<sizedate;j++)
            date[i][j]=(int)line[i][j]-48;
    }

    for(i=0;i<lines;i++)
    {
        for(j=0;j<sizetime;j++)
            time[i][j]=(int)line[i][j+9]-48;
    }

    for(i=0;i<lines;i++)
    {
        for(j=0;j<sizedata;j++)
            data[i][j]=(int)line[i][j+18]-48;
    }

UpdateData(FALSE);
}
Avatar billede jpk Nybegynder
11. april 2003 - 16:33 #2
Du har vist glemt koden...

Du kan ikke returnere mere end 1 værdi fra en funktion, men du kan fx give funktionen pointere til nogle arrays med, som du så kan "udfylde" i din funktion.
Avatar billede arne_v Ekspert
11. april 2003 - 16:33 #3
Lav en struct og returner den !
Avatar billede venja Nybegynder
11. april 2003 - 16:34 #4
hvordan laver jeg en struct ?
Avatar billede arne_v Ekspert
11. april 2003 - 16:36 #5
struct result3 {
  int* datep;
  int* timep;
  int* datap;
}

struct result3 CTal1Dlg::OnHent()

struct resul3 r;

r.datep = date;
r.timep = time;
r.datap = data;

retrurn r;
Avatar billede arne_v Ekspert
11. april 2003 - 16:37 #6
MEGET VIGTIGT:

Du må ikke returnere pointere til lokale variable.

date/time/data skal enten flyttes op som statiske variable
eller allokeres dynamisk med malloc.
Avatar billede venja Nybegynder
11. april 2003 - 16:41 #7
tak for det !! - det prøver jeg lige at se om jeg kan finde ud af... - hvad mener du med dynamisk allokering med malloc ?
Avatar billede olennert Nybegynder
11. april 2003 - 16:44 #8
For at undgå statiske variable eller dynamisk allokering med new eller malloc så vil jeg foreslå std::vector.

#include <vector>
using std::vector;
typedef vector<int> IntVector;
struct result3 { IntVector datep, timep, datap; }
struct result3 CTal1Dlg::OnHent() {
  int date, time, data;
  // Takket være magi får date, time og data værdier her
  datep.push_back(date);
  timep.push_back(timep);
  datap.push_back(timep);
}

Det koster ekstra kald af copy constructors, men du slipper for at bekymre dig om statiske (globale) variabler eller dynamisk allokeret data.
Avatar billede arne_v Ekspert
11. april 2003 - 16:46 #9
Hvis du erstatter:

int date[lines][sizedate];

med:

int* date = (int *)malloc(lines*sizedate*sizeof(int));

så bliver date dynamisk allokeret.
Avatar billede venja Nybegynder
11. april 2003 - 16:46 #10
svarer dette til at pruge kommandoerne PUSH og POP i assembler ?
Avatar billede arne_v Ekspert
11. april 2003 - 16:48 #11
Men det bliver dog så et en-dimensionelt array, hvor du selv skal håndtere
de to dimensioner via lineno*sizedate+dateno.

static int date[lines][sizedate];
static int time[lines][sizetime];
static int data[lines][sizedata];

flyttet op ovenover:

void CTal1Dlg::OnHent()

er nok nemmere.
Avatar billede arne_v Ekspert
11. april 2003 - 16:50 #12
Ellers så brug olennert's forslag om vector.

Det er ihvertfald den mest moderne måde at gøre det på.

(og STL vector er meget meget langt fra assembler - også selvom
de deler begreber som pop og push)
Avatar billede venja Nybegynder
11. april 2003 - 16:53 #13
ok - tak for hjælpen - nu har jeg vist til et par timer.....
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