Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
1

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

19.06.2013, 00:46. Показов 630. Ответов 7
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2013, 00:46
Ответы с готовыми решениями:

Путаница с указателями
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define LEN 100 void new_line(char (**line), int n) {...

Путаница с указателями
Люди, помогите, пожалуйста! Имеется двумерный динамический массив, объявленный и...

Задача с функциями и указателями
У меня код выдаёт ошибку. Задача такая: есть 3 целых массива(A, B, C), нужно посчитать производное...

Работа с массивами, указателями и функциями.
Я вот рли не знаю, как отправить в свою созданную функцию массив, как потом обработанный массив в...

7
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 01:06 2
Как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdio.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 ("%d\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;
}
1
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
19.06.2013, 01:18  [ТС] 3
Сударь, вы маг и волшебник!
Спасибо за избавление :3
Кажется, я начинаю понимать, как это должно работать.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 01:24 4
И _getch() в этой строке можно убрать (лишняя пауза):
C++
1
2
3
4
...
case 60:system("cls");
       show(arr, count); break;
...
1
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
19.06.2013, 01:34  [ТС] 5
Хотя нет, не совсем понимаю.
Почему в этой
void enter(publications *&arr, int &count) //функция ввода
строке одновременно и операция взятия адреса, и переход по нему? Разве это не должно привести к тому же результату, что и просто void enter(publications arr, int &count)? И почему у count`а мы просто переходим по адресу (хотя в подпрограмму передавалось значение), а у arr`а его ещё и берём?

Гетч там к месту, просто в исправленном варианте теперь создаётся пауза между просмотром результатов и возвращением в главное меню, стиранием всего на экране и выводом просьбы нажать на кнопку) Но спасибо!)
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 01:54 6
Цитата Сообщение от Yn94k0 Посмотреть сообщение
Гетч там к месту,
Не к месту.


Цитата Сообщение от Yn94k0 Посмотреть сообщение
Почему в этой
void enter(publications *&arr, int &count) //функция ввода
строке одновременно и операция взятия адреса, и переход по нему?
Это не взятие адреса, а передача в функцию указателя на начало массива и переменной count по ссылке.

Добавлено через 3 минуты
Если как было:
C++
1
void enter(publications *arr, int count);
, то в функцию передаются копии указателя и переменной, поэтому то, что происходит в функции с ними, не меняет значение переменных, объявленных в main().
1
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
19.06.2013, 02:06  [ТС] 7
>Не к месту.
Теперь к месту :3
>Это не взятие адреса, а передача в функцию указателя на начало массива и переменной count по ссылке.
Спасибо большое, попробую когда-нибудь это осмыслить
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 03:10 8
Можно так ещё передавать в функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdio.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 ("%d\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);  break;
                case '\x1b':system("cls");
                    key = true ; break;
            }
    }   
    while(key!= true);
  
    //освобождение динамической памяти
    free (arr);
    _getch();
}
0
19.06.2013, 03:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2013, 03:10
Помогаю со студенческими работами здесь

Работа с указателями/массивами /функциями
Запутался с указателями/в лабе нужно провести через указатели /Дан одномерный массив из К...

Обработка .txt кодировка ANSI и UTF-8 (буква "я" в ANSI воспринимается как EOF)
Есть следующий кусок кода: FILE* fp = fopen(&quot;G:\OPND1.txt&quot;, &quot;r&quot;); if (fp!=NULL) // если файл...

UTF8 и Ansi в Ansi
В программу на вход поступают текстовые документы с разными кодировками (UTF8 или Ansi)....

В чем различие между функциями VBA и функциями Excel?
В чем различие между функциями VBA и функциями Excel. Скажите пожалуйста , в гугле не могу найти)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru