inaktiv000 Skrevet 9. oktober 2009 Del Skrevet 9. oktober 2009 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
[kami] Skrevet 9. oktober 2009 Del Skrevet 9. oktober 2009 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
inaktiv000 Skrevet 9. oktober 2009 Forfatter Del Skrevet 9. oktober 2009 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
[kami] Skrevet 9. oktober 2009 Del Skrevet 9. oktober 2009 (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 9. oktober 2009 av [kami] Lenke til kommentar
inaktiv000 Skrevet 9. oktober 2009 Forfatter Del Skrevet 9. oktober 2009 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å! Lenke til kommentar
aC Skrevet 9. oktober 2009 Del Skrevet 9. oktober 2009 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
[kami] Skrevet 9. oktober 2009 Del Skrevet 9. oktober 2009 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
zotbar1234 Skrevet 17. oktober 2009 Del Skrevet 17. oktober 2009 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
JeffK Skrevet 18. oktober 2009 Del Skrevet 18. oktober 2009 (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 18. oktober 2009 av JeffK Lenke til kommentar
inaktiv000 Skrevet 18. oktober 2009 Forfatter Del Skrevet 18. oktober 2009 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
GeirGrusom Skrevet 18. oktober 2009 Del Skrevet 18. oktober 2009 Jeg tror ikke man kan gjøre det, men jeg er for lat til å sjekke. Lenke til kommentar
Giddion Skrevet 19. oktober 2009 Del Skrevet 19. oktober 2009 Om du har en int verdi du vet du ikke skal bruke:<snip> Er det ikke bedre å sende lengden som en egen variabel? Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå