Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
4 / 3 / 1
Регистрация: 22.08.2014
Сообщений: 80
1

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей

22.08.2014, 23:39. Просмотров 1511. Ответов 7
Метки нет (Все метки)

Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес наибольшей строки (Стивен Прата - "Язык программирования с++", 8 глава, часть 6 задания).
Судя по выводу, функция возвращает не адрес, а саму строку. Почему не работает и как сделать правильно?

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
26
#include<iostream>
#include<cstring>
 
template<typename T> 
int maxn (const char* ar,int n)
{
 
    char max_elem[10];
    int address;
 
    strcpy(max_elem,ar[0]);
 
    for(int i=1;i<n;i++)
        if ( strcmp(ar[i],max_elem)<=0 ) address=i;
        
return &ar[address];
}
 
int main()
{
    int n=4;
    const char* ar3[]={"max","djfk","jsjs","sgad"};
 
    std::cout << "& max of ar3 = " << maxn(ar3,n) << ", 1 elem of max in ar3 is " << *(maxn(ar3,n)) << "\n";
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2014, 23:39
Ответы с готовыми решениями:

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...

Различия указателей char* от указателей других типов
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что...

Шаблон, специализация: поиск самой большой строки в массиве указателей на char
Есть почти готовое решение,помогите пожалуйста доделать,немного не понимаю #include &lt;cstdlib&gt;...

7
Пес войны
111 / 88 / 22
Регистрация: 23.02.2012
Сообщений: 653
22.08.2014, 23:58 2
у тебя функция возвращает int, а не адрес...а еще бесполезный шаблон над функцией, если его удалить ничего не изменится
1
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
23.08.2014, 12:23 3
Цитата Сообщение от VergilYamato Посмотреть сообщение
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес наибольшей строки (Стивен Прата - "Язык программирования с++", 8 глава, часть 6 задания).
В общем виде так:
Кликните здесь для просмотра всего текста
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
26
27
28
29
30
31
32
33
#include "stdafx.h"
 
#include <iostream>
#include <assert.h>
 
template<typename T, int N>                         // <<<---- задаём тип и размер массива
const T* findLongestString(const T*(& _strs)[N])    // <<<---- принимаем массив по ссылке
{
    size_t maxLength = 0;
    const T* maxStr = NULL;
    for (size_t i = 0; i < N; ++i)                  // <<<---- перебираем все строки
    {
        const T* curStr = _strs[i];
        size_t curLength = 0;
        while (curStr[curLength] != 0)
            ++curLength;
        if (maxLength < curLength)                  // <<<---- находим самую длинную строку
        {
            maxLength = curLength;
            maxStr = curStr;
        }
    }
    assert(maxStr != NULL);                         // <<<---- на всякий случай проверяем результат
    //std::cout << maxLength << std::endl;
    return maxStr;
}
 
int main()
{
    const char* strs[] = { "0", "11", "222", "3333", "end" };
    std::cout << "longest string is: " << findLongestString(strs) << "." << std::endl;
    return 0;
}
1
1127 / 786 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
23.08.2014, 12:34 4
Цитата Сообщение от VergilYamato Посмотреть сообщение
Почему не работает
Цитата Сообщение от VergilYamato Посмотреть сообщение
функции, принимающей массив указателей на char
Параметр - массив указателей на char.
C++
1
2
 ... F ( char* ar[], ... );
 ... F2 ( char** ar, ... );
Здесь параметр - массив char.
C++
1
2
 ... G ( char*ar, ... );
 ... G2 ( char ar[], ... ); //  char* ar  эквивалентно  char ar[]
1
4 / 3 / 1
Регистрация: 22.08.2014
Сообщений: 80
25.08.2014, 20:17  [ТС] 5
У меня вроде массив строк, это разве не то же самое, что и массив указателей на char?

Добавлено через 1 минуту
Зачем ты подключаешь stdafx, и что там?
0
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
26.08.2014, 09:32 6
Цитата Сообщение от VergilYamato Посмотреть сообщение
У меня вроде массив строк, это разве не то же самое, что и массив указателей на char?
Не одно и тоже.
Массив сохраняет количество элементов, а указатель теряет размерность массива.

Цитата Сообщение от VergilYamato Посмотреть сообщение
Зачем ты подключаешь stdafx, и что там?
Это примочка от Visual Studio. В остальных компиляторах stdafx.h не нужен.
//Забыл убрать в коде первую строчку: #include "stdafx.h"
1
1127 / 786 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
26.08.2014, 19:50 7
Цитата Сообщение от VergilYamato Посмотреть сообщение
У меня вроде массив строк
Цитата Сообщение от VergilYamato Посмотреть сообщение
C++
1
char* ar
Параметр char* ar, это то же самое, что char[], массив char. Этот массив содержит только одну строку.
0
34 / 34 / 8
Регистрация: 06.04.2014
Сообщений: 189
27.08.2014, 17:38 8
Что непонятно - спрашивай:
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
26
27
28
#include <iostream>
#include <cstring>
 
using namespace std;
 
char* longestCSTR(char* cstrArray[], size_t cstrCount)
{
    size_t longestIndex = 0;
    for (size_t i = 1; i < cstrCount; ++i)
    {
        if (strlen(cstrArray[i]) > strlen(cstrArray[longestIndex]))
            longestIndex = i;
    }
    return cstrArray[longestIndex];
}
 
int main()
{
    char* Array[] = { 
        "Hello, world!",
        "lorem ipsum dolor sit amet",
        "42",
        "you are null and void",
        "" 
    };
    cout << longestCSTR(Array, 5) << endl;
    cin.get();
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2014, 17:38

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Различные функции, для которых можно создать массив указателей на функции
Придумайте не менее 3-х различных функций, для которых можно создать массив указателей на функции.

Создать массив заданной размерности с помощью функции и указателей
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void z(int *p){ int a; ...

Виртуальные функции (создать массив указателей на объекты трех классов)
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты,...


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

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

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