0

I need to put the output of arr in global array because I need to use the array in main function. How can I initialize the array in global and I don't know the size of it ? any idea please?

globarr[]; // how to set the size here?

int *suma(int *output, int *arr)  
{  
    *output = 0;                       
    for (int i = 0; i < 100; i++) {  
        arr[i] = i;
        *output += arr[i]; 
    } 
    return arr;  
}

void prose(){
    int *by;  
    int output;
    int arr[100];                
    by = suma(&output, arr);
    for (ont i=0; i<output; i++) {
        globarr[i] = n[i];
    }  
}

void main()
{
    prose(); 
    // here I need to use the values of globarr
}
ndim
  • 35,870
  • 12
  • 47
  • 57
lena
  • 730
  • 2
  • 11
  • 23
  • No, I put this code just for clarification, the size of globarr[] be less than 100 or more that depends on my real process in this function suma() – lena Jun 29 '22 at 21:24
  • @EugeneSh. - Not quite - it is 0 + 1 + ....+ 99 = 100 * 100 / 2 = 5000 – Ed Heal Jun 29 '22 at 21:24
  • 2
    Are you aware of `malloc()`? If not please read up. If you are please explain why it does not help you. – Yunnosch Jun 29 '22 at 21:25
  • @kayla Then put a real code. You have some undefined stuff here, making it unclear what you are trying to do. – Eugene Sh. Jun 29 '22 at 21:26
  • @Yunnosch,Yes, but how can use malloc() for global array? – lena Jun 29 '22 at 21:26
  • 2
    You can't. But whatever you used the global array for, it should be doable with a buffer malloced after you found out the needed size. – Yunnosch Jun 29 '22 at 21:28
  • 1
    @EdHeal I see what you mean.. yeah, these undefined things confused me a bit. I wonder if it is the real intention of the OP – Eugene Sh. Jun 29 '22 at 21:29
  • You can't declare a static global array without first knowing it's size. So you either need to use a fixed max size or use dynamic allocation as already pointed out. – kaylum Jun 29 '22 at 21:41
  • @kayla The short answer is that you can probably use something like `int * globarr = NULL;` to declare your global "array", and then in `prose()`, just before you fill it in, say `globarr = malloc(output * sizeof(*globarr));`. You also have to make sure `malloc` doesn't return NULL. There's a longer answer, but that depends on details your question isn't clear on. – Steve Summit Jun 29 '22 at 21:43
  • 1
    The `int *globalarr` solution will *not* work, however, if there's other code that you don't have control over that is declaring the array as `extern int globalarr[];`. See [this related question](https://stackoverflow.com/questions/46222953). – Steve Summit Jun 29 '22 at 22:05
  • @EdHeal it shows 4950 – 0___________ Jun 29 '22 at 22:34
  • @0___________ - Is is my error - should be 99 * 100 / 2 - My mistake. Either way it is computable. Please see the comment below for the other answer – Ed Heal Jun 29 '22 at 22:43

2 Answers2

2

I need to put the output of arr in global array

The only reason you might need to do that would be that some external authority you are bound to obey placed such an arbitrary, unnatural requirement.

It is possible to write conforming C code for any task, using only the C standard library, that does not rely on any global variables other than those few provided by the standard library itself.

because I need to use the array in main function. How can I initialize the array in global and I don't know the size of it ?

You cannot. The size of an array declared at file scope must be an integer constant expression, which means, among other things, that it must be computable at compile time.

any idea please?

You have two main alternatives:

  1. Choose an upper bound on the size your program will support, and declare an array large enough for that. Make the program abort if otherwise it would try to use more elements of the array than are available.

  2. Use a dynamically allocated space instead of a (declared) array.

John Bollinger
  • 160,171
  • 8
  • 81
  • 157
  • An upper bound can be computed as it is a constant. See my comment above. BTW - My equation is a little incorrect but the upper bound is 4,950 (i.e. 100 * 99 /2) – Ed Heal Jun 29 '22 at 21:47
  • 3. Redesign your code so that it will no longer need that global array. – Zakk Jun 29 '22 at 21:53
  • Granted, @EdHeal, but it is a different question whether in practice *the OP* can (could have) computed that. And it would not be hard to modify the program such that the space needed depended on runtime input, which would be a more interesting case. – John Bollinger Jun 29 '22 at 21:55
  • Just going on the code that is given. If the code is modified, that is another question – Ed Heal Jun 29 '22 at 21:57
0

Use function parameters and return values not global variables

long long suma(int **arr, size_t size)  
{  
    long long output = 0;                       
    *arr = malloc(size * sizeof(**arr));
    if(*arr)
    {
        for (size_t i = 0; i < size; i++)  
        {  
            (*arr)[i] = i;
            output += (*arr)[i]; 
        }
    } 
    return output;  
}

#define SIZE 100

void main(void)
{
    int *array;
    long long output = suma(&array, SIZE);

    printf("Sum of elements = %lld\n", output);

    /* you can use the array */

    if(array)
    {
        for(size_t i = 0; i < SIZE; i++)
        {
            printf("[%3zu]=%d%s", i, array[i], ((i + 1) % 10) ? ",\t" : "\n");
        }
    }
    free(array);
}

https://godbolt.org/z/EPdxfPzoq

Output:

Sum of elements = 4950
[  0]=0,    [  1]=1,    [  2]=2,    [  3]=3,    [  4]=4,    [  5]=5,    [  6]=6,    [  7]=7,    [  8]=8,    [  9]=9
[ 10]=10,   [ 11]=11,   [ 12]=12,   [ 13]=13,   [ 14]=14,   [ 15]=15,   [ 16]=16,   [ 17]=17,   [ 18]=18,   [ 19]=19
[ 20]=20,   [ 21]=21,   [ 22]=22,   [ 23]=23,   [ 24]=24,   [ 25]=25,   [ 26]=26,   [ 27]=27,   [ 28]=28,   [ 29]=29
[ 30]=30,   [ 31]=31,   [ 32]=32,   [ 33]=33,   [ 34]=34,   [ 35]=35,   [ 36]=36,   [ 37]=37,   [ 38]=38,   [ 39]=39
[ 40]=40,   [ 41]=41,   [ 42]=42,   [ 43]=43,   [ 44]=44,   [ 45]=45,   [ 46]=46,   [ 47]=47,   [ 48]=48,   [ 49]=49
[ 50]=50,   [ 51]=51,   [ 52]=52,   [ 53]=53,   [ 54]=54,   [ 55]=55,   [ 56]=56,   [ 57]=57,   [ 58]=58,   [ 59]=59
[ 60]=60,   [ 61]=61,   [ 62]=62,   [ 63]=63,   [ 64]=64,   [ 65]=65,   [ 66]=66,   [ 67]=67,   [ 68]=68,   [ 69]=69
[ 70]=70,   [ 71]=71,   [ 72]=72,   [ 73]=73,   [ 74]=74,   [ 75]=75,   [ 76]=76,   [ 77]=77,   [ 78]=78,   [ 79]=79
[ 80]=80,   [ 81]=81,   [ 82]=82,   [ 83]=83,   [ 84]=84,   [ 85]=85,   [ 86]=86,   [ 87]=87,   [ 88]=88,   [ 89]=89
[ 90]=90,   [ 91]=91,   [ 92]=92,   [ 93]=93,   [ 94]=94,   [ 95]=95,   [ 96]=96,   [ 97]=97,   [ 98]=98,   [ 99]=99
0___________
  • 60,014
  • 4
  • 34
  • 74
  • Could simplify `output += (*arr)[i]` to `output += i;` or use the formula eluded to above – Ed Heal Jun 29 '22 at 22:15
  • @EdHeal it is not scope o the question. It is completely not relevant. Imagine `(*arr)[i] = rand();` – 0___________ Jun 29 '22 at 22:16
  • But it is not - so that is irrelevant. – Ed Heal Jun 29 '22 at 22:45
  • thank you for your answer, If I need to put the function inside the while loop to repeat the operation for 3 times would it be better for me to free(array) in side loop? – lena Jul 12 '22 at 08:29