Avatar billede ahara Nybegynder
09. januar 2006 - 19:36 Der er 24 kommentarer og
1 løsning

Kalde funktion med array

Hvad er det lige jeg gøre galt? Jeg kan ikke kalde funktionen med mit array

#include "stdafx.h"

double corr2(int *fil, int *image)
{
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    double r;

    int fil[3][3];
    int image[3][3];

    fil[1][1]=8;
    fil[1][2]=1;
    fil[1][3]=6;
    fil[2][1]=3;
    fil[2][2]=5;
    fil[2][3]=7;
    fil[3][1]=4;
    fil[3][2]=9;
    fil[3][3]=2;

    image[1][1]=8;
    image[1][2]=1;
    image[1][3]=6;
    image[2][1]=3;
    image[2][2]=5;
    image[2][3]=7;
    image[3][1]=4;
    image[3][2]=9;
    image[3][3]=2;

    r = corr2(fil,image);

    return 0;
}

Håber i kan hjælpe.
Avatar billede ranglen Nybegynder
09. januar 2006 - 19:50 #1
1)
arrays er altid 0-indexeret

2)
double corr2(int *fil, int *image) => double corr2(int **fil, int **image)

så kan du medsende dine arrays, som har 2 dimensioner
Avatar billede bertelbrander Novice
09. januar 2006 - 19:53 #2
Man kan ikke overføre et 2D (eller 3D eller ...) til en funktion.

Hvis array'et altid har samme størrelse kan man putte dem ind i en struct:

struct TwoDArray
{
  int Array[3][3];
};

double corr2(TwoDArray* fil, TwoDArray* image)
{
    return 0;
}

int main(int argc, char *argv[])
{
    double r;

    TwoDArray fil;
    TwoDArray image;

    fil.Array[0][0]=8;
    ...
    image.Array[0][0]=8;
    ...

    r = corr2(&fil, &image);

    return 0;
}
Avatar billede arne_v Ekspert
09. januar 2006 - 19:57 #3
int **image

er en pointer til en pointer, hvilket ikke er et 2D array
Avatar billede arne_v Ekspert
09. januar 2006 - 19:58 #4
selvfølgelig kan man overføre et 2D array til en funktion

men alle dimensioner undtagen den første skal angives

double corr2(int fil[][3], int image[][3])
Avatar billede ahara Nybegynder
09. januar 2006 - 20:02 #5
Er ved at skrive noget Matlab kode over i c++ og Matlab er jo one based :-)

Til ranglen:

Jeg får følgende fejl ved din kode (double corr2(int **fil, int **image))

error C2664: 'corr2' : cannot convert parameter 1 from 'int [3][3]' to 'int ** '
Avatar billede ahara Nybegynder
09. januar 2006 - 20:03 #6
Virker med arnes forslag

double corr2(int fil[][3], int image[][3])

Men så sender jeg hele arrayet i stedet for en pointer
Avatar billede arne_v Ekspert
09. januar 2006 - 20:06 #7
prøv

double corr2(int *fil[][3], int *image[][3])

r = corr2(&fil,&image);
Avatar billede bertelbrander Novice
09. januar 2006 - 20:12 #8
Denne:
double corr2(int fil[][3], int image[][3])
Overfører IKKE array'et men en pointer til array'et.

Hvis jeg kører dette får jeg 123 og 321:
#include <iostream>

double corr2(int fil[][3], int image[][3])
{
    fil[1][1] = 321;
    return 0;
}

int main(int argc, char* argv[])
{
    double r;

    int fil[3][3];
    int image[3][3];

    fil[1][1] = 123;
    std::cout << fil[1][1]  << std::endl;
    r = corr2(fil,image);
    std::cout << fil[1][1]  << std::endl;
    return 0;
}
Avatar billede ahara Nybegynder
09. januar 2006 - 20:13 #9
i min corr2 funktion kan jeg så benytte fil og image sådan ikk

int a=*fil[2][2]

men en return af a giver så følgende fejl

error C2664: 'corr2' : cannot convert parameter 1 from 'int [3][3]' to 'int *[][3]'
Avatar billede ahara Nybegynder
09. januar 2006 - 20:55 #10
Ovenstående var til arne. Jeg benytter dette:

double corr2(int *fil[][3], int *image[][3])

r = corr2(&fil,&image);

Hvis jeg så vil sætte en variabel "res" til fil[3][3] i corr2 funktionen og returnere res så sætter jeg res=*fil[3][3]

return res;

error C2664: 'corr2' : cannot convert parameter 1 from 'int (*__w64 )[3][3]' to 'int *[][3]'
Avatar billede arne_v Ekspert
09. januar 2006 - 20:57 #11
hvis jeg har fortsået Bertel rigtigt så er

double corr2(int fil[][3], int image[][3])

faktisk OK til dit brug
Avatar billede arne_v Ekspert
09. januar 2006 - 20:58 #12
hvis du vil det andet så prøv

int a=(*fil)[2][2];
Avatar billede ahara Nybegynder
09. januar 2006 - 20:59 #13
Men men denne kode sender jeg da arrayet og ikke en pointer

double corr2(int fil[][3], int image[][3])

Eller har jeg misforstået det?
Avatar billede bertelbrander Novice
09. januar 2006 - 21:01 #14
Det burde ikke være nødvendigt med:
double corr2(int *fil[][3], int *image[][3])

Brug denne:
double corr2(int fil[][3], int image[][3])

Der overføres alligevel en pointer til array'et og ikke array'et
Avatar billede ahara Nybegynder
09. januar 2006 - 21:05 #15
ok tak. Hvis jeg lige må spørge om sidste spørgsmål. Hvilken kode skal der til for at finde størrelsen på mit array?
Avatar billede bertelbrander Novice
09. januar 2006 - 21:06 #16
Det kan du ikke, det er en "sideeffect" af at der overføres en pointer.
Du bliver nødt til at overføre en størrelse også.
Avatar billede ahara Nybegynder
09. januar 2006 - 21:10 #17
Men hvad er det så jeg skriver i min main?
Avatar billede arne_v Ekspert
09. januar 2006 - 21:11 #18
du sender bare første dimension med som et argument til funktionen
Avatar billede ahara Nybegynder
09. januar 2006 - 21:13 #19
Det er jeg med på men kan jeg ikke i min main skrive noget lignende fil.size() eller image.size()
Avatar billede bertelbrander Novice
09. januar 2006 - 21:16 #20
Du kan bare bruge:
r = corr2(fil,image, 3);


Eller
r = corr2(fil,image,sizeof(fil)/sizeof(fil[0]));
Avatar billede bertelbrander Novice
09. januar 2006 - 21:17 #21
fil og image er ikke class'er så de har ingen .xxx()
Avatar billede ahara Nybegynder
09. januar 2006 - 21:18 #22
tak. der er point til alle. mange tak for hjælpen :-)
Avatar billede bertelbrander Novice
09. januar 2006 - 21:22 #23
Jeg samler ikke på point.
Avatar billede arne_v Ekspert
09. januar 2006 - 21:29 #24
en af de store forskelle på normal standard C++ og MS managed C++

i sidstnævnte kan man faktisk spørge om længden på et array - fordi alle arrays
har an fælles basis klasse

i førstnævnte har man adressen på det første element - og det er ens eget
ansvar at holde styr på hvor mange elementer der er
Avatar billede arne_v Ekspert
09. januar 2006 - 21:30 #25
og et svar
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