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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одномерный массив строк произвольной длины, Или как я попал на пересдачу по проге... 
:(
    Опции темы
ТРЕТЬ
Дата 26.6.2006, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 8.1.2006
Где: mind's gloomy corner

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



Вот задача (не полный вариант, а именно, то на чем я погорел). Нужно создать одномерный массив строк произвольно длины, не более чем на 100 эл-тов (имеется ввиду что сами строки не ограничены по длине). Вот что далал я...
Код

char *string_array[101];

На сколько я понял, я этим задаю конструкцию "массив указателей на строки". Далее дописал нужные функции... Все реализованно через классы, ну да не важно... Запустил - ошибка (при чем не на уровне компиляции а во время выполнения)... При чем как-будто выход за предел массива. Проверил, не вылетает где-нибудь в программе счетчик за предела от 1 до 101. Вроде бы нет... Решил тогда вот такой тест провести.
Написал вот такую прожку.
Код

void main (void)
{
  char *string[101];
  string[0] = "hi";
  string[1] = "people";
  string[2] = "of the world";
  cout<<string[0]<<string[1]<<string[2];
  getch();
}

Сработало нормально... Решил все-такие еще проверить. Изменил код вот так.
Код

  string[0] = "hi";
  string[2] = "people";
  string[5] = "of the world";
  cout<<string[0]<<string[2]<<string[5];

Запускаю. И сразу ошибка! Такая же как в начале...
Тогда решил, что это мне Борланд свинью подкладывает (ВСРР 5.02). Смотрю, есть VC. Закинул туда код. С cout - ом почему-то не захотел работать, пришлось заменить на puts. И вот я с отвисающей челестью, смотрю, что программа работает, при чем обсолютно нормально!

Потом еще пытался переписать прогу в студии, но там, оказалось, нужные функции несколько изменены, а документацию кто-то снес... Перепробовал еще несколько вариантов... Ладно, не важно... Короче отправили меня на пересдачу...

Вот объясните мне пожалуйста, что я не так делал. Или это действительно ошибка компилятора? Может вы бы как-то по-другому решали бы эту задачу? Как? 
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 26.6.2006, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Вот объясните мне пожалуйста, что я не так делал

если насчет примеров, все они рабочие (g++ 4.1) 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


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

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



Ты б написал, какая ошибка выскакивала. 


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
maalan
Дата 26.6.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



воотще говоря, это массив указателей!
и следовательно память для хранения строк никакая не выделялась
хранятся только указатель на строки.
для правильной работы надо выделить память под строки с помощью NEW
но так как надо иметь строки произвольной длины, то я бы сделал так
std::vector<vector<string> >string_array(100);

ну и далее по тексту
  string[0] = "hi";
  string[1] = "people";
  string[2] = "of the world";
  cout<<string[0]<<string[1]<<string[2];
  getch(); 
PM MAIL   Вверх
ТРЕТЬ
Дата 26.6.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 8.1.2006
Где: mind's gloomy corner

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



SaDFromSpb
Я бы и нарписал... Да только я же не помню на память, а то что оно мне писало то в универе и соталось=).

На самом деле сейчас настолько гадостное ощущение на душе... Просто дома пишу скрипт (в той же ВСРР 5.02) работает... А там нет... Блин, и из-за этого мне в среду опять идти на экзамен... Оператива у них там паленая что ли? Ну не может же такого быть, чтобы написать одно и то же и в одном месте оно работает без проблемм, а в другом никак... Обидно...

Добавлено @ 16:35 
maalan
Спасибо... Вот сейчас проверил, вроде выполняется... И почему мне это тогда в голову не пришло? жаль=)

Да и все равно опять же, если и без этого дома работает, то это скорее на глюк тянет. чем на то что реальная ошибка=) 
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 26.6.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

воотще говоря, это массив указателей!
и следовательно память для хранения строк никакая не выделялась
хранятся только указатель на строки.

все тут выделилось (в сегменте константных данных) и адрес этих строк присвоился указателям на стеке 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Новичок



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

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



т.е. если написать
char * a;
a = "test";
то это нормально?

и если так написать
int *x;
*x = 100;
это тоже правильно? 

Это сообщение отредактировал(а) maalan - 27.6.2006, 08:18
PM MAIL   Вверх
kirjanov
Дата 27.6.2006, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

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



maalan
во 2 случае у тебя не инициализирован x, и 100 запишется, куда повезет. 
PM MAIL   Вверх
Fazil6
Дата 27.6.2006, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

т.е. если написать
char * a;
a = "test";
то это нормально?

ничего противозаконного
Цитата

и если так написать
int *x;
*x = 100;
это тоже правильно? 

это уже другой случай 
PM MAIL   Вверх
MAKCim
Дата 27.6.2006, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

во 2 случае у тебя не инициализирован x, и 100 запишется, куда повезет.  

в большинстве случаев вообще не запишется
а вылетит SEGMENTATION FAULT
Цитата

т.е. если написать
char * a;
a = "test";
то это нормально?

Цитата

Да, тип строкового литерала есть массив с надлежащим количеством символов
т. е "abc" принадлежит типу const char[4]. Строковый литерал можно присвоить переменной типа char*. Это разрешается поскольку в С типом строкового литерала был char*. Однако изменение строкового литерала через такой указатель является ошибкой.

Страуструп
 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Новичок



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

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



 smile 
то-то я так эти charы не перевариваю smile
сказывается небольшой опыт в чистом си
с++ мне все-таки больше нДравиться
да и stl тоже красота 
PM MAIL   Вверх
MAKCim
Дата 27.6.2006, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

с++ мне все-таки больше нДравиться
да и stl тоже красота  

В том то и смысл ООП: инкапсулировать реализацию и предоставить приятный интерфейс
а на нижнем уровне STL (реализация) также и с указателями и с памятью работает 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Новичок



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

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



Цитата

В том то и смысл ООП: инкапсулировать реализацию и предоставить приятный интерфейс
а на нижнем уровне STL (реализация) также и с указателями и с памятью работает 


абсолютно согласен
но до чего же все-таки не логично
оба указатели, а работают по-разному
если сам такое напишешь со своим классом и т.д., потом ошибку будешь долго искать 
PM MAIL   Вверх
MAKCim
Дата 27.6.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

но до чего же все-таки не логично

все логично (см. цитату) 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Новичок



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

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



Цитата(MAKCim @ 27.6.2006,  11:52)
все логично (см. цитату)

так в цитатах-то все логично, спору нетsmile
в поведении указателей нет логики
char не такой, как все остальные

и вообще, куда-то мы не туда в разговоре полезлиsmile на флейм похоже 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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