Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Пустая ссылка  (Прочитано 20773 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« : 27-05-2006 07:21 » 

Функция возвращает ссылку, а как возвратить сообщение об ошибке?
Вроде что то читал про пустые ссылки, а что и где вспомнить не могу...
« Последнее редактирование: 27-05-2006 18:46 от Arct » Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 27-05-2006 07:35 » new

В зависимости от языка программирования. В С++ константа пустой ссылки NULL. В Паскале nil.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #2 : 27-05-2006 18:45 » 

C++.
Это public функция шаблонного класса, тип ссылки неизвестен зарание.
NULL уже пробовал компилятор ругается:
 
Код:
Attempting to return a reference to a local object
Я так понял, что-то на тему того, что переменная временая и возращать её нельзя.
 Не понял
Код:
template <class T> const T & MyStack<T>::TOP() const
{
if(tos==257)
return mystack[256];
// if(tos==-1)
// return ;
return mystack[tos];
« Последнее редактирование: 27-05-2006 18:48 от Arct » Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 27-05-2006 19:23 » 

Arct, У тебя тут не совсем указатель. Я сейчас поэксперементировал у себя. С самой функции уходит указатель на внутрение переменные. Но затем преобразуется в значение переменной. Поэтому применять NULL некоректно. Надо найти другой способ, обозначить ошибочность данных.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 27-05-2006 19:35 » 

а если так - передавать ссылку внутрь функции
Код:

f(int& n)
{
  n=0;
}

main()
{
   int n;
   f(n);
   if(!n)
   {
   
   }  
}
« Последнее редактирование: 28-05-2006 16:16 от Алексей1153 » Записан

Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #5 : 28-05-2006 16:31 » 

А если сначала в привате класса объявить указатель и инициализировать
его NULL'ом, а потом его возвращать?
Код:
template<class T> class MyStack
{
             T *NPtr;
...
public:
             MyStack(){NPtr=NULL;}
             const T &TOP()const;
};
...
template <class T> const T & MyStack<T>::TOP() const
{
if(tos==257)
return mystack[256];
if(tos==-1)
return *NPtr;
return mystack[tos];
}
Вроде все нормально, но что-то мне не нравится.
Я где-то ошибся?
« Последнее редактирование: 19-12-2007 21:35 от Алексей1153++ » Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 28-05-2006 18:12 » 

Он тебе ошибку не выдает?
Ты пытаешся отдать значение по NULL ссылке. Должна выскочить ошибка доступа.
Раскажи, что в конечном счете ты хочеш получить. И как использовать данный метод? Тогда отсюда можно уже думать думу Улыбаюсь .
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #7 : 29-05-2006 01:48 » 

Простой стек, функция POP() возвращает указатель на верщину стека, но она должа что-то возвращать если стек пуст.Пока ничего умнее, чем перед вызовом проверять это отдельной функцией не придумал. Хотелось бы, чтоб без лишних вызовов. Здесь была моя ладья...
« Последнее редактирование: 29-05-2006 01:53 от Arct » Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 29-05-2006 08:09 » 

bool POP(mytype* pMT);
Записан

Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #9 : 29-05-2006 12:56 » 

Здесь была моя ладья...
Алексей1153
Цитата
bool POP(mytype* pMT);
Здесь была моя ладья...
Функция должна возвращать ссылку, не булеву переменную.
И причем здесь РОР()  Не понял
Функция TOP() НЕ извлекает элемента, а только ссылочку возвращает.
Или ты, чот-то другое подразумеваешь.
Поясни пожалуста.
« Последнее редактирование: 29-05-2006 13:09 от Arct » Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 29-05-2006 15:33 » 

Arct, ух блин.

в шаблонах я не силён, но какая тут разница:

Код:
bool POP(mytype* pMT)
{
   if(!stack_counter)return false;
   *pMT=stack[--stack_counter];
   return true;
}
 
 
main()
{
   //извлекаем
   mytype MT;
   if(POP(&MT))
   {
      //работаем с MT
   }
}

Записан

Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #11 : 29-05-2006 17:40 » 

Алексей1153
Цитата
Пока ничего умнее, чем перед вызовом проверять это отдельной функцией не придумал. Хотелось бы, чтоб без лишних вызовов.
Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 29-05-2006 17:50 » 

Arct, Улыбаюсь

а как без этого? Ты извлекаешь из стека элемент. Чтобы узнать, что стек пуст, ты УЖЕ должен что-то проверить. А тут у меня и нету отдельной функции...
И ты на калькуляторе собрался выполнять прогу что ли? проверить один байт на ноль долго?
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 29-05-2006 18:03 » 

Я могу предложить сделать так. Правда при моём вызове У тебя нельзя будет подцепить в паравоз вызовов.
Код:
template <class T> T * MyStack<T>::TOP() 
{
if(tos==257)
return &mystack[256];
if(tos==-1)
return NULL;
return &mystack[tos];
}
Возрат будет ссылка, а не значение. Тебе останется проверить ссылку на NULL.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #14 : 30-05-2006 01:16 » 

Пробовал, и как раз на
Цитата
return NULL;
компилятор и ругается.
А зачем адрес массива получать Не понял он же и так указатель или я опять торможу А черт его знает...
Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 30-05-2006 08:35 » 

Arct, а как он ругается?

попробуй так
return ((T *)NULL);
Записан

Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #16 : 30-05-2006 13:12 » 

Ругается
Код:
Error ..\111\STECK1.CPP 78: Attempting to return a reference to a local object
Попытка вернуть ссылку на местный объект, как я понял.
 Меня одолевают смутные сомнения
А правда у меня же тут ссылка, а не указатель.
Так...
Ссылке же нельзя присвоеть значение явно, так?
Значет всё таки
Код:
template<class T> class MyStack
{
             T *NPtr;
...
public:
             MyStack(){NPtr=NULL;}
             const T &TOP()const;
};
...
template <class T> const T & MyStack<T>::TOP() const
{
if(tos==257)
return mystack[256];
if(tos==-1)
return *NPtr;
return mystack[tos];
}
правильно?
Ушёл в цикл...(мозг) Здесь была моя ладья...
« Последнее редактирование: 30-05-2006 13:17 от Arct » Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 30-05-2006 14:45 » 

правильно, но долго Улыбаюсь

а чем указатели не устраивают??? это же быстрее и гибче
Записан

Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #18 : 31-05-2006 01:31 » 

Просто поступил по контексту...
Нужен стек - открыл справочник по С++ Шилдта, посмотрел в стандартной
библлиотеке шаблонов, а там это функция ссылку возврощает. Ну и начал
реализововать.
А в принцепе пофиг, главное понять откуда уши проблеммы торчат,
что и было достигнуто.
Всем спасибо.
« Последнее редактирование: 31-05-2006 01:36 от Arct » Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines