Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 21 из 87<  1 ... 18  19  20  21  22  23  24 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс
А он лучше? Скорость с ним не понижется? Тем более мне все его функции не нужны в данном случае..
пока продолжаю копать, заменил двумерный массив одномерным, единственное, мне не понятно, как работает твой оператор []. Как он перегружает [][]?



Партнер
 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
operator[][] не перегружается, ибо такого оператора нет :) vector на производительность не повлияет (покрайней мере релизная версия).

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman писал(а):
мне не понятно, как работает твой оператор []
Да так же как и твой. :)


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Все, теперь понятно!
Билли Бонс
Точно! Понял, все ведь точно также)
В общем заменил я двумерный массив на одномерный с индексацией, и все равно если в деструктор засунуть
Код:
delete[] grid_
вылезает эта ошибка..


 

Member
Статус: Не в сети
Регистрация: 24.07.2005
Откуда: Moscow
-=alex-forewer=- Си мы сейчас проходим в институте, а Си++ потом будем


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman писал(а):
вылезает эта ошибка..
Не знаю, не знаю... У меня вот это замечательно компилируется и работает:
Код:
#include <iostream>

using namespace std;

class CGrid
{
public:
   CGrid( int b1, int b2 )
   {
      lags_ = 14;
      numX_ = b1;
      numY_ = b2;
      num_close_wells_ = 10;
      grid_ = new float[numX_*numY_];
   }

   ~CGrid()
   {
      delete[] grid_;
   }

   float *operator[] ( size_t i ) { return &grid_[i*numY_]; }

   int getNumX() { return numX_; }
   int getNumY() { return numY_; }

private:
    float *grid_;
   int lags_, num_close_wells_;
   int numX_, numY_;
};

int main()
{
   cout << "Begining...\n";
   {
      CGrid gr( 20, 50 );
      for ( int i = 0; i < 20; ++i ) for ( int j = 0; j < 50; ++j )
         gr[i][j] = float( i ) / ( j + 1 );

      // ...

      for ( int i = 0; i < 20; ++i ) for ( int j = 0; j < 50; ++j )
         printf( "gr[%d][%d] = %f\n", i, j, gr[i][j] );
   }
   cout << "Complete!\n";
}


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс
Решил проблему. Дело было вот в чем. Объект класса CGrid создавался у меня в одной функции:
Код:
void COGView::OnExport()
{
    CGrid grid("plast.grd");
    DrawScene(grid);
}

И передавался в другую функцию: DrawScene, которую я объявил так:
Код:
void COGView::DrawScene(CGrid grid)
{
.....
}

А надо было объявить ее по-другому немного:
Код:
void COGView::DrawScene(CGrid &grid)
{
.....
}

Почему надо объекты класса передавать используя символ &?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman ну молодец, а говорил нет ничего, тут копирующий конструктор реализовывать надо, или покрайней мере объявить его в секции private и оставить пустым.
kexman писал(а):
Почему надо объекты класса передавать используя символ &?
Не обязательно, когда ты делаешь так void COGView::DrawScene(CGrid grid) у тебя создается с помощью конструктора копирования новый экземпляр класса CGrid, когда там void COGView::DrawScene(CGrid &grid) передаешь по ссылке, но дело в том, что передаватся тогда может только lvalue, так сделать нельзя DrawScene(CGrid(5, 6)) (хотя некоторые компиляторы позволяют такое зделать), а вот когда делаешь так void COGView::DrawScene(const CGrid &grid) то объект передается по константной ссылке, причем передаватся может также и rvalue, компилятор сам создаст временный объект, а затем он сам разрушится.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Но почему-то у меня все работало и без конструктора копирования, проблемы начались, когда я дабавил в деструктор удаление массива..


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman ну так, а поразмыслить? ;) Массив удалялся два раза, отсюда и баг.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
То есть адрес у этого массива в обоих копиях класса один и тот же?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Да, по этому в копирующем конструкторе и операторе копирующего присваивания ты должен выделить память под массив точно такой же размерности и скопировать информацию.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 24.07.2005
Откуда: Moscow
кстати, а в Си при инициализации двухмерного массива надо в программе сразу указывать его размер?

в институте задали написать прогу, которая будет складывать две матрицы MxN, но если дилну массива компилятор должен знать заранее, то я даже не знаю, как мне задание сделать


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Алканаффт Если просто прогу по сложению матриц написать, то просто задаёшь размеры массива с запасом и не мучаешся. Главное не выходить за пределы(проверки устраиваешь).


 

Member
Статус: Не в сети
Регистрация: 11.04.2004
Откуда: СПБ
Алканаффт писал(а):
Си при инициализации двухмерного массива надо в программе сразу указывать его размер

если не путаю - [20] [] допустимо, [] [] - нет ;
в твоем случае - взять с запасом.
Добавлено спустя 46 секунд
И вообще в нормальных заданиях должны быть указаны пределы M и N, а так же самих чисел...


 

Junior
Статус: Не в сети
Регистрация: 04.05.2006
Откуда: Чайковский.
Ребята помогите. как обменять значения полей двух соседних структур списка?

_________________
Никогда не говори никогда!


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
jeki к примеру так:
Код:
void swap(xxx* p1, xxx* p2){
     xxx *np1 = p1->next;
     xxx *np2 = p2->next;
     xxx  temp = *p1;
     (*p1) = (*p2);
     (*p2) = temp;
     p1->next = np1;
     p2->next = np2;
}

где xxx имя твоей структуры. Использовать примерно так:
Код:
swap(first,first->next);


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
Алканаффт
На стадии компиляции компилятору очень желательно знать размер массива, который мы будем создавать, чтобы правильно построить frame функции. Поэтому размер нужно передавать всегда. Дурое дело, что в С98 он по моему может быть динамическим (в случае выделения на стеке), что заменяет использвоание функции <<бр... какой-то из особых allocов, типа amalloc>>. Как ты это сделаешь - это твое дело. И кстати, помни, что изменять можно только элементы масива, но не сам массив.
kexman
Вопрос не просто. В зависимости от того, что ты делаешь. Передача по ссылки имеет смысл практически всегда, когда внутри функции ты не изменяешь объект.
В случае же передачи по значению, должен быть доступен конструктор копирования. Иначе ничего не получиться
Добавлено спустя 5 минут, 33 секунды
jeki mein я бы просто сделал так:
Код:
struct xxx{
     xxx *next;
     xxx *prev;
     keys;
};

void swap_n(xxx* f, xxx *s)
{
//  assert( f->next == s && f = s->prev);
     f->next = s->next;
     s->prev = f->prev;
     f->prev = s;
     s->next = f;
}

при этой обязательное требование о следовании элементов задано assert'ом
mein писать
void f(){
}
некрасиво

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
nickyoz так тоже можно. Но общий смысл наших функций всё же разный: моя для обычного(односвязного) списка и меняет элементы списка произвольного положения(необязательно соседние).

А по поводу скобок мне так удобнее. На массовом вложении выглядит достаточно красиво и понятно, а ещё, что очень важно(по крайней мере для меня) экономит место :) .


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
mein Ну. Смотря что хотим...
Ну просто во всех стилях, что я повидал (а их не мало) у функций скобочка ставиться на следю строке. А у всяких if и т.д. на текущей
Да и зачем место экономить

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 21 из 87<  1 ... 18  19  20  21  22  23  24 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan