0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
1

Realloc

30.04.2018, 01:02. Показов 670. Ответов 5
Метки нет (Все метки)

Программа должна забивать массив command_comblock символами 'p', но она почему-то не выполняет реаллок и вылетает. Произвести операции через временные динамические массивы нельзя, т.к. объем оперативки и время выполнения ограничены
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#pragma hdrstop
#pragma argsused
 
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <windows.h> //FOR WINDOWS ONLY
 
#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif
 
 
 
// Структура двогичного (бинарного) дерева
 
struct btree {
    double data; // данные
    struct btree *left; // левая ветвь
    struct btree *right; // правая ветвь
    struct btree *parent; // родитель
};
 
bool read_arg(char**, signed long long int**); // сигн. ф. считывания команд
 
int _tmain(int argc, _TCHAR* argv[]) {
 
    /* ~~~~~~~~~~~~~~~~~~~~~~ ПЕРЕМЕННЫЕ ~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
    // Динамические массивы
    char *command_comblock; // Массив комманд
    signed long long int *value_comblock; // Массив значений
 
    /* ~~~~~~~~~~~~~~~~~~~~~ КОММАНДЫ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
    //Включаем русский в консоли
    SetConsoleOutputCP(1251); //FOR WINDOWS ONLY
 
    // Ввод и анализ на верность комманд
    if (read_arg(&command_comblock, &value_comblock) != true) {
        // Если что-то пошло не так при вводе в первый раз (попробуем еще разок)
        if (read_arg(&command_comblock, &value_comblock) != true) {
            // Что-то явно не так со вводом (тест на похмелье :D)
 
            // ScreenCleaner
            system("cls"); // FOR WINDOWS ONLY
            // system("clear"); //FOR LINUX ONLY
 
            // Выдача ошибки
            return 315;
        }
    }
 
    // Разбор введеных аргументов
    system("pause");
    return 0;
}
 
bool read_arg(char** command_comblock, signed long long int** value_comblock) {
    // ПЕРЕМЕННЫЕ
    char temp;
 
    // Первоначальное выделение места массивам
    if ((*command_comblock = (char *)malloc(sizeof(char))) == NULL) {
        printf("Realloc Error! [command_comblock]");
        return false;
    }
 
    if ((*value_comblock = (signed long long int *)malloc
        (sizeof(signed long long int))) == NULL) {
        printf("Realloc Error! [value_comblock]");
        return false;
    }
 
    // Непосредственное считывание
    printf("Вводите комманды, как в k806.ru [Для Win. Ctrl+Z -> конец ввода]\n");
    *value_comblock[0] = 0;
    *command_comblock[0] = 0;
    while (temp != EOF) {
        temp = getchar();
        switch (temp) {
 
            // Операция вывода дерева
        case 'p':
            *value_comblock[0]=*value_comblock[0]+1;
            if ((*command_comblock = (char*)realloc(*command_comblock,
                ((*value_comblock[0])*sizeof(char)))) == NULL) {
                printf("Realloc Error! [command_comblock]");
                return false;
            }
            //printf("%d", sizeof(*command_comblock)); - выдает одно и то же значение
            *command_comblock[*value_comblock[0]-1] = temp;
            break;
 
        //
        }
 
    }
 
    return true;
}
Добавлено через 49 минут
Грешу на это
C
1
2
 if ((*command_comblock = (char*)realloc(*command_comblock,
                ((*value_comblock[0])*sizeof(char)))) == NULL) {
Добавлено через 34 секунды
И это
C
1
*command_comblock[*value_comblock[0]-1] = temp;
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2018, 01:02
Ответы с готовыми решениями:

Realloc в функции
Есть функция void read_line(char *adress) { char temp = '1'; unsigned long long int...

Функция realloc
Есть такой фрагмент кода: /* поиск отрицательных элементов и их размещение в конце массива*/ ...

Только realloc
Не хочет работать программа(возвращает неправильные числа+проблема с выводом) Во вложении скрин...

Использование realloc
Доброго времени суток. Определен динамический массив, он вводится. Затем нужно увеличить размер...

5
Диссидент
Эксперт C
27177 / 16937 / 3742
Регистрация: 24.12.2010
Сообщений: 38,114
30.04.2018, 10:52 2
SlimRG, Звезды убери
C
1
2
 if ((command_comblock = (char*)realloc(command_comblock,
                ((*value_comblock[0])*sizeof(char)))) == NULL) {
Цитата Сообщение от SlimRG Посмотреть сообщение
Грешу на это
Правильно грешишь. Realloc работает с указателями, а не со значениями, на которые они указывают.
0
0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
30.04.2018, 11:24  [ТС] 3
И как исправить?
Eсли тупо убрать звезды - seg. fault

Добавлено через 6 минут
Цитата Сообщение от Байт Посмотреть сообщение
SlimRG, Звезды убери
C
1
2
 if ((command_comblock = (char*)realloc(command_comblock,
                ((*value_comblock[0])*sizeof(char)))) == NULL) {
Правильно грешишь. Realloc работает с указателями, а не со значениями, на которые они указывают.
Не помогает - стала вылетать ошибка при реаллоке read access 0x0...3
0
Диссидент
Эксперт C
27177 / 16937 / 3742
Регистрация: 24.12.2010
Сообщений: 38,114
30.04.2018, 11:25 4
Цитата Сообщение от SlimRG Посмотреть сообщение
И как исправить?
я вам показал в посте 2.
А возможно, у вас указатель command_comblock не инициализирован. (подробно ваш код не смотрел)
Попробуй
C
1
char *command_comblock = NULL;
0
0 / 0 / 0
Регистрация: 31.08.2015
Сообщений: 22
30.04.2018, 11:28  [ТС] 5
Вы вообще код смотрели?

Там char** command_comblock...
0
Диссидент
Эксперт C
27177 / 16937 / 3742
Регистрация: 24.12.2010
Сообщений: 38,114
30.04.2018, 11:38 6
Цитата Сообщение от SlimRG Посмотреть сообщение
Вы вообще код смотрели?
Там char** command_comblock...
Смотрел. Но не у видел. Подслеповат стал. А увидел в строке 34:
Цитата Сообщение от SlimRG Посмотреть сообщение
char *command_comblock; // Массив комманд
Встречный вопрос. А вы то сами код смотрели? Или сдули его не глядя?
Больше ничем помочь не могу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2018, 11:38
Помогаю со студенческими работами здесь

realloc vs (malloc + memset)
На одном форуме мне сказали, что realloc работает чуть ли не в полтора раза медленнее связки malloc...

Освобождает ли realloc память?
Вот у нас есть стандартная функция void * realloc( void * ptrmem, size_t size ) Как известно,...

Не работает функция realloc()
Есть такое задание : Write a program, in which define such functions: - a function that...

Realloc внутри функции
Проблема заключается в следующем: Когда я первый раз попадаю в функцию addItem и делаю в ней...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru