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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про 2 мерные указатели 
:(
    Опции темы
djezul
Дата 6.7.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Soah @  5.7.2009,  21:50 Найти цитируемый пост)
// ...
q = new char*[N - 1]; // <-   N-1 элементов
// ...
for ( int i = 0 ; i < N ; i++ ){
    p[i] = new char[strlen(q[i]) + 1]; // <-   а тут уже обращаемся к N элементам
// ...

А как насчёт этой строки немного выше 
Код

N = N - 1;


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


Опытный
**


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

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



Цитата(djezul @  6.7.2009,  08:49 Найти цитируемый пост)
А как насчёт этой строки немного выше 

не заметил

Цитата(djezul @  5.7.2009,  02:35 Найти цитируемый пост)

Код

for ( int i = 0 ; i < N - 1 ; i++ ){            
    if ( i == value ) continue;             
    q[i] = new char[strlen(p[i])+1];    // <- для q[value] память не выделяется
    strcpy( q[i] , p[i] );                            
}



Цитата(djezul @  5.7.2009,  02:35 Найти цитируемый пост)
 
Код

for ( int i = 0 ; i < N ; i++ ){        
    p[i] = new char[strlen(q[i]) + 1];   // <- когда i = value куда указывает q[i]?
    strcpy( p[i] , q[i] );    
}



djezul, 
Цитата(Soah @  5.7.2009,  21:50 Найти цитируемый пост)
надо правильно составлять алгоритмы и пользоваться отладчиком.


PM MAIL   Вверх
djezul
Дата 6.7.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Soah, я уже заменил код на такой 
Код

void Delete(){
    int value;
    stop:
    output();
    cout << "\n\nВведите номмер записи, которую необходимо удалить!\n\n\t>>> ";
    cin >> value;
    value = value - 1;
    if ( value > N - 1 ) {
        system("cls");
        goto stop;
    }
    cout << "\n\n";
    char **q;
    q = new char*[N - 1];
    for ( int i = 0 , k = 0 ; i < N - 1 ; i++ ){
        if ( i != value ){    
            q[k] = new char[strlen(p[i])+1];
            strcpy( q[k] , p[i] );
            k++;
        }
    }
    for ( int i = 0 ; i < N ; i++ )    delete[] p[i];
    delete[] p;
    N = N - 1;
    p = new char*[N];
    for ( int i = 0 ; i < N ; i++ ){
            p[i] = new char[strlen(q[i]) + 1];    
            strcpy( p[i] , q[i] );
    }
    for ( int i = 0 ; i < N ; i++ )    delete[] q[i];
    delete[] q;
}


Цитата(Soah @  6.7.2009,  12:10 Найти цитируемый пост)
надо правильно составлять алгоритмы и пользоваться отладчиком.

Насчёт правильного составления, тут и опыт играет роль, согласитесь . А отладчиком я пользуюсь , и пошаговой отладкой, уже раз 20 прошёл.
Я не понимаю , почему q равно N поидее а не N - 1 . Причём такой момент , если я удаляю последний элемент, всё удаляется, а если не последний , то ошибка в этой строке , p[i] = new char[strlen(q[i]) + 1];    

Цитата(Soah @  6.7.2009,  12:10 Найти цитируемый пост)
// <- когда i = value куда указывает q[i]?

Вот именно , почему возникает вопрос? Ведб в 1 цикле, должно пропускаться . При этом если я делаю так
Код

    for ( int i = 0 ; i < N ; i++ ){
                if ( i != value ){ 
            p[i] = new char[strlen(q[i]) + 1];    
            strcpy( p[i] , q[i] );
                }
    }

То ошибка возникает тут - for ( int i = 0 ; i < N ; i++ )    delete[] q[i];

PM MAIL ICQ Skype   Вверх
Soah
Дата 6.7.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djezul @  6.7.2009,  13:00 Найти цитируемый пост)
Вот именно , почему возникает вопрос?

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

допустим
p[0] -> "123"
p[1] -> "456"
p[2] -> "789"
p[3] -> "000"

value = 1

Цитата(djezul @  6.7.2009,  13:00 Найти цитируемый пост)

Код

for ( int i = 0 ; i < N - 1 ; i++ ){            
    if ( i == value ) continue;             
    q[i] = new char[strlen(p[i])+1];  
    strcpy( q[i] , p[i] );                            

}


после этого кода
q[0] -> "123"
q[1] -> ???
q[2] -> "789"
как Вы думаете это правильно?


Цитата(djezul @  6.7.2009,  13:00 Найти цитируемый пост)
я уже заменил код на такой 

вроде бы алгоритм правильный, сейчас времени проверить нет, только Вы делаете лишнюю работу
Цитата(djezul @  6.7.2009,  13:00 Найти цитируемый пост)

Код

p = new char*[N];   
for ( int i = 0 ; i < N ; i++ ){           
    p[i] = new char[strlen(q[i]) + 1];                
    strcpy( p[i] , q[i] );    
}    
for ( int i = 0 ; i < N ; i++ )   
    delete[] q[i];    
delete[] q;


зачем создавать копию массива q, если можно присвоить p указатель на ту память которая уже есть
Код

p = q;

PM MAIL   Вверх
djezul
Дата 6.7.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Soah @  6.7.2009,  13:23 Найти цитируемый пост)
зачем создавать копию массива q, если можно присвоить p указатель на ту память которая уже есть

Да, но если я удалю q , то и p , больше не будет , правильно? А мне нужно , чтобы p остался, правда без удалённого элемента) 
PM MAIL ICQ Skype   Вверх
Soah
Дата 6.7.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djezul @  6.7.2009,  13:32 Найти цитируемый пост)
Да, но если я удалю q , то и p , больше не будет , правильно?


а зачем удалять q?

смотрите, 
p ->(указывает) на массив  p[0]..p[3]
p[0] -> "123"
p[1] -> "456"
p[2] -> "789"
p[3] -> "000"

value = 1

формируем q
q[0] -> "123"
q[1] -> "789"
q[2] -> "000"

удаляем память под строки p[0]..p[4] и массив p

p = q, означает что p будет указывать туда где и q, то есть на массив строк("123", "789", "000")

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


Шустрый
*


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

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



Цитата(Soah @  6.7.2009,  13:45 Найти цитируемый пост)
а зачем удалять q?

Но ведь при 2 вызове функции , разве q сформируется правильно , если не отчистить занимаемою им память?
Ведь возможно у меня будет 
p[0] -> "123"
p[1] -> "456"
p[2] -> "789"
p[3] -> "000"

Я удалю , останется 
q[0] -> "123"
q[1] -> "789"
q[2] -> "000"

Я захочу добавить ещё 2 
q[0] -> "123"
q[1] -> "789"
q[2] -> "000"
q[3] -> "541"
q[4] -> "000"

И снова захочу удалить 5 элемент , но ведб в таком случае , функция правильно не отработает ? Или я что то не так понимаю?
PM MAIL ICQ Skype   Вверх
Soah
Дата 6.7.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djezul @  6.7.2009,  13:51 Найти цитируемый пост)
функция правильно не отработает ?


Цитата(djezul @  6.7.2009,  13:00 Найти цитируемый пост)

// ...
q = new char*[N - 1];    
for ( int i = 0 , k = 0 ; i < N - 1 ; i++ ){  // <- почему N-1?      
if ( i != value ){ 
// ...

мы ведь перебираем все элементы(N), а не все кроме последнего(N-1) smile 
PM MAIL   Вверх
djezul
Дата 6.7.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Soah @  6.7.2009,  13:57 Найти цитируемый пост)
мы ведь перебираем все элементы(N), а не все кроме последнего(N-1) smile  

эх.... точно, ведь исправлял эту ошибку, но тогда была ошибка в 1 цикле. Но когда не помогло наверное сделал откат , и эта ошибка снова осталась. Спасибо за помощь.
PM MAIL ICQ Skype   Вверх
ller
Дата 14.7.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вопрос по теме. Не буду новую заводить.
Есть некоторый класс
Код

class Matrix
{
private:
    double **matrix;
public:
   Matrix(int x=0,int y=0); // Конструктор выделяет память...
   double operator[][](int i,int j) // Такой оператор как можно сделать?
   ~Matrix();
}


Я понимаю, что так делать нельзя, но есть какие то пути как сделать указание элемента в виде масива n-мерного.

Один из вариантов как я вижу, это использовать
Код

vector<vector<double>> matrix;


Но хочется сделать велосипед, в качестве получения опыта smile

Это сообщение отредактировал(а) ller - 14.7.2009, 21:32
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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