4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80

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

22.08.2014, 23:39. Показов 2302. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2014, 23:39
Ответы с готовыми решениями:

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

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

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

7
Пес войны
 Аватар для NeonLost
111 / 88 / 22
Регистрация: 23.02.2012
Сообщений: 653
22.08.2014, 23:58
у тебя функция возвращает int, а не адрес...а еще бесполезный шаблон над функцией, если его удалить ничего не изменится
1
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
23.08.2014, 12:23
Цитата Сообщение от 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
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
23.08.2014, 12:34
Цитата Сообщение от 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 / 0
Регистрация: 22.08.2014
Сообщений: 80
25.08.2014, 20:17  [ТС]
У меня вроде массив строк, это разве не то же самое, что и массив указателей на char?

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

Цитата Сообщение от VergilYamato Посмотреть сообщение
Зачем ты подключаешь stdafx, и что там?
Это примочка от Visual Studio. В остальных компиляторах stdafx.h не нужен.
//Забыл убрать в коде первую строчку: #include "stdafx.h"
1
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
26.08.2014, 19:50
Цитата Сообщение от VergilYamato Посмотреть сообщение
У меня вроде массив строк
Цитата Сообщение от VergilYamato Посмотреть сообщение
C++
1
char* ar
Параметр char* ar, это то же самое, что char[], массив char. Этот массив содержит только одну строку.
0
 Аватар для orange_fox
34 / 34 / 8
Регистрация: 06.04.2014
Сообщений: 189
27.08.2014, 17:38
Что непонятно - спрашивай:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.08.2014, 17:38
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru