Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разреженные массивы: помогите исправить ошибки 
:(
    Опции темы
Aline
Дата 6.6.2013, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



volatile, спасибо,не заметила:)

Добавлено через 13 минут и 23 секунды
volatile, кое что исправила, но ошибки, вернее одна ошибка остается. Сильно не смейтесь, эта тема для меня совершенно новая, посмотрите код, плиз:

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "SparseArray.h"
#include <iostream>
#include <string>
#include <map>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

using namespace std;


struct KeyType {
 byte key[9];
 bool operator < (const KeyType& op2) const {return memcmp(key,op2.key,sizeof(key))<0;}
};

typedef byte Data_type[1500];

struct KeyType key;
Data_type data;

map< KeyType, Data_type > afdx_map;



int n_k = 0;
int n_d = 0;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btnInsertClick(TObject *Sender)
{
  byte k[9];
  Data_type d;
  for (int i = 0; i < 9; i++) {
    k[i] = n_k;
    ++n_k;
  }

  for (int i = 0; i < 1500; i++) {
    d[i] = n_d;
    ++n_d;
  }

  n_k = random(100);
  n_d = random(100);


  memcpy(key.key,k,9);
  memcpy(data,d,1500);

  afdx_map[ key] = d;
}


В последней строчке возникает ошибка:
[bcc32 Error] SparseArray.cpp(62): E2277 Lvalue required

PM MAIL   Вверх
xvr
Дата 6.6.2013, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Aline @  6.6.2013,  13:06 Найти цитируемый пост)
В последней строчке возникает ошибка:

В С (да и в С++) присваивать массивы нельзя. Заверните ваш массив в структуру (так же, как для KeyType) - структуры присваивать можно.
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "SparseArray.h"
#include <iostream>
#include <string>
#include <map>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
using namespace std;
struct KeyType {
 byte key[9];
 bool operator < (const KeyType& op2) const {return memcmp(key,op2.key,sizeof(key))<0;}
};
struct Data_type {
 byte data[1500];
};

KeyType key;
Data_type data;
map< KeyType, Data_type > afdx_map;
int n_k = 0;
int n_d = 0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnInsertClick(TObject *Sender)
{
  for (int i = 0; i < 9; i++)  key.key[i] = n_k++;
  for (int i = 0; i < 1500; i++)  data.data[i] = n_d++;
  n_k = random(100);
  n_d = random(100);
  afdx_map[ key] = data;
}


Добавлено через 1 минуту и 8 секунд
PS. Переменные key и data лучше сделать локальными в функции btnInsertClick - глобальные переменные зло (особенно когда они не нужны  smile )

PM MAIL   Вверх
Aline
Дата 6.6.2013, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



xvr, спасибо!

У меня была мысль это сделать, но выше сказали, что без надобности так делать....
Сейчас попробую

Добавлено через 3 минуты и 45 секунд
xvr, мне еще предложили оформить data как vector, но почему то при объявлении типа возникает ошибка, что то не нравится в синтаксисе, пишет, что не хватает запятой
 
вот так делала:
Код

typedef vector<char> Data_type;
Data_type data (1500);

PM MAIL   Вверх
Guinness
Дата 6.6.2013, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Цитата(xvr @  6.6.2013,  16:50 Найти цитируемый пост)
Заверните ваш массив в структуру (так же, как для KeyType) - структуры присваивать можно.

А есть ли смысл этим заниматься, если можно std::vector использовать? Раз уж используем std::map.
PM MAIL   Вверх
Aline
Дата 6.6.2013, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Guinness, у меня vector  не получилось использовать, посмотрите выше сообщение
PM MAIL   Вверх
xvr
Дата 6.6.2013, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Aline @  6.6.2013,  15:52 Найти цитируемый пост)
xvr, мне еще предложили оформить data как vector,

Если размер данных может меняться в процессе работы, то vector действительно будет лучше. Если же меняться не может, то будет наоборот - хуже. За счет накладных расходов на сам vector

Цитата(Aline @  6.6.2013,  15:52 Найти цитируемый пост)
что то не нравится в синтаксисе, пишет, что не хватает запятой

В принципе все правильно. Возможно Builder старый с не совсем полной stl  smile Попробуйте просто Data_type data; (без размера). Должен съесть.

PM MAIL   Вверх
Guinness
Дата 6.6.2013, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Цитата(Aline @  6.6.2013,  16:58 Найти цитируемый пост)
у меня vector  не получилось использовать, посмотрите выше сообщение

Код

#include <vector>

typedef std::vector<char> Data_Type;

int main()
{
    Data_Type m(1500);
}


попробуйте std:: добавить

Это сообщение отредактировал(а) Guinness - 6.6.2013, 16:05
PM MAIL   Вверх
Aline
Дата 6.6.2013, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



xvr, Билдер вроде не старый, не помню как правильно пишется, ну что там после BDS вышло?smile Стоит одна из последних версий.


Guinness, всё равно ругается,говорит что нет вектора в этом классе
PM MAIL   Вверх
xvr
Дата 6.6.2013, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Aline @  6.6.2013,  20:14 Найти цитируемый пост)
Guinness, всё равно ругается,говорит что нет вектора в этом классе 

Давайте исходник, посмотрим

PM MAIL   Вверх
Aline
Дата 7.6.2013, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



xvr, вот какая версия у меня "Embarcadero® C++Builder® XE3 Version 17.0.4625.53395 ", просто среда на работе,а вечером я из дома писала, дома нет этого

исходник.... да собственно я скопировала Ваш текст и пыталась вместо структуры поставить тип vector

Код

#include "SparseArray.h"
#include <iostream>
#include <string>
#include <map>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

using namespace std;

struct KeyType {
 byte key[9];
 bool operator < (const KeyType& op2) const {return memcmp(key,op2.key,sizeof(key))<0;}
};

/*struct Data_type {
 byte data[1500];
};*/
typedef vector <char> Data_type;
Data_type data (1500);

KeyType key;
//Data_type data;

map< KeyType, Data_type > afdx_map;

int n_k = 0;
int n_d = 0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnInsertClick(TObject *Sender)
{
  for (int i = 0; i < 9; i++)  key.key[i] = n_k++;
  for (int i = 0; i < 1500; i++)  data.data[i] = n_d++;
  n_k = random(100);
  n_d = random(100);
  afdx_map[ key] = data;
}


Пишет, что: [bcc32 Error] SparseArray.cpp(23): E2257 , expected    на строчке typedef vector <char> Data_type;, ну и соответственно дальше ему не нравится объявление переменной data и пошло-поехало...
PM MAIL   Вверх
volatile
Дата 7.6.2013, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Aline, вверху 
Код

#include <vector>

PM MAIL   Вверх
Aline
Дата 7.6.2013, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



volatile, спасибо! Программа запустилась smile Теперь буду дальше разбираться
Надо теперь реализовать еще поиск и удаление элемента.

Я так понимаю, если надо обновить данные, то необходимо удалить элемент с этим ключом,а потом добавить новый, с новыми данными?
И еще вывести на экран,что там в этом массиве хранится

Это сообщение отредактировал(а) Aline - 7.6.2013, 09:52
PM MAIL   Вверх
xvr
Дата 7.6.2013, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Aline @  7.6.2013,  09:50 Найти цитируемый пост)
Надо теперь реализовать еще поиск и удаление элемента.

Для поиска у map есть методы find или count + обычная индексация. Для удаления - erase

Цитата(Aline @  7.6.2013,  09:50 Найти цитируемый пост)
Я так понимаю, если надо обновить данные, то необходимо удалить элемент с этим ключом,а потом добавить новый, с новыми данными?

Нет, достаточно просто присвоить новые данные по старому ключу (как в массив - через индексацию)

Цитата(Aline @  7.6.2013,  09:50 Найти цитируемый пост)
И еще вывести на экран,что там в этом массиве хранится

Для этого есть итератор (map<...>::iterator) и методы map'а begin() и end()

PM MAIL   Вверх
Aline
Дата 7.6.2013, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



xvr, спасибо огромное! Буду юзать!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0916 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.