0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 14
1

Возврат указателя на константу из подпрограммы?

04.09.2012, 17:27. Показов 1792. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Это вообще можно сделать на TP? Реализовать функцию типа как на Си: const int* f();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2012, 17:27
Ответы с готовыми решениями:

В чём отличие константного указателя и указателя на константу?
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Возврат массива строк в константу через лямбду
Люди памагите, уже час туплю:) const char* arrow_icon = "-->"; struct { char operator()() { int...

Возврат указателя
Написать функцию возвращающую ссылку на элемент глобального массива. #include <stdio> #include...

Возврат указателя из функции
Почему функция vvod не возвращает указатель? #include"stdafx.h" #include "conio.h"...

13
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
04.09.2012, 18:07 2
Как вариант:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const
  N:integer=10;
 
type
  PInteger=^Integer;
 
function f:PInteger;
begin
  f:=@N;
end;
 
var
  a:PInteger;
begin
  a:=f;
  writeln(a^);
  readln;
end.
0
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 14
04.09.2012, 18:56  [ТС] 3
Это не вариант . Это типизированная константа, которая по сути переменная. В TP в отличие от Delphi ее вообще никак не сделать неизменяемой.
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
04.09.2012, 22:20 4
Ну тогда, боюсь без вариантов. Для константы даже не применить оператор @ - только для переменных, процедур/функций.
0
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 14
05.09.2012, 16:56  [ТС] 5
Пичалька...
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
05.09.2012, 18:10 6
Как вообще поставлена задача? Может ее получится по-другому реализовать.
0
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 14
05.09.2012, 18:55  [ТС] 7
Да, конечно, можно реализовать по-другому. Хотелось красиво сделать.
Суть в том, что есть данные, которые для чтения можно раздавать всем, а вот изменять их хотелось строго через интерфейс определенного класса. Копировать эти данные получается довольно дорого.
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
05.09.2012, 19:14 8
Не пойму, причем тут указатель на константу? Ведь сеттеры/геттеры никто не отменял.
0
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 14
05.09.2012, 19:26  [ТС] 9
Ну, хорошо. Я верну ссылку или указатель (это не важно) на данные. Я же могу их (умышлено или нечаяно) изменить произвольным образом в дальнейшем. А это не желательно. Изменять эти данные можно только через интерфейс определенного класса, там выполняется проверка.
Или я чего-то не догоняю в Турбо Паскале? Может конечно такое быть, для меня TP в новинку.
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
05.09.2012, 19:46 10
Лучше вернуть копию.

Добавлено через 9 минут
Цитата Сообщение от Чур Посмотреть сообщение
Я верну ссылку или указатель (это не важно) на данные. Я же могу их (умышлено или нечаяно) изменить произвольным образом в дальнейшем. А это не желательно.
Даже если вы вернете указатель/ссылку вы сможете изменить данные.
0
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 14
05.09.2012, 20:06  [ТС] 11
Цитата Сообщение от HighPredator Посмотреть сообщение
Даже если вы вернете указатель/ссылку вы сможете изменить данные.
Ну да. Это понятно.
Возвращать копию довольно дорого, обращения выполняются из разных процедур и не редко. Мне нужно было нечто подобное.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
PBuffer = ^TBuffer;
TBuffer = array[0..64] of Word;
 
{ Класс управляет данными. }
TCacheManager = object
private
  FBuffer: TBuffer;
public
  { Функция перед записью значения поверяет его корректность и еще что то... }
  function SetVal(val, idx: Word); Boolean
  function GetBuffer; PBuffer;
end;
 
{...}
 
var
  CacheManager: TCacheManager;
 
{...}
 
{ Использует данные. }
procedure MyProc;
var
  BufferPtr: PBuffer;
begin
  BufferPtr := CacheManager.GetBuffer
 
  {что то там делаем ...}
  
  { Вообще, мне нужно, чтоб я не мог здесь сделать так. }
  BufferPtr^[0] := 100;
  { А мог, если потребуется, только так. }
  CacheManager.SetVal(0, 100);
end;
Придется передавать не константу...
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
05.09.2012, 20:13 12
Если вам ну очень дорого все время возвращать копию данных. Тогда попробуйте сделать следующий трюк. Для объектного типа определите копию данных. Одну. Вроде такого:
Pascal
1
FBufferCopy:TBuffer;
И тогда вы сможете абсолютно спокойно выдавать указатели на эту область памяти без боязни что кто-то важные данные потрет. Только не забудьте в сеттере прокопировать вводимые туда данные.
1
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 14
05.09.2012, 20:26  [ТС] 13
Где их испортят не важно. Важно, что в дальнейшем они будут уже не корректны и это не проверить в подпрограммах, использующих эти данные. Просто результат будет не верный.
В общем все понятно.
Интересно, в Delphi такая же ситуация?
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
05.09.2012, 20:36 14
Да язык неважен. Работа с указателями есть работа с указателями. И тут никакой сишный const не спасет, если кто-то ковырять будет. Если вам так важно сохранить ваши данные в целостности, тогда еще кое-то могу предложить: заведите метод доступа по индексу, возвращающий копию одного числа. В таком случае изменить сами данные не получится, а читать можно будет не сложнее обхода массива.
0
05.09.2012, 20:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2012, 20:36
Помогаю со студенческими работами здесь

JNI, передача и возврат указателя
Все здрасьте. Использую JNI, хочу передавать между java и с++ указатель. Какой java-тип...

Возврат указателя на массив указателей
Доброго времени суток. Есть программа, где куча методов должны работать с одни массивом указателей....

Возврат указателя на локальный объект
Доброго дня! Заинтересовал процесс возврата указателя на локальный объек, а именно: char* fun() {...

Возврат указателя на локальный массив
Например ример: static unsigned char * func(...) { unsigned char d; memset(d, 'A',...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru