2016-06-14 1 views
1

Я должен упомянуть, что я нахожусь в моих первых 2-х неделях от введения в класс программирования, прежде чем люди становятся слишком сумасшедшими с ответами.Сохранение данных из массива в C

Используя этот массив в качестве примера,

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} 

Я пытаюсь разобрать через него, чтобы создать 2 новых параллельных массивов, чтобы использовать позже. Идея состоит в том, чтобы создать один массив, который содержит «баллы» и один, который содержит «вхождения» каждого балла. Я заканчиваю компиляцию без ошибок, однако во время выполнения он сбой.

void frequency(int scores[], int max){ 
    int i, x=0, temp=0, count=0, sum=0, mode=0; 
    int score[sum]; //unknown length of array, sum gets added after the while loop 
    int freq[sum]; 
    printf("score\tfrequency\n"); 
    printf("-----\t---------\n"); 
    fprintf(fp, "score\tfrequency\n"); 
    fprintf(fp, "-----\t---------\n"); 
    for (i = 0; i < max; ++i){ 
     while (scores[i]==scores[x]){ 
      x++; 
      count++; 
      sum++; 
      temp = x-1; 
      if(scores[i] != scores[x]){ 
       //printf(" %d\t  %d\n",scores[i], count); 
       freq[i] = count; 
       score[i] = scores[i]; 
       count=0; 

       i=temp; 
       x=temp+1; 
       sum++; 
       printf("%d\t%d", score[i], freq[i]); 
       fprintf(fp, "%d\t%d", score[i], freq[i]); 
      } 
     } 
    } 
} 
+0

отладчики покажет вам, где авария происходит, –

ответ

2

Эта часть:

int i, x=0, temp=0, count=0, sum=0, mode=0; 
int score[sum]; 
int freq[sum]; 

выглядит неправильно.

Вы установили sum в ноль и затем использовали его для измерения массива. Возможно, вы имели в виду сделать:

sum = max; 
+0

я использовал Int счет [сумма ] как способ дать массиву свою длину, не зная, какова длина будет после цикла while. – grobot

+1

@grobot - вы не можете этого сделать. Перед использованием необходимо зарезервировать достаточное пространство в массивах. Ваша программа выходит из строя, потому что вы этого не делаете. – 4386427

+0

Я понял, что это трудно. Какой метод позволяет сохранить эти данные без создания новых массивов? – grobot

1

я в конечном итоге компиляции без ошибок, однако во время выполнения он выходит из строя.

Причина:

Причина, почему ваша программа падает потому, что вы не выделили достаточно памяти для массивов, которые вы используете 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); 
} 

Мой подход довольно просто понять

  1. сначала создаю массив score, который создает дополнительную память всякий раз, когда он встречает уникальные элементы и сохраняет в нем
  2. , а затем я проверяю вхождения для каждого элемента массива 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 

Я надеюсь, что это то, что вы пытаетесь достичь :)

+0

Что мой друг, именно то, что я пытался узнать. Являясь довольно новым в этом отношении, чтение документов по realloc и malloc сбивало с толку пример, который я мог видеть, что действительно происходит. Спасибо! – grobot

+0

Прекрасно ... Рад помочь вам :) @grobot – Cherubim

Смежные вопросы