Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Inputting an array in to a function or returning an array? (C++)

  1. Jan 18, 2009 #1

    Zurtex

    User Avatar
    Science Advisor
    Homework Helper

    I recently came up with a bit of a mathematical problem for myself and decided I needed a bit of code to help me. My understanding of C++ is pretty basic and I seem to have found myself stuck mixing arrays and functions.

    I wrote the function:

    Code (Text):

    int worko (int c[], int tri)
    {
        //turns the array in to the number it represents
        int ans = 0;
        int i;
        for (i=0; i < tri; i++)
        {
            ans = ans + 2^c[i]*(i+1);
        }
        return ans;    
    }
     
    But in my main() the line:

    Code (Text):

    int test = worko(poss[],tri);
     
    Where poss[] is an array of length tri and tri is some integer, returns the compiler error:

    Any ideas?

    Also I want to write a function which goes something like:

    Code (Text):

    int addone[] (int d[], int tri, int log)
    {
        d[0] = d[0]+1;
            int j;
            for (j=0; j < tri; j++)
            {
                if (d[i] > log)
                {
                    d[j]=0;
                    d[j+1]++;
                }
            }
    return d[];
    }
     
    But C++ seems to have no concept of returning arrays:frown:, any idea what I need to be looking at to get around this? Thanks for any help at all.
     
  2. jcsd
  3. Jan 18, 2009 #2

    Hurkyl

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    You almost surely want to be using std::vector instead of ordinary arrays.


    But if you insist on using ordinary arrays, then they cannot be passed as a return value -- you have to pass them as arguments to your function 'by reference', so the function can modify them in place.

    Also, you seem to misunderstand the syntax of ordinary arrays. [] is a decoration used to describe the type when declaring a variable: it is not part of the name of the variable.


    By the way, I'm not sure exactly what the first function is supposed to be doing... but allow me to remind you that ^ is not exponentiation: it is bitwise exclusive-or.
     
  4. Jan 18, 2009 #3

    Zurtex

    User Avatar
    Science Advisor
    Homework Helper

    Thanks! I've not programed in C++ in about 2 years. I did forget about ^ (goes and looks up what the exponential is).

    I have absolutely no insistence in using standard arrays, I'll go and look up whatever "std::vector" is :smile:.



    P.S The idea of the first function is that it takes the array [x1,...,xn] and calculates the value 1*2x1 + 2*2x2 + ... + n*2xn.

    I'm trying to work out the set of integers which can't be represented in that form, where {xi}i = 1,...,n is a monotonically decreasing sequence of non-negative integers. For example, 5 and 11 can't be represented in that form, I have a good idea which numbers in general can't be represented in that form but I wanted to quickly write something in to the computer to confirm my idea for a few more integers.
     
  5. Jan 18, 2009 #4
    Look up C-style arrays and pointers. I recommend the chapter in

    [​IMG]
    You will trip up often working with C-style arrays (what you are using) until you actually understand what they really represent. They are not atomic vectors, things you can pass around as a unit or assign values to. They are regions of memory space, in which their contents are stored. They are intimately connected with the memory pointer, which has how you reference memory in C and C++. What you pass around when you manipulate arrays is not a vector or a set, but a memory pointer.

    This is not easy or intuitive, because C and C++ are "low level" languages - they are designed for system programming that closely reflects the HARDWARE, not like "high level" languages, which use natural concepts suitable for HUMANS. You will probably find things much easier in a high level language like Python, where lists (superficially like arrays) are first-class objects, which you can directly return from functions and so on. Also, the syntax is much more straightforward, and you can program interactively in an interpreter.

    [​IMG]
    (recommended!)

    If you stick with C++, an alternative is what Hurkyl mentioned, the standard template library containers (STL = standard template library), which attempts to bring abstractions like vectors (std::vector) and lists to C++. But you certainly find things easier in Python.

    In C++, you will need to include something like <cmath> which has as exp() function. Python for contrast has a built-in exponentiation operator (it is **).
     
    Last edited: Jan 18, 2009
  6. Jan 18, 2009 #5
    As a preview: in C++, to write a function which takes an array, and returns the array scaled by a constant factor, the type signature would look like:

    Code (Text):
    float* scale(float scalefactor, float arr[], int length);
    Where float* is a pointer type. And the implementation would look like:

    Code (Text):
    float* scale(float scalefactor, float arr[], int length) {
       float* ans = new float[length];
       for (int i = 0; i < length; i++) {
          ans[i] = scalefactor * arr[i];
       }

       return ans;
    }
    where 'new' is how you can dynamically create an array of variable size - it is manual memory allocation. And you could use it like:

    Code (Text):

    float arr[] = {1,2,3};
    float* ans = scale(10, arr, 3);
    std::cout << ans[0] << " " << ans[1] << " " << ans[2] << "\n";
    // prints "10 20 30"
     
    Note that the function calling convention for an array or pointer argument does not include either the '[]' or '*' - those are for type declarations (and other stuff). This:

    Code (Text):
    float* ans = scale(10, arr, 3);
    Not this:

    Code (Text):
    float* ans = scale(10, arr[], 3);
    C++ is byzantine, and this isn't even the start of it.
     
  7. Jan 25, 2009 #6
    I usually pass arrays around with pointers...just make sure they are in sequential memory addresses when allocating the memory like so:

    const int nTri = 6;
    int rgC[nTri] = { 0 };
    int nRes = worko(rgC, nTri);
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Inputting an array in to a function or returning an array? (C++)
Loading...