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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатели на первый элемент массива, новая переменная ? 
:(
    Опции темы
En_t_end
Дата 17.5.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как можно без ввода нового указателя на первый элемент массива вернуть(что-то типа дефолтной позиции) исходному указателю значение адреса первого элемента ?
Приведу пример:
Код

char test_m[X_DEFINED];
char *ptest = test_m;
char *ptmp = ptest; //очень неудобно... лишняя переменная
*ptest++ = 'T';
*ptest++ = 'E';
*ptest = '\0';
ptest = ptmp; // не спрашивайте зачем :-)
 
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 17.5.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Мм. 
Код

ptest = test_m;


Ну или более подробно:
Код

ptest = &test_m[0];

 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 17.5.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Mayk
А если я заюзываю указатель ptest в функции, а адресс массива передается как раз через ptest ? Как тогда ? не имея доступа к реальному массиву я ничего похоже сделать не могу.

Добавлено @ 15:17 
char *test_ret(char *result)
{//do smt...
*result++ = 's';
*result++ = 'e';
//....
*result = '\0';
return result; // и тут наблюдаем funny-тупость, если в cout << передается указатель, возвращаемый функцией :-)
}
Ессно можно выйти из ситуации, если ввести новый указатель, но ведь это дополнительная память и несколько тактов процессора - жалко smile 
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 17.5.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Если у тебя есть адрес массива то конечно только через новую переменную. А собственно как ещё ptest может узнать что массив начался/кончался?

Ну или сделай в конце ptest -= (кол-во увеличений); . хотя в таком случае будет Большой Ой, если это кол-во забудешь изменить.

Добавлено @ 15:23 
Цитата(En_t_end @  17.5.2006,  19:12 Найти цитируемый пост)
Ессно можно выйти из ситуации, если ввести новый указатель, но ведь это дополнительная память и несколько тактов процессора - жалко 

Ну ты блин нашёл о чем жалеть smile сделай тогда ф-цию void'ной и делай test_ret(arg); cout << arg вместо cout << test_ret(arg);

Добавлено @ 15:24 
Преждевременная оптимизация - корень всех зол 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 17.5.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Ну если совсем жаба душит, тогда делай так:
Код

char *test_ret(char *result)
{
   // do smt...
   result[0] = 's';
   result[1] = 'e';
   // ...
    return result;
}

Эта, канешна, значительно медленнее, чем твой код  smile  smile

Добавлено @ 18:32 
И еще одна гениальная мысль: если ты в result символы последовательно записываешь, можешь strcpy использовать... smile   

Это сообщение отредактировал(а) Earnest - 18.5.2006, 08:17


--------------------
...
PM   Вверх
SergeCpp
Дата 17.5.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


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

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



Я в таких случаях использую конструкцию вида

array[ index++ ] = value; 
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 17.5.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Earnest
"И еще одна гениальная мысль: если ты в result символы последовательно записываешь, можешь strcpy использовать..."
Неа... это я просто пример такой привел.
SergeCpp, "array[ index++ ] = value;"
:-).... ЗЫ это слиииишком жирно...

Добавлено @ 19:45 
Earnest
че-то меня в твоем коде операторы разыменования напрягают. 
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 17.5.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



En_t_end,  если тебе ну уж так важно быстродействие, то тебе надо идти к ассемблерщикам. 
Правда современные компиляторы хорошо оптимизируют. Поэтому не удивляйся, если твой АСМовский код будет работать медленнее твоего же с++ ного .  


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 18.5.2006, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(En_t_end @  17.5.2006,  20:44 Найти цитируемый пост)
че-то меня в твоем коде операторы разыменования напрягают.  

А это я из твоего кода скопировала, а убрать забыла...  smile  Поправила... 


--------------------
...
PM   Вверх
En_t_end
Дата 18.5.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Mayk, 
Цитата(Mayk @  17.5.2006,  23:57 Найти цитируемый пост)
если тебе ну уж так важно быстродействие, то тебе надо идти к ассемблерщикам. 

Мне и тут хорошо... smile
Цитата(Mayk @  17.5.2006,  23:57 Найти цитируемый пост)
Правда современные компиляторы хорошо оптимизируют.

Тут как раз проблема. Я постепенно иду к кроссплатформенности и соответственно приходиться юзать разные компиляторы. Если бы я юзал только Visual Studio, думаю, не стал бы даже и думать о такой примитивной(но хочу заметить от этого её эфективность не падает) оптимизации. Но приходиться заюзывать и старые борландовские компиляторы,g++, иногда просто g. А код, ведь, везде должен быть боеспособен.
 
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 18.5.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(En_t_end @  18.5.2006,  19:43 Найти цитируемый пост)
 Если бы я юзал только Visual Studio, думаю, не стал бы даже и думать о такой примитивной(но хочу заметить от этого её эфективность не падает) оптимизации. 

Кстати. А чем тебя не устривает новая переменная? Запись в неё и чтение из неё выполняются не медленнее, чем
*ptest++ = 'T';.
А выделятся и освобождаться она вообще может за нулевое время (какая разница как сдвинуть стек - на 4 байта, или на 8?).  

Это сообщение отредактировал(а) Mayk - 18.5.2006, 16:14


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 18.5.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Mayk, 
Цитата(Mayk @  18.5.2006,  20:13 Найти цитируемый пост)
А выделятся и освобождаться она вообще может за нулевое время (какая разница как сдвинуть стек - на 4 байта, или на 8?).  

 smile 
 
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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