Путаница с функциями и указателями. Платина. Ansi c

программирование C++ помощь указатели ansi c

Прошу прощения за очередную лишнюю тему, где школьник запутался в указателях и не может передать структуру в функцию, но нужна помощь, ибо перелопачивать нельзя, надо исправить.
Мне нужно было заполнить и вывести динамический массив структур в функциях. Очевидно, я от души налажал с передачей данных в функцию. Методом тыка исправить не вышло. Если отправите читать мануалы про указатели и прочая, я пойму, но проблемы не решит: по ходу, я неполноценный.
Помогите найти ошибку, пожалуйста.
Инбифо "в ДНК у тебя ошибка".
И да, если кроме помощи в нахождении ошибки мне укажут, почему именно это - отвратительный говнокод, никому не нужная моя благодарность будет и вовсе бесконечной.

#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include "conio.h"

//создание структуры
struct publications
{
int id;
char name[20];
char address[20];
int numofpub;
};

void enter(publications *arr, int count)
{
arr = (publications *)realloc(arr,(count+1)*sizeof(publications));//увеличение выделенной памяти на 1 элемент
printf("enter id, name, address and number of publications\n ");
scanf_s("%d",arr[count].id);//ввод
_flushall();//очистка буфера ввода
gets(arr[count].name);//ввод
_flushall();//очистка буфера ввода
gets(arr[count].address);//ввод
_flushall();//очистка буфера ввода
scanf_s("%d",arr[count].numofpub);//ввод
count++;//увеличение счетчика на 1
}

void show (publications *arr, int count)
{
printf("ID\tname taddress\tnumber of publications\n");
for(int i = 0;i < count;i++)//вывод на экран данных структуры
{
printf ("%d\t", arr[i].id);
printf ("%s\t\t", arr[i].name);
printf ("%s\t\t", arr[i].address);
printf ("%f\n", arr[i].numofpub);//вывод площади
}
}
void main()
{
int count = 0;
bool key = false;
publications *arr = NULL;//созали обнуленый указатель
arr = (publications *) malloc(sizeof(publications));//выделение памяти под 1 элемент структуры dachnik
printf("What you gonna do? Press F1 to enter new data. Press F2 to print. Press esc to esc\n ");
do
{
switch(_getch())
{
case 59:system("cls");
enter(arr, count);break;
case 60:system("cls");
show(arr,count);_getch();break;
case '\x1b':system("cls");
key = true ;break;
}
}
while(key!= true);


//освобождение динамической памяти
free (arr);
getch;
}

Ответы:
При передаче переменных в функцию происходит копирование значений этих переменных, Соответственно count++ изменит значения параметра, но не тронет значение вызвавшей функции. Указателя на arr это тоже касается. Такой обёртки думаю будет достаточно:
void enter(publications **parr, int *pcount)
{
   ublications *arr = *parr;
   int count = *pcount;
   /* paste code */
   *pcount = count;
   *parr = arr;
}
Ох, поле ++ не заметил, что 2 параметр не по ссылке передается :(.
Дополню к 1 коменту только то, что у вас одномерный массив, а то у none7 по что-то в 2d превратился :)
>wtfka
>не заметил
Очевидно, вы много чего ещё не заметили. :)


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.