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

Байтовое хранилище данных - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка при построении Release в VC 2010 Express. http://www.cyberforum.ru/cpp-beginners/thread557759.html
Использую qt-win-opensource-4.8.1-vs2010 с VC 2010 Express. Проект разделён на три файла: mainwindow.h #include <QtGui> #include <QtCore> class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); };
C++ Структура и кое-что не понятно... Имеется такая структура struct Person { std::string surname; unsigned int year; bool operator < (const Person &sg) { return (this->year < sg.year); http://www.cyberforum.ru/cpp-beginners/thread557736.html
Найти все элементы, кратные 3 или 5. Сколько их? C++
Одномерные массивы, помогите исправить ошибки #include "stdafx.h" #include <iostream> #include <conio.h> #include <math.h> using namespace std; void main () { int m, i, s=0; for (i=0; i<20; i++)
C++ Написать программу, которая бы по введенному номеру единицы измерения (1-секунды, 2-минуты, 3-часы, 4-сутки) и заданному временному интервалу печатала
Написать программу, которая бы по введенному номеру единицы измерения (1-секунды, 2-минуты, 3-часы, 4-сутки) и заданному временному интервалу печатала бы соответствующее значение в минутах.
C++ Помогите пожалуйста))) http://www.cyberforum.ru/cpp-beginners/thread557696.html
Даны действительные числа a,b,c. Удвоить эти числа, если a>=b>=c, и заменить их абсолютными значениями ,если это не так.
C++ splipath Есть задание - написать программу, выводящую путь, откуда запущена программа. При чем путь надо разбить. Ну там логический диск, директория, имя файла, расширение и тд. Запускать надо с консоли) Сделал так: #include <direct.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main( void ) { char path_buffer; подробнее

Показать сообщение отдельно
3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83

Байтовое хранилище данных - C++

24.04.2012, 22:55. Просмотров 1172. Ответов 5
Метки (Все метки)

Привет, народ. Есть задача - в руки мне даётся структура, предназначенная для хранения байтового массива. Заполнять массив можно однотипными значениями какого-угодно типа, только в начале нужно указать сколько в байтах будет занимать один элемент в памяти. Вот примерно как это выглядит:
Описание структуры:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef CSTASH
#define CSTASH
 
struct CStash{
    int size; // Размер каждого элемента
    int amount; // Кол-во элементов
    int next; // Следующий пустой элемент
    unsigned char* storage; // указатель на "байтовый" массив
 
    void initialize(int size); // Задаёт размер елемента хранилища в байтах
    int add(void* element); // Добавление элемента
    void* fetch(int index); // Возвращает указатель на элемент с указанным индексом
    /* Расширяет байтовый массив на кол-во байтов, требуемое
    для добавления "increase" элементов*/
    void inflate(int increase); //Расширение массива для записи нового элемента
    int count();
    void printBinary();
};
 
#endif
Методы:
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
#include "CLib.h"
#include <iostream>
using namespace std;
 
const int increment = 100;
 
//Задаёт начальные значения полей(вместо конструктора)
void CStash::initialize(int sz){
    size = sz;
    amount = 0;
    storage = 0;
    next = 0;
}
 
//Добавление элемента
int CStash::add(void* element){
    inflate(1);
    unsigned char* ptr = reinterpret_cast<unsigned char*>(element);
    for(int i = amount * size - size; i < amount * size; i++){
        storage[i] = *ptr;
        ptr++;
    }
    return amount;
}
 
// Расширение массива
void CStash::inflate(int increase){
    int newAmount = amount + increase;
    int newBytes = newAmount * size;
    int oldBytes = amount * size;
    unsigned char* b = new unsigned char[newBytes];
    for(int i = 0; i < oldBytes; i++){
        b[i] = storage[i];
    }
    delete [] (storage);
    storage = b;
    amount = newAmount;
}
 
int CStash::count(){
    return next;
}
 
// Возвращает указатель на элемент массива с номером(не индексом!) "index"
void* CStash::fetch(int number){
    if(number >= 0 && number <= amount-1)
        return &(storage[number * size]);
    else
        return 0;
}
Дальше требуется используя эту структуру наполнить её n-ым кол-вом string-овых объектов. Я беру их cpp-файла
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
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include "CLib.h"
#include "Stack.h"
#include <assert.h>
 
using namespace std;
 
void f(char* str){
    cout << strlen(str) << endl;    
    return;
}
 
int main(int argc, char* argv[]){
    CStash* stash = new CStash;
    ifstream in("main.cpp");
    stash->initialize(80);
    string str;
    for(double i = 0; i < 10; i ++){
        getline(in, str);
        stash->add(&str);
    }
    int i = 0;
    while(stash->fetch(i)){
        cout << *reinterpret_cast<string*>(stash->fetch(i)) << endl;
        i++;
    }
    system("pause");
    return 0;
}
И вот тут начинаются проблемы. Ибо если для простых типов(int, double...) всё работает хорошо. То для string, когда я пытаюсь потом их извлечь и вывести на экран - мне выводит пять(я беру n равный пяти) одинаковых строчек. Я дебажил как умел, ничего не понятно. Помогите, люди добрые
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru