Gå til innhold

Sende array til funksjon "på direkten"


Anbefalte innlegg

Hei, jeg skriver et program som må logge endel, og til dette bruker jeg en funksjon som tar i mot forskjellig antall heltall:

 

void TEST_logEvent(char eventType, char* message, int[] data, int length)

 

Mange plasser i programmet ønsker jeg å sende et par variable til denne funksjonen, og lurer derfor på om det finnes noen "snarveier" for å gjøre dette?

 

Jeg tenker å kunne gjøre noe slikt:

 

TEST_logEvent(QUAD, "Reading", {quadLeft, quadRight}, 2);

 

der quadLeft og quadRight er variable.

 

Ser for meg at jeg kanskje må lage arrays og kopiere data, men finnes det evt. enklere/mer elegante måter å gjøre dette på?

Lenke til kommentar
Videoannonse
Annonse

sende med referanse (eller pekere)

 

Ingen overhead for kallene.

typedef std::vector<int> IntVec_t;

void Foo(const IntVec_t& data)
{
 // write to file. whatever.
}

int main()
{
 IntVec_t dummyData;
 for (int i = 0; i < 10; i++)
dummyData.push_back(i);
 Foo(dummyData);
 return 1;
}

Lenke til kommentar

Nå har jeg veldig lite kjennskap til C++, men poenget er at jeg håpte å slippe å lage arrayet på forhånd - dette for å gjøre dumping av data (som skjer mye rundt om kring i koden) enkelt og ryddig. Overhead er ikke farlig i dette tilfellet, det skal kjøres på en PC.

Lenke til kommentar

hva er verdien på quadLeft/quadRight? etc?

om du ikke har så mange verdier kan du jo bruke bits og or'e sammen verdiene.

Ie.

enum LogFlags
{
 quadLeft  = 0,
 quadRight = 1<<0,
 quadSomethingElse  = 1<<1,
 // gir deg 32 verdier totalt. (32 bits per int)
};

void TEST_logEvent(char eventType, char* message, int logflags, int length)
{
 // write to file. whatever.
 if ((logflags&quadLeft) == quadLeft) {
 // quadLeft flag set.
 }
}

int main()
{
 TEST_logEvent(QUAD, "Reading", quadLeft|quadRight, 2);
 return 1;
}

 

 

Edit: bare gjorde eks litt mer forståelig.,

Endret av [kami]
Lenke til kommentar

tror kanskje jeg ville skrevet om definisjonen på funksjonen til noe sånt.

 

void TEST_logEvent(char eventType, char* message, int[] data, int length, ...)
// og så brukt va_list til å hente arbitrære parametre

Lenke til kommentar

Et eksempel som bør få deg i gang.

 

#include <stdarg.h>

#include <stdio.h>

#include <iostream>

using namespace std;

 

void Foo(int num, ...)

{

va_list va;

int p;

va_start( va, num );

 

for(p = va_arg(va, int ); num-- > 0; p = va_arg(va, int ))

cout << p << "\n";

va_end(va);

}

 

int main ()

{

Foo(3, 1,2,3);

 

return 1;

}

Lenke til kommentar
  • 2 uker senere...
Hei, jeg skriver et program som må logge endel, og til dette bruker jeg en funksjon som tar i mot forskjellig antall heltall:

 

C++ er ikke det språket som har en saklig støtte for det du ønsker.

 

Alternativ en er å se å variadic arguments. Alternativ to er å la funksjonen ta imot en array/std::vector med verdier du ønsker å sende. Du får ikke et like naturlig grensesnitt som printf() (jeg antar det er ca. det du vil), men noen kompromisser må man inngå i C++.

 

void TEST_logEvent(char eventType, char* message, int[] data, int length)

 

Mange plasser i programmet ønsker jeg å sende et par variable til denne funksjonen, og lurer derfor på om det finnes noen "snarveier" for å gjøre dette?

 

Jeg tenker å kunne gjøre noe slikt:

 

TEST_logEvent(QUAD, "Reading", {quadLeft, quadRight}, 2);

 

Anonyme arrayer på denne formen eksisterer ikke i C++.

Lenke til kommentar

Om du har en int verdi du vet du ikke skal bruke:

#include <stdio.h>

#define END_LIST -1

void foo(int a[])
{
 int i;
 for (i = 0; a[i] != END_LIST; i++)
printf("a[%i] = %i\n", i, a[i]);
}

int main()
{
 foo((int[]){4,2,END_LIST});
}

Endret av JeffK
Lenke til kommentar

OK, så man kan altså lage arrays uten å deklarere de først?

 

Uansett, jeg løste det med variabel lengde - fungerte veldig fint! Skriver forresten i C, ikke C++. Noen som har en guide e.l. for de som har skrevet endel embedded C, jobbet litt med Java (OO), og har lyst å lære C++? :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...