Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
1

Функция принимает ссылку на указатель. Куча ошибок

27.08.2013, 10:31. Показов 2050. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как правильно передать аргумент в функцию? Уже все способы перепробовал)

C++
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
#include <iostream>
 
template<typename T>
void ShowVectorInfo(const T *&vector, size_t size)
{
    std::cout << "sizeof(vector) = " << sizeof(vector) << std::endl;
    std::cout << "size = " << size << std::endl << std::endl;
}
 
 
int main()
{
 
    char    arrChar[10] = {};
    int     arrInt[10] = {};
    double  arrDouble[10] = {};
    
    ShowVectorInfo(&arrChar, 10);       // error C2664: ShowVectorInfo: невозможно преобразовать параметр 1 из "char (*)[10]" в "const char (*&)[10]"
    ShowVectorInfo(arrInt, 10);     // error C2784: void ShowVectorInfo(const T *&,size_t): не удалось вывести аргумент шаблон для "const T *&" из "int [10]"
    ShowVectorInfo(&arrDouble[0], 10);   // error C2664: ShowVectorInfo: невозможно преобразовать параметр 1 из "double *" в "const double *&"
 
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2013, 10:31
Ответы с готовыми решениями:

Вывести указатель - куча ошибок (недопустимое косвенное обращение, ...)
Простите, туплю жестоко. Два месяца не трогал студию, забыл все конкретно. int peremennaya=5461;...

Функция принимает указатель на void и возвращает указатель на int
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Функция принимает указатель на динамический массив и возвращает его же, но без чисел полиндромов (читается с обоих сторон одинаково - 234432)
Вот мое решение, подскажите, пожалуйста, что изменить, чтобы заработала программа: # include...

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения...

10
44 / 30 / 18
Регистрация: 29.09.2012
Сообщений: 75
Записей в блоге: 1
27.08.2013, 10:48 2
C++
1
void ShowVectorInfo(const T &vector, size_t size)
вот так и у меня все работает
+
C++
1
2
3
ShowVectorInfo(arrChar, 10);
ShowVectorInfo(arrInt, 10);
ShowVectorInfo(arrDouble, 10);
Добавлено через 14 минут
как вы уже заметили, наверное, sizeof выводит фиговый размер, поэтому можна вот так сделать:
1.
C++
1
std::cout << "size of array = " << sizeof(vector)/sizeof(vector[0])<< std::endl;
или
2.
C++
1
2
3
template<size_t SIZE, class T> inline size_t array_size(T (&arr)[SIZE]) {
    return SIZE;
}
вызов:
C++
1
std::cout << "size of array = " << array_size(vector)<< std::endl;
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.08.2013, 10:53 3
А если так?
C++
1
ShowVectorInfo<int>( arrInt, 10 );
или
C++
1
ShowVectorInfo<int>( &arrInt[0], 10 );
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
27.08.2013, 11:00  [ТС] 4
Цитата Сообщение от behemoth Посмотреть сообщение
как вы уже заметили, наверное, sizeof выводит фиговый размер,
не все правильно выводит, показывает размер всего массива в байтах

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T>
void ShowVectorInfo(const T &vector, size_t size)
{
    std::cout << "sizeof(vector) = " << sizeof(vector) << std::endl;
    std::cout << "size = " << size << std::endl << std::endl;
}
 
int main()
{
    char    arrChar[10] = {};
    int     arrInt[10] = {};
    double  arrDouble[10] = {};
    
    ShowVectorInfo(arrChar, 10);
    ShowVectorInfo(arrInt, 10);
    ShowVectorInfo(arrDouble, 10);
благодарю за помощь. мне как раз надо было это, чтобы в в функции можно было узнать размер всего массива

Добавлено через 4 минуты
Цитата Сообщение от castaway Посмотреть сообщение
А если так?
ошибки почему то

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T>
void ShowVectorInfo(const T *&vector, size_t size)
{
    std::cout << "sizeof(vector) = " << sizeof(vector) << std::endl;
    std::cout << "size = " << size << std::endl << std::endl;
}
 
int main()
{
    char    arrChar[10] = {};
    int     arrInt[10] = {};
    double  arrDouble[10] = {};
    
    ShowVectorInfo<char>(&arrChar[0], 10);      // error C2664: ShowVectorInfo: невозможно преобразовать параметр 1 из "char *" в "const char *&"
    ShowVectorInfo<int>(arrInt, 10);                // error C2664: ShowVectorInfo: невозможно преобразовать параметр 1 из "int [10]" в "const int *&"
    ShowVectorInfo<double>(arrDouble, 10);      // error C2664: ShowVectorInfo: невозможно преобразовать параметр 1 из "double [10]" в "const double *&"
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.08.2013, 11:12 5
А так:
C++
1
ShowVectorInfo<char>( (const char *)&arrChar[0], 10 );
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
27.08.2013, 14:01  [ТС] 6
castaway, опять неправильно

но я уже понял как надо делать

если есть вот такой прототип функции (т.е. один аргумент это ссылка на указатель):
C++
1
2
template<typename T>
void ShowVectorInfo(T *&vector, size_t size);
то вызвать ее можно только с динамическим массивом
C++
1
2
3
int     *p = new int[10]();
    
ShowVectorInfo(p, 10);
а со статическим не получится

Добавлено через 1 минуту
правда в этом случае она неправильно показывает размер массива
0
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
27.08.2013, 14:09 7
Непонятно, зачем может понадобиться ссылка на указатель (чем она лучше "просто" указателя)?
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
27.08.2013, 14:31  [ТС] 8
zer0mail, вот небольшой пример есть. Правда к этой теме он не имеет никакого отношения

в первом случае функция принимает ссылку на указатель, освобождает память и устанавливает указатель в NULL. В main() он тоже будет NULL

а во втором случае функция принимает просто указатель, делает то же самое, но сам указатель в main() не изменяется


C++
1
2
3
4
5
6
7
8
9
10
11
12
void F(int *&p)
{
    delete p;
    p = NULL;
}
 
int main()
{
    int     *p = new int[10]();
    F(p);
    std::cout << p << std::endl;    // 00000000
}



C++
1
2
3
4
5
6
7
8
9
10
11
12
void F(int *p)
{
    delete p;
    p = NULL;
}
 
int main()
{
    int     *p = new int[10]();
    F(p);
    std::cout << p << std::endl;    // 00344F00
}
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.08.2013, 16:16 9
Цитата Сообщение от BigLow Посмотреть сообщение
вот небольшой пример есть
это пример UB.
new - delete
new[] - delete[]
это пары которые нельзя срекщивать
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
27.08.2013, 18:56  [ТС] 10
Jupiter, я просто из-за невнимательности забыл поставить [] )
0
Jupiter
27.08.2013, 20:01     Функция принимает ссылку на указатель. Куча ошибок
  #11

Не по теме:

Цитата Сообщение от BigLow Посмотреть сообщение
я просто из-за невнимательности забыл поставить [] )
да мы так и поняли,
На C# возможно написать такую программу, чтобы можно было просматривать закрытые профили в одноклассниках и фотографии?
куда уж тут о скобочках думать:jokingly:

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2013, 20:01

Функция find принимает вектор и число, которое ищется и возвращает указатель на найденное число
здравствуйте. подскажите есть вот такая задача //Написать ф-цию find, которая принимает вектор и...

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){};...

Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив.
Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. Условие:Реализовать 3 функции,...

Куча непонятных ошибок
Вот код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; int main() { ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru