Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
#1

Указатель на пользовательский тип - C++

05.08.2010, 22:40. Просмотров 1735. Ответов 23
Метки нет (Все метки)

Чёто туплю, почему когда передаёшь переменную (например int) параметром через адрес в функцию (параметр - указатель на этот тип), то в теле этой функции для доступа к этой переменной приходится обращаться через указатель как через массив, причём работает только для [0] [1] [2], а дальше выдаёт ошибку. Вообще что значит это? Почему не 1 а 3 элемента и вообще как это так с точки зрения компилятора




p.s. название темы левое, случайно )))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2010, 22:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на пользовательский тип (C++):

Зачем нужен указатель на указатель при работе с однонаправленным списком? - C++
День добрый. Столкнулся с непониманием этой темы. В частности, совершенно непонятен алгоритм инициализации такого вот списка. Например:...

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны? - C++ Builder
Как проинициализировать массив строк wchar_t * (произвольного размера) , если его нужно передать в конструктор класса ? wchar_t *A1 =...

Как сделать пользовательский интерфейс в С++ builder6? - C++ Builder
Есть обычная консольная программа,работающая из командной строки.Хочу сделать простые окошки кнопки ,как это осуществить?Просто не разу не...

Пользовательский тип - Visual C++
Как задать пользовательский тип в С++? То есть аналог type

Пользовательский тип переменной с произвольной размерностью - Visual C++
Можно ли создать тип,переменные которого имеют,к примеру, разрядность 99 бит Например,если int - 32 бит,то нужно int99 бит По заданию...

Пользовательский PEN в MFC - Visual C++
Нужно нарисовать линию с пользовательскими характеристиками (редкие точки)ю Создаю pen c указанием что буду рисовать по образцу. Однако в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.08.2010, 22:57 #2
darkAngel, для присвоение указываемому объекту используй разыменовение (*) указателя:
C++
1
2
3
void foo(int* pvariable) {
  *pvariable = 5;
}
0
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
05.08.2010, 23:03  [ТС] #3
Не, не катит, я использую пользовательский тип
C++
1
2
typedef long int Tlong[2][1000];
Tlong d;
При разименование выдаётся ошибка записи.
Возможен доступ только так: d[0][i][j]
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.08.2010, 23:06 #4
darkAngel, еще бы не было ошибки.
C++
1
2
3
4
5
6
7
8
9
10
typedef long int LINT;
 
const int n = 2;
const int m = 1000;
 
LINT d[n][m];
 
void foo(LINT l[n][m]) {
  l[1][456] = 7;
}
0
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
05.08.2010, 23:26  [ТС] #5
НЕ, ну от чего ошибка?
Какой резон вообще тогда пользовательский тип делать здесь typedef long int LINT;
Мой тип Tlong означает не long int, а я его использую для представления длинного числа с дробной частью, аименно двумерный массив.
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.08.2010, 23:55 #6
darkAngel, я знаю, что означает твой тип, дак вот - не надо так извращатся.
Цитата Сообщение от darkAngel Посмотреть сообщение
НЕ, ну от чего ошибка?
Так пробовал:
C++
1
2
3
void foo(Tlong* l) {
  (*l)[2][4] = 6;
}
?

Добавлено через 24 минуты
darkAngel, кстати, указатель здесь не нужен.
C++
1
2
3
void foo(Tlong l) {
  l[2][4] = 6;
}
1
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
06.08.2010, 00:02 #7
CyBOSSeR, указатель не нужен-то, но, наверное, было бы эффективнее передавать по константной ссылке, не?..
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
06.08.2010, 00:09 #8
Demihalf, нет - двумерный массив будет передан как указатель на первый элемент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
const int n = 2;
const int m = 2;
 
void foo(int matrix[n][m]) {
  std::cout << *reinterpret_cast<int*>(matrix) << std::endl;
}
 
int main() {
  int matrix[n][m] = {
    {1, 2},
    {3, 4},
  };
 
  foo(matrix);
}
Результат: http://codepad.org/jcbGImyM
0
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
06.08.2010, 00:11 #9
CyBOSSeR, а, ну да, я подумал, что Tlong - класс
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
06.08.2010, 00:12 #10
Demihalf, не удивительно, я уже говорил ТС, что такое использование typedef - извращение.
0
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
06.08.2010, 00:18 #11
CyBOSSeR, я полагаю, это влияние Паскаля...
0
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
06.08.2010, 09:26  [ТС] #12
Demihalf, не удивительно, я уже говорил ТС, что такое использование typedef - извращение.
Я вообще этим пользую редко. Тогда для чего нужен пользовательский тип?

CyBOSSeR, я полагаю, это влияние Паскаля...
А Паскаль тут вообще причём?
0
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
06.08.2010, 10:49 #13
darkAngel, пользовательским типом обычно называют именованные класс, структуру, объединение, перечисление. А typedef в Си++ - чаще всего псевдоним для существующего типа. Например:

C++
1
2
int*(*funcp)(double, int); /* Указатель на функцию, принимающую double и int и возвращающую указатель на int. */
int* (*func(int a, int b))(double, int)  /* Прототип функции с именем func, принимающей 2 параметра int и вовращающей указатель на функцию, принимающую double и int и возвращающую указатель на int. */
Весело. А теперь, как это будет выглядеть при использовании typedef:

C++
1
2
3
4
5
typedef int*(*fptr)(double, int);  /* Объявление псевдонима типа "указатель на функцию  принимающую double и int и возвращающую указатель на int." */
 
fptr funcp; /* То же объявление указателя, что и в примере без typedef */
 
fptr func(int a, int b); /*Тот же прототип, что и в примере без typedef */
Чувствуете разницу?

Добавлено через 7 минут
А Паскаль вот причем:
Описание массива в Паскале. В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), и его объявление в программе выглядит следующим образом:
Pascal
1
Type < имя _ типа >= array [ I ] of T;
0
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
06.08.2010, 12:22  [ТС] #14
ну а чем хуже пример:
C++
1
2
typedef long int Tlong[2][1000];
Tlong d, c, b, a ,e;
и
C++
1
long int a[2][1000],d[2][1000],c[2][1000],b[2][1000],e[2][1000];
Добавлено через 29 секунд
я знаю паскаль.



Добавлено через 1 час 30 минут
Кстати не пойму, как теперь указатель сдлеать на тип Tlong
Так не катит:
Tlong *a = &d;
0
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
06.08.2010, 12:37 #15
darkAngel, вообще, Tlong - уже тип указателя. Имя массива указвает на его первый элемент. И у меня все вполне компилится.

C
1
2
3
4
5
6
7
8
9
10
11
  #include <stdio.h>
  
  typedef long int Tlong[2][1000];
 
  int main( void )
  { 
     Tlong a;
     Tlong *b = &a;  
  
   return 0;
  }
Только здесь уже получается тройной указатель...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2010, 12:37
Привет! Вот еще темы с ответами:

Указатель на указатель, в чем смысл? - C++ WinAPI
BOOL WTSEnumerateProcesses( _In_ HANDLE hServer, _In_ DWORD Reserved, _In_ DWORD Version, _Out_ PWTS_PROCESS_INFO...

Пользовательский тип - C (СИ)
Как создать пользовательский тип такой же как int только чтобы он вмещал 100-значное число? Мне бы направление куда думать, нужно чтобы...

Пользовательский тип данных - C#
Подскажите как реализовать что-то такое: MyClass a = new MyClass() a = 100; По сути мне нужно сделать что-то вроде типа данных в...

Пользовательский тип данных для C - C++
Помогите пожалуйста создать пользовательский тип данных для языка C, так как мне не хватает обычных....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.08.2010, 12:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru