Avatar billede n30thaone Nybegynder
05. juli 2004 - 02:52 Der er 8 kommentarer og
2 løsninger

Send char til funktion?

Hvordan sender jeg et char array til en funktion, for derefter at kunne få funktionen til at sende et nyt char array tilbage? Jeg har prøvet at lave en reference til mit array, men så kan jeg kun sende en bestemt værdi til funktionen, og ikke hele arrayet... Har ikke prøvet at returnere, men tror jeg har en idé om hvordan det kan gøres...
Avatar billede bertelbrander Novice
05. juli 2004 - 03:19 #1
#include <iostream>

void func(char *&x)
{
  std::cout << "Func Before: " << x << std::endl;
  x = " World";
  std::cout << "Func After: " << x << std::endl;
}

int main()
{
  char *p = "Hello";
  std::cout << "Main Before: " << p << std::endl;
  func(p);
  std::cout << "Main After: " << p << std::endl;
}
Avatar billede n30thaone Nybegynder
05. juli 2004 - 03:23 #2
hmm, vil gerne lige finde ud af hvordan det funder, så spørger lige =) :

du lavet et array med en pointer som peger på dens adresse, og så sender du adressen til functionen, i functionen viser du det er en pointer... Men, du bruger også '&', er det fordi du modtager værdien, og så bruger '&' til at finde adressen?

Og - hvordan får jeg funktionen til at sende et nyt object tilbage... Meningen er jeg vil lave en funktion der simulerer 'Mid()' fra visual basic, så jeg skal sende en char værdi tilbage... - skal nok give dig flere point hvis du ønsker det(kræver lige du fortæller mig hvordan =)).

Tak for svaret!
Avatar billede arne_v Ekspert
05. juli 2004 - 07:37 #3
#include <iostream>
#include <string>

using namespace std;

static char retbuf[1000];

char *mid(char *s,int ix,int n)
{
  strncpy(retbuf,s+ix,n);
  retbuf[n] = '\0';
  return retbuf;
}


int main()
{
  char s1[] = "abcd";
  cout << mid(s1,1,2) << endl;
  string s2 = "efgh";
  cout << s2.substr(1,2) << endl;
  return 0;
}

outputter:

bc
fg
Avatar billede arne_v Ekspert
05. juli 2004 - 07:39 #4
Der sker noget meget grimt med den mid funktion hvis n >= 1000.

Derfor bør du nok kraftigt overveje løsning med string som har
en indbygget substr der svarer til mid.
Avatar billede bertelbrander Novice
05. juli 2004 - 13:16 #5
I eksemplet fra før betyder "char *&x" at x er en reference til en pointer til char.

& kan betyde både reference of "address of":

int i;
int &r = i;
int *p = &i;

Her er r en reference til i op p en pointer til i.
Derudover bruges & til bitvis and og && til logisk and.

Man kunne lave en mid funktion med:
#include <iostream>

void mid(char *dest, const char *org, int first, int last)
{
  memcpy(dest, org + first, last - first);
  dest[last - first] = 0;
}

int main()
{
  char buf[10];
  mid(buf, "Eksperten", 3, 6);
  std::cout << buf << std::endl;
}

Her er det kalderen der giver en buffer med til mid() hvor strengen skal placeres. Det giver IMHO den pæneste interface; det er kalderen der allokerer og frigiver.
Avatar billede n30thaone Nybegynder
05. juli 2004 - 16:54 #6
Tak for hjælpen! Idé'en var dog jeg ville skrive min egen funktion, så det er hvad jeg har tænkt mig at gøre =).

Hvordan deler jeg point ud?(De går til bertel da han kom med svaret jeg lige havde brug for)
Avatar billede bertelbrander Novice
05. juli 2004 - 17:00 #7
Jeg vil helst ikke have point. Undskyld hvis jeg kom til at lave for meget.
Avatar billede n30thaone Nybegynder
05. juli 2004 - 17:08 #8
Der er ingen grund til at undskylde da!

Men så må jeg vel give pointene til arne?
Avatar billede arne_v Ekspert
05. juli 2004 - 19:22 #9
Hvis du synes ...

Du kunne også selv tage dem når Bertel nu ikke vil

Eller du kan selv tage halvdelen og ive mig resten

Eller ...
Avatar billede n30thaone Nybegynder
06. juli 2004 - 00:58 #10
Okay
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