Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2010, 18:40   #11
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Знаете, я думал, что массивы переменной длины реализуемы только с помощью динамической памяти. Насколько я знаю, компилятор запрещает помещать в стек массивы в качестве размерности которого стоит неконстантное выражение.
MaTBeu вне форума Ответить с цитированием
Старый 21.01.2010, 18:54   #12
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Знаете, я думал, что массивы переменной длины реализуемы только с помощью динамической памяти. Насколько я знаю, компилятор запрещает помещать в стек массивы в качестве размерности которого стоит неконстантное выражение.
Для C89 и C++ это так, но в C99 ввели возможность создавать массив в стеке, размер которого получен во время выполнения
...
Вот пример, также из вывода видно, что массив находится в стеке
http://ideone.com/ZVU20IKJ

Последний раз редактировалось netrino; 21.01.2010 в 19:04.
netrino вне форума Ответить с цитированием
Старый 21.01.2010, 19:53   #13
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Так лучше не надо, если хотите этот эффект, то просто напишите, как я указал в комментариях
Код:
info[0] = '\0';
Это быстрее, и,имхо, нагляднее )
Ну а вообще не вижу смысла использовать strcat чтобы заполнить пока ещё пустую строку
Хорошо, спасибо! Сделаю, как говорите

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
В стандартах такого нет. А какой у вас компилятор?
Целевая архитектура: i486-linux-gnu
Модель многопоточности: posix
gcc версия 4.3.3 (Ubuntu 4.3.3-5ubuntu4)
abr_question вне форума Ответить с цитированием
Старый 21.01.2010, 21:29   #14
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Так лучше не надо, если хотите этот эффект, то просто напишите, как я указал в комментариях
Код:
info[0] = '\0';
Это быстрее, и,имхо, нагляднее )
Мэй би. Но когда я так обрезал строки, были проблемы с освобождением памяти.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 21.01.2010, 21:41   #15
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от nazavrik Посмотреть сообщение
Мэй би. Но когда я так обрезал строки, были проблемы с освобождением памяти.
В каких случаях? ) И какого рода проблемы? Очень странно ) Дело ведь в том, что строки в C это не то, чем кажется... Опять же, это не Паскаль, совершенно иной подход, потому даже чисто теоретически проблем подобные манипуляции вызывать не должны, тем более с освобождением памяти.
netrino вне форума Ответить с цитированием
Старый 21.01.2010, 21:51   #16
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию

С етими строчками можно моска лишится с непривычки
Что ему опять не нравится?

Код:
char *tciph(char *string)
{
	int i, len;
	char *res;
	char buf[64];

	strcpy(res, ""); //Ошибка
}

char *ciph(char *string, int len, int l)
{
	int i;
	char *result, *res, *buf;
	strcpy(result, ""); //Прекрасно работает

...
	strcpy(res, ""); //Прекрасно работает
...
}
Причём изменение первого res на допустим rest абсолютно ничего не решает. Де тараканы?
abr_question вне форума Ответить с цитированием
Старый 21.01.2010, 21:55   #17
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
В каких случаях? ) И какого рода проблемы? Очень странно ) Дело ведь в том, что строки в C это не то, чем кажется... Опять же, это не Паскаль, совершенно иной подход, потому даже чисто теоретически проблем подобные манипуляции вызывать не должны, тем более с освобождением памяти.
Я сейчас так не вспомню чем ругался компилятор. Вполне возможно, что из-за моего косяка, отрезал не то или не в том месте или еще что
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 21.01.2010, 21:57   #18
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от abr_question Посмотреть сообщение
С етими строчками можно моска лишится с непривычки
Что ему опять не нравится?

Код:
char *tciph(char *string)
{
	int i, len;
	char *res;
	char buf[64];

	strcpy(res, ""); //Ошибка
}

char *ciph(char *string, int len, int l)
{
	int i;
	char *result, *res, *buf;
	strcpy(result, ""); //Прекрасно работает

...
	strcpy(res, ""); //Прекрасно работает
...
}
Причём изменение первого res на допустим rest абсолютно ничего не решает. Де тараканы?
Ещё раз... строки в Си это абсолютно не то же самое, что строки в Паскале! Это не отдельный тип, не отдельная сущность, это совершенно обычный массив. Не более того. Ясное дело, что копировать что-то в массив, память для которого не выделена нельзя, потому оба случая ошибочны. Ну и снова про пустые строки... Есть ли в них смысл? Они будут размещены в отдельной секции данных в виде единственного символа - 0. Вызывая strcpy Вы просто копируете этот 0 в свой новосозданный массив,но это оверхед, вместо этого куда проще/эффективнее делать вот так:
Код:
char* string = (char*)malloc(100);
string[0] = '\0';
...
впрочем это уже мелочи, делайте как вам удобно, главное помните, что строки в Си это массив, точно такой же как массив, например, целых. Ни одна из библиотечных функций не будет сама увеличивать размер массива под свои нужды, за этим обязан следить программист

Последний раз редактировалось netrino; 21.01.2010 в 21:59.
netrino вне форума Ответить с цитированием
Старый 22.01.2010, 00:26   #19
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию

Звиняюсь, что ввёл сумятицу. Действительно, ни там, ни там не работало.
Что-то вроде начало получатся, но столкнулся с проблемой, что у меня в строках могут присутствовать нулевые символы, поетому надо будет продумать план работы с такими строками и переписать код.
Всем спасибо за помощ! Очень помогли!
abr_question вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как взять со строки неизвестной длины n первых символов? :) peq Microsoft Office Excel 2 07.01.2010 22:40
Считывание строки неограниченной длины (Си) 0kopok Помощь студентам 6 05.10.2009 20:46
Pascal - Задано число n неизвестной разрядности. Вычислить сколько цифр в этом числе Виолетта Помощь студентам 2 18.03.2009 07:17
Нахождение неизвестной Sam86 Microsoft Office Excel 5 16.09.2008 19:39