Форум программистов, компьютерный форум CyberForum.ru

Массив указателей типа void (функция удаления,расширения) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ вирус не находит http://www.cyberforum.ru/cpp-beginners/thread957970.html
Кто знает что за вирус-создает свои директории в папке и огромные файлы-как-буд-то место занимает так вот за день там таких файлов-около 130 ГИГАБАЙТ!Переустанавливал-помогло вроде-но ни один антивирус-проверял аваст,авира,нод 32-все бесплатные которые-ничего вообще не нашли.Но не могут же файлы просто так сами появляться???Может кто хочет каспером?я кину по аське кто разбирается или не боится...
C++ Получение случайных чисел Необходимо исправить написанную на с++ программу так, чтобы числа задавались случайным образом, а не как в этой программе ручную: #include <iostream> using namespace std; void bubbleSort(int array, int col){ int temp=0; for (int i=1; i<col>array ){ temp=array; array =array ; array =temp; } http://www.cyberforum.ru/cpp-beginners/thread957957.html
C++ hex редактор на с++
всем привет ) собственно вопрос простой ) я хочу для начала сделать только просмотр hex кода а в потом уже и изменение его))) так вот обратился сюда в надежде что мне дадут какие нибудь ссылки на статьи по этому вопросу или расскажут как это можно сделать с помощью каких функций и так далее ) спасибо :)
C++ Вывод объекта класса созданного пользователем на консоль объектом cout
Доброго времени суток ребят. Возникла задача вывести объект класса созданного пользователем на консоль с помощью объекта cout. Но так как я в программировании еще новичок может ли кто подсказать как осуществить эту задачу на С++. Буду весьма благодарен.
C++ Два файла .cpp в проекте http://www.cyberforum.ru/cpp-beginners/thread957939.html
Файлы DayOfWeek и main(откуда вызываются методы из DayOfWeek). Пишет ошибку на скрине,что не так? И что такое #include <stdexcept>? DayOfWeek.cpp #include <iostream> #include <stdexcept> #include <locale> using std::cout; using std::cin;
C++ Определить количество «особых» элементов матрицы Добрый день! Помогите написать программу: Задана матрица размером NxM. Определить количество «особых» элементов матрицы, считая элемент «особым», если он больше суммы остальных элементов своего столбца. Массив должен быть динамический. Начал делать , но считает не правильно. #include<iostream.h> #include <stdlib.h> void main() { int N,M,k=0; cout << "Vvedite razmer matricu n :" ; cin... подробнее

Показать сообщение отдельно
CROSP
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 114
19.09.2013, 18:32     Массив указателей типа void (функция удаления,расширения)
Вот есть задание создать такую структуру данных как изображена на изображении
http://s12.postimg.org/mqd3wuxf1/image.png
Вот не как не могу нормально написать функцию удаление элемента и расширения , ну и соответственно удаление всего списка.
Постоянно выскакивает сообщение типа "SIGABRT" .
Немного о структуре. Массив из указателей типа void*, каждый из указателей в массиве указывает на структуру , за исключением 2 первых элементов , они берутся как служебные .size – размер массива (количество элементов, на которое рассчитан массив),count – реальное количество элементов в списке.
Затем указатель на начало массива передвигается на 2 элемента вперед , соответственно нулевой элемент будет 3 на самом деле.

Подскажите пожалуйста где накосячил .
Вот код.
pointerarray.cpp
C++ (Qt)
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include "pointerarray.h"
pointerArray::pointerArray(int initialSize)
{
     this->start = new void* [initialSize+2];/* запрашиваем память для  нового массива*/
    this->initArr(initialSize);
 
}
 
pointerArray::pointerArray()
{
     this->start = new void* [DEF_SIZE+2]; /* запрашиваем память для  нового массива*/
    this->initArr(DEF_SIZE);
 
}
 
void pointerArray::initArr(int initSize) {
    this->start+=2;  /*опускаем указатель вниз на два элемента чтобы он указывал на первый указатель а не на служебный элемент*/
 
 
    ((int*)this->start)[POS_CNT]  = 0; /*Заполняем служебный элемент массива – количество элементов списка*/
 
    ((int*)this->start)[POS_SZ]  =  initSize; /*Заполняем служебыій элемент массива – размер массива */
}
 
void pointerArray::ExpendArrPtr (){
    expandDef(((int*)this->start)[POS_SZ],DELTA);
}
 
void** pointerArray::getStart() {
    return this->start;
}
 
void pointerArray::ExpendArrPtr (int incSize)
{
  expandDef(((int*)this->start)[POS_SZ],incSize);
}
void pointerArray::expandDef (int sizeOld,int incSize) {
 
    int  sizeNew = sizeOld + incSize;
  void**   arOld = this->start; /*вспомогательный бестиповый указатель на начало массива указателей*/
  this->start = new void* [sizeNew+2]; /*выделение места для нового массива*/
 
 
  for (int i = sizeOld; i>= 0; i--)
  {
      this->start[i]=arOld[i];
  }
 
   arOld-=2;
   ((int*)this->start)[POS_CNT]  = ((int*)arOld)[POS_CNT];
   ((int*)this->start)[POS_SZ]  = sizeNew;
 
  delete []arOld; //освобождаем память
    this->start+=2; /* ставим указатель массива на первый указатель в новом массиве */
}
 
void pointerArray::showList() {
    int cnt=((int*)this->start)[POS_CNT];
    for (int k = 0; k <cnt; k++)
        {
          cout<<((TStruct*)this->start[k])->name<<"\n";
          cout<<((TStruct*)this->start[k])->age<<"\n";
        }
 }
int pointerArray::findElList(string key){
    /* start – указатель на список
      key – ключ поиска
      posFndEl – индекс найденного элемента
      findOk – результат поиска (true – если найден элемент,
               false – если не найден элемент с таким ключом)
   */
 int posFndEl;
 int    middl; /*middl выступает как индекс среднего элемента
              массива*/
 int     hi, low;   /*текущие границы - верхняя, нижняя*/    /*элемент не найден*/
 
      /*берем из мссива значение служебного элемента cunt
        И проверяем пуст ли список*/
 
 if (((int*)this->start)[POS_CNT] == 0)
 {
    posFndEl = 0;
    return -1;
 }
      /*Устанавливаем границы поиска на границы массива*/
 low = 0;
 hi = ((int*)this->start)[POS_CNT] - 1;
 
 do
 {
    middl = (hi + low) / 2 ; /*индекс среднего элемента*/
 
     if (key==((TStruct*)(this->start[middl]))->name)
        { posFndEl = middl;      /*элемент найден*/
        return posFndEl;
        }
     if (key<((TStruct*)(this->start[middl]))->name)
        {
          hi = middl - 1;
       }
     else
        {
         low = middl + 1;
       }
 
 } while  (low <= hi);
 posFndEl= -1;
 return posFndEl;/*Перебран весь массив. Искомый элемент не найден. Определена позиция возможной вставки нового элемента*/
}
void pointerArray::replaceEl(void* newEl,int place){
    if (place<0) {
        return;
    }
     delete ((TStruct*)(this->start[place]));
     this->start[place] = newEl;
}
void pointerArray::replaceEl(int age ,string name,int place){
    if (place<0) {
        return;
    }
    ((TStruct*)(this->start[place]))->age = age;
    ((TStruct*)(this->start[place]))->name = name;
    
}
 
void pointerArray::delFromList(int posDel){
int cnt=((int*)this->start)[POS_CNT];
if (posDel<0){
    return;
}
      cout<<(TStruct*)this->start[posDel];
         for (int k = posDel; k<cnt-1; k++)
              {
             this->start[k] = this->start[k+1];
         }
cnt--;
       ((int*)this->start)[POS_CNT]=cnt;
 
}
void pointerArray::addToSort(void* pnew, int posAdd)
{
    /*
         start – указатель на список
         pnew – указатель на новый элемент списка, который размещен
                     в памяти  и поля его заполнены
         posAdd – индекс элемента в массиве, в который необходимо вставить
                         указатель на новый элемент
    */
 
int cnt=((int*)this->start)[POS_CNT];
int sz= ((int*)this->start)[POS_SZ];
 
  //если массив переполнен, то вызываем расширение массива
if (cnt == sz)
        {
       this->ExpendArrPtr();
        }
 
 
 if (posAdd == cnt) //добавляемый элемент располагается в конце списка
        {
        this->start[posAdd] = pnew;
        }
  else
        {     // сдвиг элементов в массиве указателей на 1 вправо
         for (int k = cnt-1; k >= posAdd; k--)
              {
                  this->start[k+1] = this->start[k];}
                  this->start[posAdd] = pnew;
               }
 cnt++;
 
 ((int*)this->start)[POS_CNT]=cnt;
} //addToSort
void pointerArray::showInfo() {
    cout<<((int*)this->start)[POS_CNT]<<"\n";
     cout<<((int*)this->start)[POS_SZ];
}
Pointerarray.h
C++ (Qt)
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
#ifndef POINTERARRAY_H
#define POINTERARRAY_H
 
#define POS_SZ 2
#define POS_CNT -1
#define DEF_SIZE 10
#define DELTA 4
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
 
using namespace std;
 
typedef struct {
         int age;
         string name;
   } TStruct;
 
 
class pointerArray {
public:
    pointerArray(int initialSize);
    pointerArray();
    void showList ();
    void delFromList(int posDel);
    void ExpendArrPtr ();
    void ExpendArrPtr (int incSize);
    int findElList(string key);
    void showInfo();
    void addToSort(void* pnew, int posAdd);
    void** getStart();
    void replaceEl(void* newEl,int place);
    void replaceEl(int age ,string name,int place);
    void delFromList();
     ~pointerArray() {
};
private:
     void** start;
     void initArr(int initSize);
     void expandDef (int sizeOld,int incSize);
};
 
#endif // POINTERARRAY_H
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(int argc, char** argv) {
    pointerArray arr(3);
    void* el = new TStruct;
    ((TStruct*)el)->age =35;
    ((TStruct*)el)->name = "One";
    void* el1 = new TStruct;
    ((TStruct*)el1)->age =2;
    ((TStruct*)el1)->name = "Two";
    void* el2 = new TStruct;
    ((TStruct*)el2)->age =3;
    ((TStruct*)el2)->name = "three";
     void* el3 = new TStruct;
    ((TStruct*)el3)->age =6;
    ((TStruct*)el3)->name = "four";
    
    arr.addToSort(el,0);
    arr.addToSort(el1,1);
    arr.addToSort(el2,2);
    arr.addToSort(el3,3);
   arr.delFromList(0);
 
    return 0;
}
Спасибо заранее
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 02:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru