При добавлении элемента в массив старые значения превращаются в 0, но новые показы - PullRequest
0 голосов
/ 05 марта 2019

Я написал эту программу, в которой я могу добавлять фотографии сотрудникам, используя их имена.но сейчас он добавляет новое значение, но уже существующие значения становятся равными 0.

это результат:

type in the name you would like to add pic to 
Anna
type in pic
55
1.Show existing  
2.add pic to a staff
1
Adam    1,2,3,
Anna    0,0,0,55,

остальной код:

typedef struct Staff
{

 char  name[30];
 int   *pic;
 int   imagecount;
 } Staff;


void printStaff(Staff *pStaff)
{
printf("%s    ", pStaff->name);



  if ( pStaff->pic) {
  for(int i=0; i<pStaff->imagecount; i++){

 printf("%d,",pStaff->pic[i]); 
  }
  }

 printf("\n");
 }



void PrintList(Staff aLista[], int staffCount)
 {

for (int i = 0; i < staffCount; i++) {

   printStaff(&aLista[i]);
 }
}

ОБНОВЛЕННЫЙ КОД:

Staff addpic(Staff array[], int staffCount)
{
Staff newStaff = {};    

printf("type in the name you would like to add pic to \n");
fgets(newStaff.name, 30, stdin);


for(int i = 0; i< staffCount; i++) {

    if(strcmp(array[i].name,newStaff.name)==0) {
        if(array[i].imagecount<5) {
            printf("type in pic\n");
            int newpic;
            scanf("%d",&newpic);

            array[i].imagecount++;
            int *newpics = realloc(newStaff.pic, (array[i].imagecount) * sizeof(int));
            newpics[array[i].imagecount-1] = newpic; 
            array[i].pic = newpics;

        }
    } 
}
return newStaff;

Остальной код:

 int main(void)
 {
  int staffCount=0;



 int input;


 int test[3]  = {1,2,3};

 Staff myStaff[5] = { {"Adam", test, 3},{"Anna",test,3} };

 staffCount=2;

 do
 {
printf("1.Show existing  \n");

printf("2.add pic to a staff");
printf("\n");
scanf("%d", &input);

switch(input)
{

  case 1:
PrintList(myStaff,staffCount);

break;
  case 2: 
 addpic(myStaff,staffCount);
   break; 

        default: 
            printf("inccorect inpput\n");
            break; 
   }
   }while (input<'1' ||input<'2');


 return 0;
  }

любая помощь приветствуется, но я новичок в кодировании, так что имейте это в виду.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

newStaff.pic инициализируется до NULL и не обновляется, поэтому realloc(newStaff.pic, (array[i].imagecount) * sizeof(int)); эквивалентно malloc((array[i].imagecount) * sizeof(int));.Элементы, выделенные через malloc() и не инициализированные, имеют неопределенное значение, и в этом случае они оказались равными нулю.Вы можете перенять содержимое, скопировав его вручную.

int *newpics = realloc(newStaff.pic, (array[i].imagecount) * sizeof(int));
/* add this line to copy contents */
for (int j = 0; j < array[i].imagecount-1; j++) newpics[j] = array[i].img[j];
newpics[array[i].imagecount-1] = newpic;

К сожалению, этот метод не годится, поскольку это может привести к утечке памяти, если подобное добавление к одному и тому же элементу array выполняется несколько раз.Лучше всего выделить буфер для динамического присвоения img и передать его в realloc().Затем realloc() сделает за вас копирование.

Часть инициализации:

int test[3]  = {1,2,3};

Staff myStaff[5] = { {"Adam", test, 3},{"Anna",test,3} };

staffCount=2;

/* add this to change statically allocated arrays to dynamically allocated ones */
for (int i = 0; i < staffCOunt; i++) {
    int* newpics = malloc(myStaff[i].imagecount * sizeof(int));
    for (int j = 0; j < myStaff[i].imagecount; j++) newpics[j] = myStaff[i].img[j];
    myStaff[i].img = newpics;
}

Часть обновления:

/* use array[i].pic instead of newStaff.pic */
int *newpics = realloc(array[i].pic, (array[i].imagecount) * sizeof(int));
/* then, no manual copying is required */

(проверки ошибок не включены)

0 голосов
/ 05 марта 2019

В функции addpic вы делаете

int *newpics = realloc(array[i].pic, ...);

Одна проблема состоит в том, что если вы делаете это для одного из двух элементов, которые вы инициализировали в array, то array[i].pic указывает на первый элемент массива (массива test в функции main).

Массивы не могут быть перераспределены. Если вы хотите перераспределить память, вам также необходимо динамически распределить исходную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...