Gå til innhold

Sende array til funksjon "på direkten"


Anbefalte innlegg

Skrevet

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å?

Videoannonse
Annonse
Skrevet

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;
}

Skrevet

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.

Skrevet (endret)

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]
Skrevet

Det er 16-bits (tror jeg) verdier fra kvadraturtellere. Problemet er at mye forskjellig data skal logges, og derfor skal funksjonen kunne ta inn et ukjent antall inter.

 

Det finnes jo funksjoner med variabelt antall parametre, kanskje det er noe jeg burde se på!

Skrevet

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

Skrevet

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;

}

  • 2 uker senere...
Skrevet
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++.

Skrevet (endret)

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
Skrevet

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++? :)

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...