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

Поиск:

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


Шустрый
*


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

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



zim22, Читал, и не только Б.Кернигана, Д.Ритчи , и Шилдта читал, но всё равно непонятно , почему не работает .

Soah, а зачем мне сравнивать строки, по тому коду , что я привел выше, поидее должно в переменную темп выделяться памяти , как раз сколько сколько надо . Кстати потом дописал только что , пишу ещё temp = NULL;  , но всё равно не помогает , да и если я буду делать такую проверку, каким мне ещё способом перемещать по тому адресу содержимое p[i] , если не так как я сделал?
PM MAIL ICQ Skype   Вверх
Soah
Дата 4.7.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djezul @  4.7.2009,  22:39 Найти цитируемый пост)
а зачем мне сравнивать строки

а что же Вы сравниваете?

Цитата(djezul @  4.7.2009,  22:39 Найти цитируемый пост)
но всё равно не помогает

Цитата(Soah @  4.7.2009,  21:18 Найти цитируемый пост)
if ( p[i] < p[i+1] ){ // <- 1. выход за пределы массива

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


Шустрый
*


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

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



Soah, а всё врубился , спасибо , а то просто дебагер показывал вылет 3 строками ниже )))
Неа , не помогло , все равно вылет в этой строке показует 
Код

p[i] = new char[strlen(p[i + 1])+1];


Добавлено через 4 минуты и 46 секунд
Вот изменил код немного 
Код

void sort(){
    char *temp;
    for (int k = 0 ; k < N ; k++ ){
        for (int i = 0 ; i < N ; i++ )
            if ( strcmp( p[i] , p[i+1] ) > 0 ){
                temp = new char[strlen(p[i]) + 1];
                strcpy( temp , p[i] );
                delete[] p[i];
                p = NULL;
                p[i] = new char[strlen(p[i + 1])+1];
                strcpy( p[i] , p[i + 1] );
                delete[] p[i + 1];
                p[i + 1] = NULL;
                p[i + 1] = new char[strlen(temp)+1];
                strcpy( p[i + 1] , temp );
                delete[] temp;
                temp = NULL;
            }
    }
}


Это сообщение отредактировал(а) djezul - 4.7.2009, 23:02
PM MAIL ICQ Skype   Вверх
Soah
Дата 4.7.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djezul @  4.7.2009,  22:58 Найти цитируемый пост)
а всё врубился

Цитата(djezul @  4.7.2009,  22:58 Найти цитируемый пост)
Код

for (int i = 0 ; i < N ; i++ )

Если i = N-1, сколько будет i+1?
Правельно i+1 = N, p[N] - выход за пределы массива

Цитата(djezul @  4.7.2009,  22:58 Найти цитируемый пост)
 p = NULL;

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


Шустрый
*


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

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



Soah, 
Цитата(Soah @  4.7.2009,  23:18 Найти цитируемый пост)
Если i = N-1, сколько будет i+1?
Правельно i+1 = N, p[N] - выход за пределы массива

Немного не понял, это к какому месту кода? В сортировки такого нет(
PM MAIL ICQ Skype   Вверх
Soah
Дата 5.7.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



djezul, я уже устал цитировать этот код

Цитата(djezul @  4.7.2009,  22:58 Найти цитируемый пост)

for (int i = 0 ; i < N ; i++ )            
    if ( strcmp( p[i] , p[i+1] ) > 0 ){ // <- вот здесь


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


Шустрый
*


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

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



Soah, 
Цитата(Soah @  5.7.2009,  00:37 Найти цитируемый пост)
я уже устал цитировать этот код

Цитата(djezul @  4.7.2009,  22:58 Найти цитируемый пост)

for (int i = 0 ; i < N ; i++ )            
    if ( strcmp( p[i] , p[i+1] ) > 0 ){ // <- вот здесь


А что в нём не так ? Я исправил N на N + 1  ,  но ошибка не там возникает  , даже при написании N + 1 , ошибка вылетает тут 
Код

p[i] = new char[strlen(p[i + 1])+1];

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


Опытный
**


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

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



Цитата(djezul @  5.7.2009,  01:07 Найти цитируемый пост)
Я исправил N на N + 1

а почему так мало, давайте тогда уж N + 100

for (int i = 0 ; i < N ; i++ )
допустим N = 4
i = 0    i+1 = 1   -> p[0] и p[1]
i = 1    i+1 = 2   -> p[1] и p[2]
i = 2    i+1 = 3   -> p[2] и p[3]
i = 3    i+1 = 4   -> p[3] и p[4]

p[0]..p[4]  -> 5 элементов, но ведь N = 4
PM MAIL   Вверх
djezul
Дата 5.7.2009, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Soah @  5.7.2009,  01:15 Найти цитируемый пост)
а почему так мало, давайте тогда уж N + 100

Не понял смысла этой фразы.

Цитата(Soah @  5.7.2009,  01:15 Найти цитируемый пост)

for (int i = 0 ; i < N ; i++ )

допустим N = 4

У меня так уже
Код

for (int i = 0 ; i < N + 1; i++ )

У тогда все ваши расчёты будут верны.

Цитата(Soah @  5.7.2009,  01:15 Найти цитируемый пост)
i = 0    i+1 = 1   -> p[0] и p[1]
i = 1    i+1 = 2   -> p[1] и p[2]
i = 2    i+1 = 3   -> p[2] и p[3]
i = 3    i+1 = 4   -> p[3] и p[4]


и N будет равно 5.
PM MAIL ICQ Skype   Вверх
Soah
Дата 5.7.2009, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djezul @  5.7.2009,  01:41 Найти цитируемый пост)
for (int i = 0 ; i < N + 1; i++ )

можете обьяснить почему N+1?

Цитата(djezul @  5.7.2009,  01:41 Найти цитируемый пост)
и N будет равно 5.

но ведь изначально количество элементов 4.

Цитата(djezul @  5.7.2009,  01:41 Найти цитируемый пост)
тогда все ваши расчёты будут верны.

да?
N = 4
i < N +1  или i < 5
i = 0    i+1 = 1   -> p[0] и p[1]
i = 1    i+1 = 2   -> p[1] и p[2]
i = 2    i+1 = 3   -> p[2] и p[3]
i = 3    i+1 = 4   -> p[3] и p[4]
i = 4    i+1 = 5   -> p[4] и p[5]
p[0]..p[5]  -> 6 элементов, но ведь N = 4

смотрите, допустим у нас массив из 3 элементов, тогда
первый элемент сравниваем со вторым, второй с третьим -> два сравнения - две итерации

массив из 4 элементов, тогда
первый элемент сравниваем со вторым, второй с третьим,
третий с четвёртым -> три сравнения - три итерации
PM MAIL   Вверх
djezul
Дата 5.7.2009, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вы хотите сказать , что N нужно присваивать N - 1 , то есть так 
Код

for (int i = 0 ; i < N - 1; i++ )

Попробовал , та же ошибка в том же месте) 
PM MAIL ICQ Skype   Вверх
Soah
Дата 5.7.2009, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djezul @  5.7.2009,  02:08 Найти цитируемый пост)
Вы хотите сказать , что N нужно присваивать N - 1 , то есть так 

 smile 
но Вы хотя бы понимаете почему?

Цитата(djezul @  5.7.2009,  02:08 Найти цитируемый пост)
Попробовал , та же ошибка в том же месте) 

а я уже спрашивал
Цитата(djezul @  4.7.2009,  22:58 Найти цитируемый пост)

delete[] p[i];                
p = NULL;        // <- что делает эта строка?
p[i] = new char[strlen(p[i + 1])+1];


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


Шустрый
*


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

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



Цитата(Soah @  5.7.2009,  02:13 Найти цитируемый пост)
но Вы хотя бы понимаете почему?

Да , спасибо , что так долго и упорно вдалбливали мне в голову , а не просто сказали что исправить)) 
А насчёт NULL , так препод сказал делать , правда в другой задаче, приводит к типу void * , а тут я впихнул , уже будучи в растеряности ))))
Ещё раз спасибо)
PM MAIL ICQ Skype   Вверх
djezul
Дата 5.7.2009, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

void Delete(){
    int value;
    output();
    cout << "\n\nВведите номмер записи, которую необходимо удалить!\n\n\t>>> ";
    cin >> value;
    cout << "\n\n";
    char **q;
    q = new char*[N - 1];
    if ( value == 0 ){
        for ( int i = 1 ; i < N - 1 ; i++ ){
            q[i] = new char[strlen(p[i])+1];
            strcpy( q[i] , p[i] );
        }
    }else{
        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] );
        }
    }
    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];     //<<< Тут ошибка при 2 проходе
        strcpy( p[i] , q[i] );
    }
    for ( int i = 0 ; i < N ; i++ )    delete[] q[i];
    delete[] q;
}

Ну а здесь почему ошибка? smile  smile  smile  Ох уж эти указатели, всё им не так

Это сообщение отредактировал(а) djezul - 5.7.2009, 02:36
PM MAIL ICQ Skype   Вверх
Soah
Дата 5.7.2009, 21:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djezul @  5.7.2009,  02:35 Найти цитируемый пост)
Ну а здесь почему ошибка?

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

Код

// ...
q = new char*[N - 1]; // <-   N-1 элементов
// ...
for ( int i = 0 ; i < N ; i++ ){
    p[i] = new char[strlen(q[i]) + 1]; // <-   а тут уже обращаемся к N элементам
// ...



Цитата(djezul @  5.7.2009,  02:35 Найти цитируемый пост)
Ох уж эти указатели, всё им не так

указатели тут ни причём, надо правильно составлять алгоритмы и пользоваться отладчиком.

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

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

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

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

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


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

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


 




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


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

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