Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: передача значений массивов функциям в С++  (Прочитано 1449 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 4ivortep

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
Добрый день.
Нахожусь на начальной стадии познания с++.
Столкнулся с проблемой при изучении шаблонов функций. Пример программы компилируется с ошибкой.
Сам пример

Код: (c) [Выделить]
#include <iostream>

using namespace std;

template<class T, class T1> void show_array(T* array, T1 count)
{
T1 index;
for ( index = 0; index < count; index++ ) cout << array[index] << " ";
cout << endl;
}

void show_array(int *, int);
void show_array(float *, unsigned);

int main(void)
{
int pages[] = {100,200,300,400,500};
float prices[] = {10.05,20.10,30.15};
show_array(pages,5);
show_array(prices,3);
}

Ошибка при компиляции:

Код: (c) [Выделить]
/tmp/cc9OaMgj.o: In function `main':
show_tem_default.cpp:(.text+0x5c): undefined reference to `show_array(int*, int)'
collect2: выполнение ld завершилось с кодом возврата 1

если объявление функции

void show_array(int *, int);
заменить на

Код: (c) [Выделить]
void show_array(int, int);
то программа компилируется без ошибок и выводит нужный результат.
Также если переделать

Код: (c) [Выделить]
template<class T, class T1> void show_array(T* array, T1 count)
на
template<class T, class T1> void show_array(T array, T1 count)
а объявление функций сделать

Код: (c) [Выделить]
void show_array(int, int);
void show_array(float, unsigned);

программа снова компилируется без ошибок и выдает правильный результат.

Я не могу понять - при работе с массивами функция получает только указатель на сам массив, что и пишется в объявлении функции. А при таком объявлении передается только значение первого элемента в массиве.

Подскажите, как это все-таки работает?

 
« Последнее редактирование: 08 Марта 2013, 00:18:46 от yorik1984 »

Оффлайн takeneo

  • Любитель
  • *
  • Сообщений: 58
    • Просмотр профиля
Re: передача значений массивов функциям в g++
« Ответ #1 : 06 Марта 2013, 15:49:25 »
Сам плохо тоже знаю, даже не знал что можно передавать функциям в качестве аргументов массивы.
Но уже вижу одну ошибку что в теле функции int main() вы вызываете функции show_array и передаёте в качестве аргумента переменную(причём не обьявленную)(pages,prices) и константы,а не массив
show_array(pages,5);
show_array(prices,3);
« Последнее редактирование: 06 Марта 2013, 15:52:53 от takeneo »
asus m4a89gtd pro/usb3 AMD Phenom II X6 1090T Processor × 6, Asus Geforce gts450 ubuntu 12.10
Asus eeepc 1025ce Xubuntu 12.04.2

Шинш

  • Гость
Re: передача значений массивов функциям в g++
« Ответ #2 : 06 Марта 2013, 17:32:04 »
у вас есть 3 перегруза ф-и,

шаблонная,
int *, int        (неопр)
float *, unsigned (неопр)

причем работает, так, что если не подходит под функцию с конкретными параметрами (которые ф-и не определенны и не могут быть вызванны), то вызывается шаблонная.

(Нажмите, чтобы показать/скрыть)


в этом дело.
5 - по умолчанию значения типа int, и указатель pages так же на int, вызов ф-и будет void show_array(int *, int), на что и указывает

undefined reference to `show_array(int*, int)'

если закоментить строку, то вполне логично выходит:
5 по умолчанию у вас int, а не unsigned и вызов будет уже шаблонной, так же, если определить ф-ю то вызов будет именно ее.

Пользователь решил продолжить мысль 06 Марта 2013, 17:32:57:
и если не сложно, измените g++ на C++,
не в компиляторе дело...

и ф-я main возвращать должна значение.
« Последнее редактирование: 06 Марта 2013, 17:39:03 от Шинш »

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5740
  • Все по палатам!
    • Просмотр профиля
Re: передача значений массивов функциям в g++
« Ответ #3 : 06 Марта 2013, 18:35:23 »
Сухой остаток
(Нажмите, чтобы показать/скрыть)
Извините, я все еще учусь

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: передача значений массивов функциям в g++
« Ответ #4 : 07 Марта 2013, 10:38:35 »
Конечно 4ivortep неизвестно на кой чёрт написал прототипы функций. Хотел специализировать шаблоны? Хотя зная про специализацию шаблонов такие ляпы не делают =)

Шинш, прямо порадовал знанием матчасти.

Оффлайн 4ivortep

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
Re: передача значений массивов функциям в g++
« Ответ #5 : 08 Марта 2013, 00:08:41 »
Шинш спасибо.
Yurror читайте пожалуйста внимательно прежде чем под..уть. Я написал что изучаю с++ и это пример из книги http://programmersclub.ru/29/ .

Из этого примера я понял так, что сначала пишется шаблон потом объявляются функции с конкретным типом для самой функции и принимаемых ее данных и если уже в самой программе вызвать данную функцию с параметрами не того типа что указал в объявлении то шаблон не подвяжется и вывалится ошибка (как бы проверка типов). Короче ошибся.
 

   

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: передача значений массивов функциям в С++
« Ответ #6 : 10 Марта 2013, 09:29:52 »
4ivortep,
1) ты смелее расшифруй что хотел скрыть за точками или не бузи, новичок.
2) выкини к чертям свой учебник. там ахинея написана. купи что по современнее

#include <iostream.h>
void main(void)
это курам на смех

 

Страница сгенерирована за 0.019 секунд. Запросов: 22.