Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/37: Рейтинг темы: голосов - 37, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 9

Выделение памяти под структуру

23.09.2012, 15:18. Показов 7736. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Задача - написать модуль для работы со строками. Структуру менять нельзя, можно редактировать только функции. Я закосячил при выделении памяти, только вот как - не пойму...

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
#include <malloc.h>
#include <string.h>
#include <stdio.h>
//const ...; // Определение исключительных ситуаций
typedef struct
                  {
                    char *s; // Указатель на строку
                    unsigned max; /* Максимальное количество символов в строке, определяющееся при инициализации*/
                    unsigned N; // Динамическая (текущая) длина строки
                  } str;
typedef str *string1;
 
void InitStr(string1 st, unsigned n)
{
    st=(string1)malloc(sizeof(str));
    st->s=(char*)malloc(n);
    st->max=n;
    st->N=0;
}
 
void InputStr(string1 st)
{
    unsigned i=0;
    char c;
    c=getchar();
    while (c!=10)
      {
        puts("TYT");
        st->s[i++]=c; // ошибка здесь
        puts("AGA");
        c=getchar();
      }
    st->N=i;
}
 
void OutputStr(string1 st)
{
    unsigned i;
    for (i=0;i<st->N;++i)
      putchar(st->s[i]);
    putchar('\n');
}
 
void DoneStr(string1 s)
{
    //free(s->s); Предполагается, но не работает :{
    free(s);
}
Для одной строки всё работает, но вот для двух - не желает

Вот код main:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include "format5.h"
#define N 255
 
int main()
{
    string1 s,Subs;
    InitStr(s,N);
    InitStr(Subs,N);
    puts("POH");
    InputStr(s);
    puts("HOP");
    //Copy(s,3,5,Subs);
    //Delete(s,3,5);
    //OutputStr(s);
    //Insert(Subs,s,3);
    //OutputStr(s);
    DoneStr(Subs);
    DoneStr(s);
    return 0;
}
Помогите, пожалуйста)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.09.2012, 15:18
Ответы с готовыми решениями:

Выделение памяти под структуру
Как известно компилятор применяет выравнивание данных для структуры. Мне интересно, в том случае, когда память для структуры выделяется...

Выделение памяти под структуру
#define SIZE 45 #include&lt;stdio.h&gt; struct film{ char title; int rating; };

Динамическое выделение памяти под структуру
Всем привет, возникла такая проблема, в функции add_word_in_struct у меня идет добавление нового слова в словарь, но если количество слов...

14
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.09.2012, 15:22
Тип string1 является указателем на структуру. Для неё следует выделить память.
1
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 9
23.09.2012, 16:09  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Тип string1 является указателем на структуру. Для неё следует выделить память.
в 15 строке же выделяю...
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.09.2012, 16:28
Цитата Сообщение от ChronoExp Посмотреть сообщение
void InitStr(string1 st, unsigned n)
Пардон, не заметил. Получается другая ситуация. Передавай параметр типа string1 как ссылку:
C++
1
void InitStr(string1 &st, unsigned n)
0
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 9
23.09.2012, 17:13  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Пардон, не заметил. Получается другая ситуация. Передавай параметр типа string1 как ссылку:
C++
1
void InitStr(string1 &st, unsigned n)
Нельзя менять параметры, по заданию сказано
Только внутри функций

p.s. ссылочный тип же вроде в с++, а не в с
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.09.2012, 18:56
ChronoExp, а в задании случайно не сказано что все переменные надо инициализировать в функции InitStr ?
Задание не секретное надеюсь?
0
 Аватар для doctor_lecter
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
23.09.2012, 21:58
Нужно в функции InitStr передавать указатель на string1
Когда передаешь InitStr параметр s, создается копия s и инициализируется именно копия s, а не сам s.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.09.2012, 01:09
Цитата Сообщение от doctor_lecter Посмотреть сообщение
Нужно в функции InitStr передавать указатель на string1
Так в чем проблема?!
Цитата Сообщение от doctor_lecter Посмотреть сообщение
создается копия s
Если передавать указатель, то копии не будет.
0
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 9
24.09.2012, 23:23  [ТС]
Задание такое
Реализовать СД строкового типа в соответствии с вариантом индивидуального задания (см. табл.8) в виде модуля. Определить и обработать ис-ключительные ситуации.

Вариант такой
Формат 5
Реализация на языке Pascal:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   Unit form5;
   Interface                                      
     Const {определение исключительных ситуаций}               
     Type St=array[1..65520] of char;
              String1=record
                              p_st:^st;{указатель на строку}
                              max:word;{максимальное количество символов в строке, определяется при инициализации}                    
                              N:word   {динамическая длина строки}
                         End;
 
     Procedure InitStr(var st:string1; n:word);
     Procedure WriteToStr(var st:string1;s:string);
     Procedure WriteFromStr(var s:string;st:string1);
     Procedure InputStr(var st:string1);
     Procedure OutputStr(const st:string1); 
     Function Comp(s1,s2:string1;var fl:shortint):boolean;
     Procedure Delete(var S:String1;Index,Count:word);
     Procedure Insert(Subs:String1;var S:String1;Index:word);
     Procedure Concat( const S1, S2:string1;var srez:string1);
     Procedure Copy(S:String1;Index,Count:Word; var Subs:string1);
     Function Length(S: String1): word;
     Function Pos(SubS, S: String1): word;
     Var StrError: {тип переменной ошибки}
Реализация на языке C:
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
   #if !defined(__FORM5_H)
   #define __FORM5_H                 
     const ...; // Определение исключительных ситуаций   
     typedef struct str
                  {
                      char *s; // Указатель на строку
                             unsigned max; /* Максимальное количество символов в строке, определяющееся при инициализации*/                    
                             unsigned N; // Динамическая (текущая) длина строки
                          };   
      typedef str *string1;
        void InitStr(string1 st, unsigned n);
        void WriteToStr(string1 st, char *s);
        void WriteFromStr(char *s, string1 st); 
        void InputStr(string1 st);
        void OutputStr(string1 st);
        int Comp(string1 s1, string1 s2);
        void Delete(string1 s, unsigned Index, unsigned Count);
        void Insert(string1 Subs, string1 s, unsigned Index);
        void Concat(string1 s1, string1 s2, string1 srez);
        void Copy(string1 s, unsigned Index, unsigned Count, string1 Subs);
        unsigned Length(string1 s);
        unsigned Pos(string1 SubS, string1 s);
        void DoneStr(string1 s)
        int StrError; // Переменная ошибок
     //...
    #endif
я делал на Си

Вот спецификация InitStr:

void InitStr(string1 *st, unsigned n). Выделение динамической памяти под строку st, содержащую от 0 до n символов. Значением n определяется максимальное количество символов, которое может вместить строка (зави-сит от кол-ва выделенной памяти). Динамическая длина строки есть ее те-кущая длина.

Что я не так делаю?(

p.s. с одним экземпляром все работает нормально, а вот с двумя уже не хочет(

Добавлено через 12 часов 39 минут
вверх

Добавлено через 35 секунд
вверх
0
 Аватар для doctor_lecter
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
25.09.2012, 01:38
У вас в спецификации InitStr первый параметр указатель на string1, а в коде первый параметр InitStr string1.
0
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 9
25.09.2012, 12:33  [ТС]
Цитата Сообщение от doctor_lecter Посмотреть сообщение
У вас в спецификации InitStr первый параметр указатель на string1, а в коде первый параметр InitStr string1.
Вроде и там, и там string1:
спецификация:
C
1
void InitStr(string1 st, unsigned n);
интерфейс:
C
1
void InitStr(string1 st, unsigned n)
А сам string1 - указатель на str. Да и при неправильной передаче параметров компилятор бы хоть предупреждение выдал...
0
 Аватар для doctor_lecter
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
25.09.2012, 13:31
ну можно попробовать так:
C++ (Qt)
1
2
3
4
5
void InitStr(string1 st, unsigned n) {
    st->s=(char*)malloc(n);
    st->max=n;
    st->N=0;
}
и в main вызывать так:
C++ (Qt)
1
2
3
4
5
6
int main() {
//...
    str st;
    InitStr(&st);
//...
}
1
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 9
25.09.2012, 14:13  [ТС]
Цитата Сообщение от doctor_lecter Посмотреть сообщение
ну можно попробовать так:
C++ (Qt)
1
2
3
4
5
void InitStr(string1 st, unsigned n) {
    st->s=(char*)malloc(n);
    st->max=n;
    st->N=0;
}
и в main вызывать так:
C++ (Qt)
1
2
3
4
5
6
int main() {
//...
    str st;
    InitStr(&st);
//...
}
О, так вроде работает, спасибо

p.s. Интересно, почему предыдущий вариант не работал?
0
 Аватар для doctor_lecter
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
25.09.2012, 14:24
ChronoExp, Потому что указатель, который передается InitStr &st и указатель внутри функции InitStr st это разные указатели, и инициализируется только тот который внутри функции.
0
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 4
07.11.2012, 10:39
Здравствуйте..помогите пожалуйста..составил программу но почему то нет упорядочености записей. посмотрите исправть..И помогите составить спецификацию с блок схемой по этой программе..Очень срочно...За ранее спасибо. Вот программа
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
#include <iostream>
#include <string>
using namespace std; 
 
struct STUDENT // структура STUDENT
{ 
    string name; 
    int group; 
    float ses[5]; 
};
 
int main() 
{   
    setlocale(LC_ALL,"Russian");
    const int size = 10; // количество студентов
    STUDENT stud1[size]; // массив 
    int i, j, n;  
    int count = 0; // счётчик студентов с плохими отметками 
                   // eсли он равен количеству студентов значит  
                   // хорошистов нет
 
    for ( n = 0; n < size; n++)  // ввод информации
    { 
        cout << "Введите фамилию студента " << endl; 
        cin >> stud1[n].name; 
        cout << "Введите номер группы " << endl; 
        cin >> stud1[n].group; 
        cout << "Введите 5 оценок " << endl; 
        for (int i = 0; i < 5; i++) 
        cin >> stud1[n].ses[i];     
    } 
 
    STUDENT stud2[size]; // массив для упорядоченных элементов
    i = 0, j = 0;
    int min, imin;
    min = 1023; 
 
    while (stud2[size-1].group < 0){    //заполнение массива упорядоченно
        for ( i = 0; i < size; i++){    //вычисление минимального элемента
            if (stud1[i].group < min){
                min = stud1[i].group;   
                imin = i;       
            }
        } 
        stud2[j] = stud1[imin];  //перенос элементов
        stud1[imin].group = 1023;
        min = 1023; 
        j++;
    }
    float sum = 0; // счётчик суммы оценок
    cout << "Фамилии и номера групп студентов со средней оценкой выше 4.0" << endl;
    for ( i = 0; i < size; i++) 
    {
        for (j = 0; j < 5; j++) 
          sum += stud2[i].ses[j]; 
          
            if(sum / 5 > 4.0) // условие хорошиста
            { 
                cout << "Фамилия:         " << stud2[i].name << endl; 
                cout << "Номер группы:    " << stud2[i].group << endl; 
            }  
            else  
                count++;
 
            sum = 0;
        }  
    if(count == size) 
        cout << "Такие студенты отсутствуют " << endl; 
 
    system("Pause");
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2012, 10:39
Помогаю со студенческими работами здесь

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

Динамическое выделение памяти под структуру и ее освобождение
Есть структура: struct mystack{ int kol; char info; }; Есть функция которая выделяет для нее память: mystack*...

Выделение памяти под указатель
Нужно с помощью указателя изменить значение переменной в функции. Но под один из них не выделяется память. Что делать? int colIndex =...

Выделение памяти динамически под массив
Есть программа, нужно выделить динамически память под массив, все попытки сделать это самостоятельно были тщетны... #include...

Выделение памяти под трехмерный массив
Здравствуйте. Выделяю память под трехмерный массив, но не получается обратиться к элементу 120-0-0. Помогите, пожалуйста int...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru