Re: Macro question
Peithon wrote:
[..]
I'm creating an array of unit test structures to input into a search
function.
It searches for 'key' amongst the strings contained in 'arr'. Now the
number of strings contained in arr needs to vary from test to test.
So I might have 5 strings in my first ut struct but 26 in the next.
So I thought I'd create 20 tests with a huge upper limit, say 100, as
in
Code:
typedef struct
{
char * key;
char * arr[100];
}unit_test[20];
Anonymous structs are really to be avoided in C++. Give it a name,
you'll find that it's better that way...
struct UnitTest {
char const* key;
char const* arr[100];
};
UnitTest unit_test[20];
But any initialisation arrays of less than a 100 strings will leave
uninitialised ptrs, e.g.
Code:
typedef struct
{
char * key;
char * arr[100];
}unit_test[20] = {
{ "three", { "five", "four", "one", "three", "two" } }, //test1
leaves 95 bad ptrs
Actually, not "bad ptrs". _Null_ ptrs.
.....,
....,
{ "two", { "five", "four", "one"} } //test20 leaves 97 bad ptrs
Again, not "bad ptrs".
};
So I thought I'd declare
Code:
typedef struct
{
char * key;
char * arr[100];
}unit_test[20];
globally to get all the ptrs nulled for free and then initialise
within a for loop.
You should get them "for free" if you have fewer initialisers than
elements of the array.
Using the structures
Code:
unit_test UT1 = { "three", { "five", "four", "one", "three",
"two" } };
...
unit_test UT20 = { "two", { "five", "four", "one" } };
Then, the question became how do you reference names UT1, UT2,...,UT20
within a for loop. Answer, macro! Or apparently not because it's
compile-time and I need things init'd at run-time.
How would you achieve the desired result?
Don't do anything special. If your compiler doesn't create null
pointers for the omitted elements of the array, complain to the
compiler vendor/manufacturer.
struct UnitTest {
char const* key;
char const* arr[100];
};
#include <cassert>
int main() {
UnitTest unit_test[20] = { { "one", { "one", "two", "three" } },
{ "zwei", { "eins", "zwei", "drei", "vier" } },
{ "pet", { "jedna", "dve", "tri", "ctyri", "pet" } } };
assert(unit_test[0].arr[3] == 0);
assert(unit_test[0].arr[99] == 0);
assert(unit_test[3].key == 0);
}
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask