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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание динамичного массива, с помощью классов 
:(
    Опции темы
Ukrajinec
  Дата 14.1.2015, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго дня суток!
Помогите из решением. Задача: нужно составить программу с помощью которой создается некий массив записей (строчек) типа char (тоесть это, по сути, двумерный массив типа char) и это надо сделать с помощью классов. 
Вот как это вижу я:
заголовочный файл
Код

#ifndef NUMBER_3_H_
#define NUMBER_3_H_

class List
{
public:
    List();
    List(int a);
    void addList(char &a, int i);   //получает вводимую строку и индекс массива куда эту строку надо всунуть
    void ShowList(int i); //пока ненужно
    bool isEmpty(char *ch) const; i); //пока ненужно
    bool isFool(char *ch) const; i); //пока ненужно
    ~List();

private:
    int n_;  //величина массива
    char **cl_; //сам массив еще не инициализированный
};
#endif



файл с функциями (здесь много чего не доделано, сейчас интересует именно реализация класса):
Код

#include <iostream>
#include "number 3.h"

List::List()  // по-умолчанию создается 1 элемент массива, длиной в 1 символ
{
    n_ = 0;
    *cl_ = new char;
}
List::List(int a) //получаем величину массива и выделяем нужное количество памяти
{
    n_ = a;
    *cl_ = new char[a]; // <== здесь программа прерывается
}
List::~List()
{
//это здесь надо освобождать память delete-ом или деструктор сам это сделает?
}

void List::addList(char &a, int i) //вычисляет длину введенной строки и выделяет нужное ей количество памяти из элемента с указанным индексом
{
    
        int len = strlen(&a);
        *(cl_ + i) = new char[len];
        *(cl_ + i) = &a;
    
}

void List::ShowList(int i) i); //пока ненужно
{
    std::cout << *(cl_ + i) << "\n";
}

bool List::isEmpty(char *ch) consti); //пока ненужно
{
   (*ch == NULL ) ? return true : return false;
}


Вопрос как сделать так, чтоб создавался динамический массив, потому как именно на создании массива стопорит вся программа?


Это сообщение отредактировал(а) Ukrajinec - 14.1.2015, 21:17
PM MAIL   Вверх
feodorv
Дата 15.1.2015, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Ukrajinec @  14.1.2015,  19:35 Найти цитируемый пост)
здесь программа прерывается

И правильно делает. Ведь Вы создаёте одномерный(!) массив, а указатель на него кладете по адресу *cl_, при этом сам cl_ никак не инициализирован (то есть cl_ мусорное, следовательно, *cl_ указывает неизвестно куда, может и в защищенную область памяти процесса).

Как я понял, Вам нужен именно двумерный массив и именно типа char**, так? В таком случае сначала нужно запросить память на массив указателей:
Код
cl_ = new char*[a];
и не забыть его инициализировать:
Код
for( int i = 0; i < a; i++) cl_[i] = 0;
(NULL'ом в C++ лучше не пользоваться). В дальнейшем строчку Вы можете добавить таким образом:
Код

bool List::add(const char *s, int i)
{
  if( i < 0 || i >= n_ ) return false;
  if( cl_[i] != 0 ) delete [] cl_[i];
  if( s == 0 ) return true;

  int length = stlen(s);
  cl_[i] = new char[length+1];
  for( j = 0; j < length; j++) cl_[i][j] = s[j]; // или strcpy
  cl[i][length] = '\0';
  return true;
}


Деструктор:
Код

List::~List()
{
  for( i = 0; i < n_; i++) if( cl_[i] != 0 ) delete [] cl_[i];
  delete [] cl_;
  cl_ = 0;
  n_ = 0;
}



Цитата(Ukrajinec @  14.1.2015,  19:35 Найти цитируемый пост)
        *(cl_ + i) = new char[len];
        *(cl_ + i) = &a;

Что Вы здесь пытаетест скопировать? Сначала Вы задали значение для *(cl_ + i) как new char[len] (причем на завершающий ноль память не выделена), затем это самое значение перезаписываете величиной &a. Итог: строка не скопирована (скопирован адрес строки, но не сама строка), плюс утечка памяти.


Цитата(Ukrajinec @  14.1.2015,  19:35 Найти цитируемый пост)
List::List()  // по-умолчанию создается 1 элемент массива, длиной в 1 символ
{
    n_ = 0;
    *cl_ = new char;
}

В чем смысл устанавливать n_ в ноль, но при этом запрашивать память?

Это сообщение отредактировал(а) feodorv - 15.1.2015, 06:37


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Ukrajinec
Дата 19.1.2015, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Оказывается я напрочь забыл указатели( Спасибо, кажется разобрался но у меня появился еще 1 вопрос:
вместо
Код

for( i = 0; i < n_; i++) if( cl_[i] != 0 ) delete [] cl_[i];
  delete [] cl_;

,
Код

  delete [] cl_;

не освободит полностью память, обязательно ее почленно освобождать?
PM MAIL   Вверх
konshyn
Дата 19.1.2015, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Ukrajinec @  19.1.2015,  13:39 Найти цитируемый пост)
не освободит полностью память, обязательно ее почленно освобождать? 

Обязательно


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
Ukrajinec
Дата 19.1.2015, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



появился следующий вопрос:
почему в строчке
Код

sys32.addList(*ch, i);

звездочка подчеркивается и пишет что "error C2664: "bool List::addList(const char *,int)": невозможно преобразовать аргумент 1 из "char" в "const char *"?

PM MAIL   Вверх
konshyn
Дата 20.1.2015, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Ukrajinec @  19.1.2015,  22:41 Найти цитируемый пост)
звездочка подчеркивается и пишет что "error C2664: "bool List::addList(const char *,int)": невозможно преобразовать аргумент 1 из "char" в "const char *"?

Потому что оператор * в данном случае является разыменователем, т.е. ты передаешь в функцию тип не указатель на char, а переменную char.


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
Ukrajinec
Дата 21.1.2015, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(konshyn @  20.1.2015,  10:21 Найти цитируемый пост)
error C2664
 и как сделать так чтобы передавалось то что надо?

PM MAIL   Вверх
konshyn
Дата 22.1.2015, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Ukrajinec @  21.1.2015,  23:36 Найти цитируемый пост)
и как сделать так чтобы передавалось то что надо?

убрать *


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
bsa
Дата 23.1.2015, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата
Создание динамичного массива
Слово "динамичный" означает "подвижный". Массив не может быть "динамичным". Он может быть "динамическим".

PM   Вверх
Ukrajinec
Дата 24.1.2015, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не могу понять в чем проблема. Здесь снова выкидывает((
Цитата(feodorv @  15.1.2015,  05:35 Найти цитируемый пост)
*cl_ = new char;

заголовочный файл
Код

#ifndef NUMBER_3_H_
#define NUMBER_3_H_

class List
{
public:
    List();
    List(int a);
    bool addList(const char *s, int i);
    void ShowList(int i);
    bool isEmpty(char *ch) const;
    bool isFool(char *ch) const;
    ~List();

private:
    int n_;
    char **cl_;
};
#endif

файл с функциями
Код

#include <iostream>
#include <string>
#include "number 3.h"

List::List()
{
    n_ = 0;
    *cl_ = new char;
}
List::List(int a)
{
    n_ = a;
    *cl_ = new char[a];
}
List::~List()
{

}

bool List::addList(const char *s, int i)
{
    if (i < 0 || i >= n_) return false;
    if (cl_[i] != 0) delete[] cl_[i];
    if (s == 0) return true;

    int length = strlen(s);
    cl_[i] = new char[length + 1];
    for (int j = 0; j < length; j++) cl_[i][j] = s[j]; // или strcpy
    cl_[i][length] = '\0';
    return true;
}

void List::ShowList(int i)
{
    std::cout << *(cl_ + i) << "\n";
}

bool List::isEmpty(char *ch) const
{
    if (*ch == 0)
        return true;
    else
        return false;
}

bool List::isFool(char *ch) const
{
    if (*ch != 0)
        return true;
    else
        return false;
}


исполнительный файл
Код

// newplace.cpp — использование операции new с размещением 
#include <iostream>
#include "number 3.h"

int main()
{
    using std::cout;
    using std::cin;

    int n;
    char *ch = new char;
    *ch = 0;

    cout << "Enter numbers of the list: ";
    cin >> n;
    List sys32(n); // доходит досюда и выбивает с ошибкой
...


Добавлено через 3 минуты и 6 секунд
Цитата(bsa @  23.1.2015,  16:53 Найти цитируемый пост)
 Массив не может быть "динамичным". Он может быть "динамическим". 

спасибо! В будущем учту.
PM MAIL   Вверх
Ukrajinec
Дата 24.1.2015, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



кстати, вылетает программа всегда на резервирование памяти, независимо от того какой конструктор используется, по умолчанию или нет
PM MAIL   Вверх
baldina
Дата 24.1.2015, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(feodorv @  15.1.2015,  06:35 Найти цитируемый пост)
cl_ = new char*[a];


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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