jac300
jac300

Reputation: 5222

Dynamically Set Array Size C++

I don't know any C++ at all but I am trying to make a very small update to a C++ library that my application is using. Before I start hacking away at this, I am hoping someone can tell me the proper syntax for the following:

I have the following lines of code:

#define A_NUMBER 100
#define ANOTHER_NUMBER 150

enum {
   type1,
   type2,
 };

static int someMethod(int type)

{
     char command[A_NUMBER];
     //...more code
}

What I need to be able to do is based on the type argument (type1 or type2) I need to be able to set the size of the array to be either A_NUMBER or ANOTHER_NUMBER.

In pseudo code it would be something like:

if (type == type1) {
    char command [A_NUMBER]
}
else if (type == type2) {
    char command [ANOTHER_NUMBER]
} 

Is there a way to dynamically define the size?

Upvotes: 1

Views: 285

Answers (5)

antimatter
antimatter

Reputation: 3480

Here's an example that works in C and C++:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(int argc, char *argv[])
{
    char *opt;
    if(argc == 2) {
        opt = *++argv;
    }
    else {
        printf("Usage: %s [small|large]\n", *argv);
        return EXIT_FAILURE;
    }

    int *arr;
    int arrlen = 0;
    if (strcmp(opt, "small") == 0) {
        arrlen = 3;
        arr = (int *) malloc(arrlen*sizeof(int));
        int i;
        for(i = 0; i < arrlen; i++)
            arr[i] = i+1; 
    }
    else if (strcmp(opt, "large") == 0) {
        arrlen = 5;
        arr = (int *) malloc(arrlen*sizeof(int));
        int i;
        for(i = 0; i < arrlen; i++)
            arr[i] = i+1; 
    }
    if (arrlen > 0) {
        int i;
        for(i = 0; arr[i]; i++)
            printf("%i, ", arr[i]);
        printf("\n");
        free(arr);
    }
    return EXIT_SUCCESS;
}

Example:

[gyeh@gyeh stackoverflow]$ ./dynarr
Usage: ./dynarr [small|large]
[gyeh@gyeh stackoverflow]$ ./dynarr small
1, 2, 3, 
[gyeh@gyeh stackoverflow]$ ./dynarr large
1, 2, 3, 4, 5, 

Upvotes: 0

Claudiordgz
Claudiordgz

Reputation: 3049

The raw C++ way is new and delete

char * command = new char[A_NUMBER];
// and later delete it like this
delete[] command;

Of course you'll have to manage the memory, and it is not recommended to use this approach because of many reasons you should be able to find online. So in conclusion... don't use this method if vector is an option

If using a big array the best way would be to use C++ vector, you could even consider other data structures like list based on your needs (for example a lot of insert, deletions operations on your array).

Upvotes: -1

Shoe
Shoe

Reputation: 76300

Yes, you can use an std::vector<char>:

if (type == type1) {
    std::vector<char> x(A_NUMBER);
} else if (type == type2) {
    std::vector<char> x(ANOTHER_NUMBER);
} 

Remember to include the header with:

#include <vector>

While your example code matches the "pseudo code" in the question, I think part of the question is how to decide the size via type and then use the resulting storage unconditionally, i.e. outside the conditional blocks.

Then it gets as simple as:

std::vector<char> x;
if (type == type1) {
    x.resize(A_NUMBER);
} else if (type == type2) {
    x.resize(ANOTHER_NUMBER);
} 

Upvotes: 5

Bryan Chen
Bryan Chen

Reputation: 46608

I believe this is what you want

std::vector<char> x; // x is empty, with size 0

if (type == type1) {
    x.resize(A_NUMBER); // change size to A_NUMBER
} else if (type == type2) {
    x.resize(ANOTHER_NUMBER); // change size to ANOTHER_NUMBER
} 

Upvotes: 1

Yes and no. In standard C++, you cannot keep the array on the stack and have its size determined in runtime.

However, you can turn the array into a dynamically-allocated one (i.e. on the heap). In C++, the standard way to do this is to use std::vector:

std::vector<char> command(A_NUMBER); // or ANOTHER_NUMBER

Indexing will work just as before: command[5]

However, if you need to pass the array to something which expects a C-style array (i.e. a char *), you'll have to use one of these:

command.data();  // if your compiler supports C++11

&command[0];  // if it does not

And of course, to use std::vector, you'll have to #include <vector>.

Upvotes: 0

Related Questions