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

Вектор на си

18.04.2018, 23:38. Показов 22209. Ответов 15

Студворк — интернет-сервис помощи студентам
Нужно реализовать вектор на си. Будем представлять вектор с помощью следующей структуры:
C
1
2
3
4
5
6
7
typedef struct {
    void* pData;
    int elemSz;
    int size;
 
    int realMemSize; //real size of the allocated memory
}vector;
Вопрос который наверное глупый но не суть: Как написать функцию ну или код для ввода данных разных типов?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.04.2018, 23:38
Ответы с готовыми решениями:

Умножить одномерный массив (вектор-строка) на главную диагональ (вектор столбец)
Помогите исправить ошибки в коде, пожалуйста. Задание: задать матрицу 3х3 с помощью указателей, задать одномерный массив из 3-х...

Сформировать вектор В, каждый элемент которого равен скалярному произведению строки матрицы A [M × N] на вектор Х
Условие:Сформировать вектор В, каждый элемент которого равен скалярному произведению строки матрицы A на вектор Х.

Класс "вектор" с конструкторами, позволяющими создать нулевой вектор и вектор с произвольным числом элементов
Привет! Задача следующая. Нужно реализовать класс "вектор" с конструкторами, которые позволяют создать нулевой вектор и вектор с...

15
 Аватар для Ovederax
604 / 404 / 212
Регистрация: 30.04.2017
Сообщений: 744
Записей в блоге: 1
19.04.2018, 19:48
Евгений222, vector - это шаблонный класс,поэтому хранимые данные могут быть любых типов
Если хранить указатели на структуры и переменные, то все просто, нужно использовать void*
Если нужно хранить данные по значению то можно попробывать вывернутся через использование define для генерации шаблонного кода(см ссылку)
Но на самом деле пожалуй лучше будет не забивать голову этой фигней и использовать с++
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
19.04.2018, 20:25
Цитата Сообщение от Ovederax Посмотреть сообщение
Но на самом деле пожалуй лучше будет не забивать голову этой фигней и использовать с++
Лучше будет забить голову этой фигнёй, и понять как работает вектор на самом деле, чем не забивать голову этой фигнёй, и никогда не узнать этого. А тот, кто этого не знает может называться программистом? Нет. Он манки-кодер.
1
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 21
19.04.2018, 20:35  [ТС]
Так в этом и вопрос разбираться надо но не пойму как вектор должен понимать вводимые данные разных типов и как их вводить. Если направите на правильный путь решения этой проблемы буду признателен
0
Заблокирован
20.04.2018, 04:40
Ниже пример того, как работать с разными типами. Отмечу, что код не оптимизирован и при необходимости могут потребоваться определенные доработки. Сейчас, например, в вектор нельзя добавить целочисленную константу без использования временной переменной.

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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
 
//----------------------------------------------------------------------
 
#define ERR_OK      0
#define ERR_MEMORY -1
 
#define TYPE_ID_INT      0
#define TYPE_ID_CHAR_STR 1
 
//----------------------------------------------------------------------
 
typedef int (*size_f)(int type_id, const void* data);
typedef void (*copy_f)(int type_id, void* dst, const void* src);
typedef void (*show_f)(int type_id, const void* data);
 
typedef struct {
    size_f size;
    copy_f copy;
    show_f show;
} handler_t;
 
typedef struct {
    void* data;
    int type_id;
} element_t;
 
typedef struct {
    element_t* data;
    int size_current;
    int size_max;
    handler_t handler;
} vector_t;
 
//----------------------------------------------------------------------
 
void
init_vector(vector_t* vector, const handler_t* handler) {
    vector->data = 0;
    vector->size_current = 0;
    vector->size_max = 0;
    vector->handler = *handler;
}
 
int
add_element(vector_t* vector, const void* data, int type_id) {
    if (vector->size_current >= vector->size_max) {
        int new_size_max = vector->size_max * 2 + 1;    
        void* new_memory = realloc(vector->data, new_size_max * sizeof(element_t));
        if (!new_memory) {
            return ERR_MEMORY;
        }
        vector->data = new_memory;
        vector->size_max = new_size_max;    
    }
    
    element_t new_element;
    new_element.data = malloc(vector->handler.size(type_id, data));
    if (!new_element.data) {
        return ERR_MEMORY;
    }
    vector->handler.copy(type_id, new_element.data, data);
    new_element.type_id = type_id;
    
    vector->data[vector->size_current] = new_element;
    vector->size_current++; 
 
    return ERR_OK;
}
 
void
show_vector(const vector_t *vector) {
    for (int i = 0; i < vector->size_current; i++) {
        vector->handler.show(vector->data[i].type_id, vector->data[i].data);
    }
}
 
//----------------------------------------------------------------------
 
int
size(int type_id, const void* data) {
    switch (type_id) {
    case TYPE_ID_INT:
        return sizeof(int);
    case TYPE_ID_CHAR_STR:
        return strlen(data) + 1; 
    }
}
 
void
copy(int type_id, void* dst, const void* src) {
    switch (type_id) {
    case TYPE_ID_INT:
        memcpy(dst, src, sizeof(int));
        break;
    case TYPE_ID_CHAR_STR:
        strcpy(dst, src);
        break; 
    }
}
 
void
show(int type_id, const void* data) {
    switch (type_id) {
    case TYPE_ID_INT:
        printf("%d", *((int*)data));
        break;
    case TYPE_ID_CHAR_STR:
        printf("%s", (char*)data);
        break; 
    }
    printf("\n");
}
 
//----------------------------------------------------------------------
 
int
main() {
    vector_t vector;
    handler_t handler = {size, copy, show};
 
    init_vector(&vector, &handler);
    
    for (int i = 0; i < 5; i++) {
        add_element(&vector, &i, TYPE_ID_INT);
    }
    add_element(&vector, "last_element", TYPE_ID_CHAR_STR);
    
    show_vector(&vector);   
    
    return 0;
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
20.04.2018, 10:47
Евгений222, Много лет назад был вынужден заниматься этим вопросом, ибо плюсов еще не было, а нужда в аналоге вектора была. В архиве кусок того, что я тогда натворил, "as is" и даже комментарии в кодировке 866
Структура XTD - это и есть тот самый вектор.
Возможно, вам помогут 2 макроса
C
1
2
3
      // * Макросы *
#define NEWXTD(x,T) (T *)newxtd(x,sizeof(T));
#define GETXTD(x,j,T) (T *)(x->ss[j]);
но остальное (архив) я прикладываю, чтобы можно было разобраться, кто есть кто.
Там много лишнего, но выжимать нужное было в лом.
Если вам помогут мои каракули - я рад. Не помогут - что ж поделаешь!
Удачи!
Вложения
Тип файла: zip X.ZIP (4.3 Кб, 32 просмотров)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
20.04.2018, 10:56
Небольшое пояснение, как этими макросами пользоваться. Пусть у вас есть некий тип данных T.
C
1
2
3
4
5
6
7
8
9
10
11
12
T *tt, somett;
XTD *x = genxtd();  // Создание и заполнение
for(i=0; i<N; i++) {
  // заполнили структуру somett
  tt = NEWXTD(x, T);
  *tt = somett;
}
   // Перебор и выемка
for(i=0; i<x->ns; i++) {
  tt = GETXTD(x, i, T);
   // ... tt  указывает на очередной элемент вектора
}
ЗЫ. Все это хозяйство служит мне верой и правдой уже не один десяток лет
0
Заблокирован
20.04.2018, 11:29
Цитата Сообщение от Байт Посмотреть сообщение
Небольшое пояснение, как этими макросами пользоваться. Пусть у вас есть некий тип данных T.
А почему здесь
C
1
i=0
нет пробела, а тут
C
1
tt = GETXTD(x, i, T);
есть?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
20.04.2018, 11:31
Цитата Сообщение от student8102 Посмотреть сообщение
А почему
Рояли не играет...
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 21
24.04.2018, 15:43  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Если вам помогут мои каракули - я рад.
Еще один вопросик: как пользователю задавать тип данных вектора? ну или как это можно реализовать. Заранее спасибо
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.04.2018, 15:59
Цитата Сообщение от Евгений222 Посмотреть сообщение
как пользователю задавать тип данных вектора?
А в моей реализации этого и не нужно.
Просто создаете
C
1
2
3
XTD *x = genxtd();
//И потом туда помещаете
T *t = NEWXTD(x, T);
Для примера, пусть у нас тип данных COMPLEX
C
1
2
3
4
5
6
7
8
COMPLEX *c = NEWXTD(x, COMPLEX);  // Тут только выделяется память
c->Re = 5;
c->Im = -2;
  // Или если есть уже заполненная структура 
COMPLEX a.
a.Re = 5;
a.Im=-2;
*c = a;
В принципе допустимо помещение в один вектор данных разных типов. Не знаю, зачем это может быть нужно, но допустимо. Контроля нет. И вы можете, скажем, в четные элементы помещать паспорт автомобиля, а в нечетные - отзыв о его ходовых качествах. Только отслеживание всего этого бардака - на вашей совести.
ЗЫ. Пока писал, появилась идейка более компактной реализации одной своей задачи...
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 21
24.04.2018, 16:05  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
В принципе допустимо помещение в один вектор данных разных типов.
Нет я в плане что бы вектор был определенного типа не только char, а так же и мог быть int, float например как в плюсах
C++
1
2
3
vector<int> myVector1; // Пустой вектор из элементов типа int
vector<float> myVector2; // Пустой вектор из элементов типа float
vector<char> myVector3; // Пустой вектор из элементов типа char
Надеюсь Вы меня поняли
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.04.2018, 16:14
Евгений222, Структура XTD весьма гибкая. Может быть даже излишне гибкая для ваших целей. Собственно в "векторе" хранятся указатели. Первоначально эта штука была придумана для хранения последовательности текстовых строк неизвестной длины и количества, и произвольного (по индексу) доступа к ним..
Но ее можно слегка упростить, храня не указатели, а сами данные (структуры).
У меня даже где-то завалялась попытка сделать это. Если вам очень интересно, могу поискать.
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 21
24.04.2018, 16:21  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Если вам очень интересно, могу поискать.
Буду признателен
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.04.2018, 16:43
Лучший ответ Сообщение было отмечено Евгений222 как решение

Решение

Цитата Сообщение от Евгений222 Посмотреть сообщение
Надеюсь Вы меня поняли
Понять-то понял. Но этого просто НЕ НУЖНО. Хотя указатели и объявлены как char *, они в самом деле работают, как void * Макросы NEWXTD, GETXTD приводят указатели к нужному типу, вот и все. Но следить за тем, чтобы в данный вектор помещались (и извлекались) объекты одного типа, предоставляется лично вам.
И в принципе никто не мешает запихнуть туда 5 дублей, 4 инта, затем 10 флаутов, а за ними еще и структуру FILE. Только следить за тем, что и куда вы запихнули (и соответственно, извлекать) - это лично ваше дело.

Добавлено через 15 минут
Цитата Сообщение от Евгений222 Посмотреть сообщение
Буду признателен
Ну вот
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
typedef struct {
    char *tt;    // * Массив элементов
    unsigned ms; // * Выделено памяти на элементов tt
    unsigned ns; // * Заполнено
    int st;      // * Шаг приращения памяти для tt
    int sz;      // * Величина элемента
               }  TD;
 
#define NEWTD(x,T) (T *)newtd(x);
#define GETTD(x,j,T) (T *)((x->tt)+(j)*(x->sz));
 
void gent(TD *x, short sz)
{
    x->tt = NULL;
    x->ms = x->ns = 0;
    x->st = 10;
    x->sz = sz;
}
// ------------------
TD *gentd(short sz)     // * Генерация  *
{ TD *x;
    x = malloc(sizeof(TD));
    gent(x, sz);
    return x;
}
// ********
deltd(TD *x)          // * Разрушение
{  if (x==NULL) return;
   if (x->tt!=NULL) free((x->tt));
   free(x);
}
/*********/
void *newtd (TD *x)      // * Новый элемент
{ void *p; int sz;
   sz = x->sz;
   if (x->tt==NULL) {
       x->ms = x->st;
       x->tt = malloc(x->ms * sz);
   }
   if (x->ns>=x->ms) {
     x->ms += x->st;
     x->tt = realloc(x->tt, x->ms*sz);
   }
   p = x->tt + sz*(x->ns++);
   return(p);
}
При генерации вместо sz указывайте sizeof(тип)
1
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 21
25.04.2018, 14:02  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Понять-то понял. Но этого просто НЕ НУЖНО. Хотя указатели и объявлены как char *, они в самом деле работают, как void * Макросы NEWXTD, GETXTD приводят указатели к нужному типу, вот и все. Но следить за тем, чтобы в данный вектор помещались (и извлекались) объекты одного типа, предоставляется лично вам.
И в принципе никто не мешает запихнуть туда 5 дублей, 4 инта, затем 10 флаутов, а за ними еще и структуру FILE. Только следить за тем, что и куда вы запихнули (и соответственно, извлекать) - это лично ваше дело.
Спасибо большое за помощьРазобрался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.04.2018, 14:02
Помогаю со студенческими работами здесь

Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы. Безопасный вектор определяет переменные нижний и верхний...

Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы. Безопасный вектор определяет переменные нижний и верхний...

Почему матрица на вектор умножается быстрее чем вектор на матрицу?
Почему матрица на вектор умножается быстрее чем вектор на матрицу?

Дан вектор Х, все положительные компоненты вектора Х переписать в вектор Y
Дан вектор Х(х1,х2...xn)(n=10) все положительные компоненты вектора Х переписать в вектор Y

матрица на вектор, вроде правильно, а вектор на матрицу? посмотрите пожалуйста?
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; int main() { ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru