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

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

Восстановить пароль Регистрация
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
27.08.2013, 10:31     Функция принимает ссылку на указатель. Куча ошибок #1
Как правильно передать аргумент в функцию? Уже все способы перепробовал)

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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2013, 10:31     Функция принимает ссылку на указатель. Куча ошибок
Посмотрите здесь:

Начал писать прогу чтобы текст передвигался по экрану, я что то написал но у меня ошибок куча, подскажите пожалуйстаа :) C++
C++ Функция принимает указатель на динамический массив и возвращает его же, но без чисел полиндромов (читается с обоих сторон одинаково - 234432)
C++ Функция - принять ссылку вернуть ссылку
C++ Изучаю классы объектов, ошибок куча, работаю над квадратами, выручайте
Отладка программы, куча ошибок C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
behemoth
 Аватар для behemoth
44 / 30 / 7
Регистрация: 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;
castaway
Эксперт С++
4836 / 2975 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
27.08.2013, 10:53     Функция принимает ссылку на указатель. Куча ошибок #3
А если так?
C++
1
ShowVectorInfo<int>( arrInt, 10 );
или
C++
1
ShowVectorInfo<int>( &arrInt[0], 10 );
BigLow
55 / 55 / 2
Регистрация: 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 *&"
castaway
Эксперт С++
4836 / 2975 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
27.08.2013, 11:12     Функция принимает ссылку на указатель. Куча ошибок #5
А так:
C++
1
ShowVectorInfo<char>( (const char *)&arrChar[0], 10 );
BigLow
55 / 55 / 2
Регистрация: 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 минуту
правда в этом случае она неправильно показывает размер массива
zer0mail
2176 / 1859 / 187
Регистрация: 03.07.2012
Сообщений: 6,615
Записей в блоге: 1
27.08.2013, 14:09     Функция принимает ссылку на указатель. Куча ошибок #7
Непонятно, зачем может понадобиться ссылка на указатель (чем она лучше "просто" указателя)?
BigLow
55 / 55 / 2
Регистрация: 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
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.08.2013, 16:16     Функция принимает ссылку на указатель. Куча ошибок #9
Цитата Сообщение от BigLow Посмотреть сообщение
вот небольшой пример есть
это пример UB.
new - delete
new[] - delete[]
это пары которые нельзя срекщивать
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
27.08.2013, 18:56  [ТС]     Функция принимает ссылку на указатель. Куча ошибок #10
Jupiter, я просто из-за невнимательности забыл поставить [] )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2013, 20:01     Функция принимает ссылку на указатель. Куча ошибок
Еще ссылки по теме:

C++ Вывести указатель - куча ошибок (недопустимое косвенное обращение, ...)
Куча непонятных ошибок C++
PlaySound и куча ошибок впридачу C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
27.08.2013, 20:01     Функция принимает ссылку на указатель. Куча ошибок
  #11

Не по теме:

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

Yandex
Объявления
27.08.2013, 20:01     Функция принимает ссылку на указатель. Куча ошибок
Ответ Создать тему
Опции темы

Текущее время: 22:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru