VijayIndia
VijayIndia

Reputation: 91

Dynamic Program in C

Hi Guys i have edited the questions.Here is my entire code.I have given basic amount of readability to my program.I hope u guys can understand the program.

#include<stdio.h>
#include<stdlib.h>
int Max_Min(int,int,int,int *, int *);
int *Max,Number;
int main()
{
    int n1, n2,Maximum_Element=0,*Max;
    int i = 0, j = 0;
    scanf("%d",&Number);
    Max =(int *) malloc(sizeof(int)*Number);//Array Max is created

        for (int k = 0;k <(Number/2);k++)
            {
            scanf("%d", &n1);
            scanf("%d", &n2);
            Max[k] = Max_Min(0,1,0,&n1,&n2);//Passing integer elements n1,n2 with flag 0
            }

    Maximum_Element=Max_Min(1,1,((sizeof(Max)*Number)/8),Max,Min);//Passing array elements Max,Min with flag 1 to function Max_Min

        printf("Maximum_Element=%d", Maximum_Element);
    return 0;
}

int Max_Min(int flag,int Max_Min_flag,int length,int *n1,int *n2)//n1 and n2 should be able to handle array and integers
{
    int i=0,j = 0,k1,k2,Min1 = 0, Min2 = 0,count=0, Not_Zero = 0,x=0,y=0, *New_Max = 0,*New_Min;

/*Recursive Loop for splitting the array elements and calling the array */
       if (flag == 1)
          {
           New_Max = (int *)(malloc(sizeof(int)*length));

        for (;i <= ((length) / 2);i = i + 2)//
          {
            k1 = n1[i];
            j = i + 1;
            if (j <= ((length + 1) / 2))
            {
                k2 = n1[j];
                New_Max[count] = Max_Min(0, 1, 0, &k1, &k2);//It is passing integer elements with flag 0 to function Max_Min 
                count++;
            }
        }
        New_Max[count] = n1[j + 1];


        for (int i = 0;i < count + 1;i++)
        {
  **/* Problem is assigning Max[i]=New_Max[i] is not getting assigned*/**
                Max[i] = New_Max[i];//Copying from New_Max to Max because New_Max will be overwritten,so possible chaunce of dataloss
                Not_Zero++;
            }

        while ((sizeof(Max) / 4 - (Not_Zero))>0)
        {
            Max[Not_Zero] = 0;
            Not_Zero++;
        }
        /*Logic for calling recursive functions based on the count*/
            if (count > 1)
               {
                count--;
                Max_Min(1, 1, count, Max, Min);//Calling Recursive function by Passing Entire Arrays with flag 1.
                }
            else if (count == 1 && Max[1] == 0)
              {
            *n1 = Max[0];
            *n2 = Min[0];
              }
           else if (count == 1 && Max[2] == 0)
             {
            Max_Min(1, 1, count + 1, Max, Min);
            count--;
            }

    }
/*Logic for Finding Maximum & Minimum element is present down*/
        if (flag == 0)
        {
            printf("flag");
            if (Max_Min_flag == 1)
            {
                if (*n1 > *n2)
                {

                }
                else if ((*n1 < *n2) && Max_Min_flag == 1)
                {
                    int temp = 0;
                    temp = *n1;//5
                    *n1 = *n2;//7
                    *n2 = temp;//5
                }
            }
            else if (Max_Min_flag == 2)
            {

                if (*n1 > *n2)//7>2
                {
                    int temp = 0;
                    temp = *n1;//2
                    *n1 = *n2;//2
                    *n2 = temp;//2,7

                }
                else if (*n1 < *n2)
                {

                }
            }
        }
    return *n1;//7
}

Problem is assigning Max[i]=New_Max[i] in function Max_Min().It shows Run time error as "Access violation writing location 0x00000000."

Upvotes: 1

Views: 68

Answers (2)

Robert Voica
Robert Voica

Reputation: 71

First you need to #include <stdlib.h> to use malloc

You must declare your function before using it.

func must return int*.

Also in func "n", first "Max", and second "Max" needs to be the same variable. Rename "n" to "Max"

This is the code corrected with an extra printf;

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

int *Max,Number=5;

int* func(int *Max)
{
   for(int j=0;j<5;j++)
      Max[j]=j;//Its not working in this line 
   return Max;
}

int main()
{
   Max=(int *) malloc(sizeof(int)*Number);

   for(int i=0;i<5;i++)
      Max[i]=i;

   int* x = func(Max);

   for(int i=0;i<5;i++)
      printf("%d", x[i]);
}

Upvotes: 2

Paul Ogilvie
Paul Ogilvie

Reputation: 25276

The following contains only minor adaptations of your code and it runs fine:

int *func(int *n);
int *Max,Number=5;
int main()
{
    int *x,i;
    Max=(int *) malloc(sizeof(int)*Number);
    for(i=0;i<Number;i++)
        Max[i]=i;
    x=func(Max);
    free(Max);
    return(0);
}

int *func(int *n)
{
    int j;
    for (j=0;j<Number;j++)
        n[j]=Number-j;   // reverse the number, just to check
    return Max;
}

Upvotes: 1

Related Questions