я в конечном итоге компиляции без ошибок, однако во время выполнения он выходит из строя.
Причина:
Причина, почему ваша программа падает потому, что вы не выделили достаточно памяти для массивов, которые вы используете INT в frequency()
функции
void frequency(int scores[], int max){
int i, x=0, temp=0, count=0, sum=0, mode=0;
int score[sum];
int freq[sum];
Solution :
Итак, есть ли способ обеспечить память во время выполнения в соответствии с требованиями или изменить размер памяти блоков во время компиляции?
Да, это причина того, почему Dynamic memory allocation используется .... хотя вы отправляете фиксированный массив функции frequency()
в коде, то функция я предоставил работу для любого целого массива отправленного ..
Здесь я предоставил код, в котором
Я сделал это с помощью динамического распределения памяти .. Я думаю, что это легко понять, если у вас есть общее представление о функциях распределения динамической памяти ..если у вас есть какие-то сомнения, спросите меня через комментарии :) и, кстати, я предполагал вашу основную функцию, чтобы быть:
int main()
{
int scores[30] = {90,85,100,50,50,85,60,70,55,55,80,95,70,60,95,
80,100,75,70,95,90,90,70,95,50,65,85,95,100,65};
frequency(scores,30);
return 0;
}
Код:
#include <stdio.h>
#include <stdlib.h>
void frequency(int scores[], int max);
int main()
{
int scores[30] = {90,85,100,50,50,85,60,70,55,55,80,95,70,60,95,
80,100,75,70,95,90,90,70,95,50,65,85,95,100,65};
frequency(scores,30);
return 0;
}
void frequency(int scores[], int max)
{
int i,j,count=0,flag=0,occur=0;
int *score=malloc(sizeof(int));
if(malloc==NULL)
{
printf("memory allocation failed");
exit(1);
//it's good to check if memory allocated was successful or not
//I've avoided it for further allocations,to decrease the size of post :)
}
int *freq=malloc(sizeof(int));
printf("score\tfrequency\n");
printf("-----\t---------\n");
//building array which has only scores
for(i=0;i<max;i++)
{
if(count==0) //first time
{
score=realloc(score,(count+1)*sizeof(int));
//increasing size of array by 1*sizeof(int)
score[count]=scores[i];
count++;
}//first one requires no checking whether it's repeated or not
else
{
flag=0; //resetting flag value
for(j=0;j<count;j++)
{
if(scores[i]==score[j])
{
flag=1; //
break;
}
}
if(flag==0) // if not repeated need to add new element
{
score=realloc(score,(count+1)*sizeof(int));
score[count]=scores[i];
count++;
}
}
}
//allocating memory for frequency array
freq=realloc(freq,count*sizeof(int));
//building array which has frequency of each score
for(i=0;i<count;i++)
{
occur=0;
for(j=0;j<max;j++)
{
if(score[i]==scores[j])
occur++;
}
freq[i]=occur;
}
for(i=0;i<count;i++) //printing output
printf("\n %d\t %d\n",score[i],freq[i]);
free(score); //freeing the blocks
free(freq);
}
Мой подход довольно просто понять
- сначала создаю массив
score
, который создает дополнительную память всякий раз, когда он встречает уникальные элементы и сохраняет в нем
- , а затем я проверяю вхождения для каждого элемента массива
score
в массиве scores
и сохраняю их в массиве freq
.
Выход:.
score frequency
----- ---------
90 3
85 3
100 3
50 3
60 2
70 4
55 2
80 2
95 5
75 1
65 2
Я надеюсь, что это то, что вы пытаетесь достичь :)
отладчики покажет вам, где авария происходит, –