Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
viramir
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
1

Причина неудобной реализации функций

15.02.2018, 10:54. Просмотров 246. Ответов 11
Метки нет (Все метки)

Почему к примеру нельзя писать так
C++
1
char* cd=GetCurrentDirectory();
А надо обязательно так
C++
1
2
char cd [100];
GetCurrentDirectory(sizeof(cd),cd);
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2018, 10:54
Ответы с готовыми решениями:

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

Перегрузка функций для реализации алгоритмов сортировки
Помогите пожалуйста с заданием. Массив данных заполнять случайным образом. рассмотреть массивы...

Отделить описание шаблонных функций и классов от реализации
скажите можно ли как то все таки отделить описание шабонных функций и классов от реализации? уж...

Использовать перегрузку функций для реализации алгоритмов сортировки
Массив данных заполнять случайным образом. Рассмотреть массивы данных из элементов типа long и...

11
jahdjkhasjdhjah
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
15.02.2018, 11:10 2
Так реализован язык. Так придумали люди. Вы можете придумать свою реализацию и назвать ее, скажем С*=
И напихать туда все свои хотелки.

А вообще, по существу вопроса, думаю, что это сделано для того, чтобы отделить зерна от плевел. Чтобы было видно, где у нас выделяется память (эдакий этап подготовки к основной работе), а где идет чисто машинный код. В некотором роде это помогает читать и поддерживать чужой код.
0
HighPredator
5965 / 2092 / 736
Регистрация: 10.12.2010
Сообщений: 5,914
Записей в блоге: 3
15.02.2018, 11:14 3
Освойте работу со строками, понятнее станет.
0
Mirmik
techpriest
631 / 210 / 57
Регистрация: 27.02.2014
Сообщений: 1,168
15.02.2018, 11:19 4
viramir
Если кратко, причина в том, что модель памяти языков си и с++ не позволяет возвращать из функций объекты неопределенного размера.
0
viramir
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
15.02.2018, 11:20  [ТС] 5
Цитата Сообщение от Mirmik Посмотреть сообщение
viramir
Если кратко, причина в том, что модель памяти языков си и с++ не позволяет возвращать из функций объекты неопределенного размера.
а ведь например getenv может а GetEnvironmentVariable нет
0
Mirmik
techpriest
631 / 210 / 57
Регистрация: 27.02.2014
Сообщений: 1,168
15.02.2018, 11:30 6
Теоретически, такой синтаксис:
C++
1
char* cd=GetCurrentDirectory();
возможен, но это значило бы, что GetCurrentDirectory() скорее всего работает с динамической памятью и пользователю пришлось бы заботиться об утилизации его работы... Или же он может работать с неким заранее выделенным буфером... Но это весьма порочная практика.

Добавлено через 8 минут
В линухе, насколько я понимаю, переменные окружения копируются в контекст приложения... Хм... Или как-то иначе... Но факт в том, что их можно достать по указателю. Под них не надо выделять буффер.

Могу врать. Хороший вопрос.
0
DrOffset
11858 / 6414 / 1543
Регистрация: 30.01.2014
Сообщений: 10,435
15.02.2018, 12:03 7
Цитата Сообщение от viramir Посмотреть сообщение
Причина неудобной реализации функций
На самом деле такая реализация удобнее с точки зрения гибкости разработки, т.к. по крайней мере позволяет вам (т.е. пользователям функции) выбрать способ, которым будем выделена память для данных. Т.е. такой вариант дает больше контроля.
0
Байт
Эксперт C
22708 / 14391 / 3017
Регистрация: 24.12.2010
Сообщений: 30,659
15.02.2018, 12:24 8
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Так реализован язык.
Язык тут ни при чем. Так реализована ФУНКЦИЯ. Довольно таки по-дурацки. Можно было бы и иначе. Ведь этот путь уже лежит в environ-переменных. Но тогда бы вы не имели права полученную строку как-то менять. А хотите менять - копируйте ее в свою память и делайте что хотите. Вот об этом создатели функции и позаботились.
0
viramir
1 / 1 / 1
Регистрация: 04.05.2016
Сообщений: 266
15.02.2018, 12:31  [ТС] 9
Цитата Сообщение от Байт Посмотреть сообщение
Язык тут ни при чем. Так реализована ФУНКЦИЯ. Довольно таки по-дурацки. Можно было бы и иначе. Ведь этот путь уже лежит в environ-переменных. Но тогда бы вы не имели права полученную строку как-то менять. А хотите менять - копируйте ее в свою память и делайте что хотите. Вот об этом создатели функции и позаботились.
А в чем разница тогда
C++
1
2
char buffer[100];
char* buffer=new char[100];
0
COKPOWEHEU
2544 / 1468 / 326
Регистрация: 09.09.2017
Сообщений: 5,759
15.02.2018, 13:06 10
В первом случае массив создается на стеке (размер которого ограничен) и его временем жизни управляет компилятор.
Во втором - на куче (ее размер ограничен доступным ОЗУ) и его надо будет удалить вручную чтобы не было утечек памяти.
0
rikimaru2013
2527 / 1187 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
15.02.2018, 15:16 11
Цитата Сообщение от viramir Посмотреть сообщение
Почему к примеру нельзя писать так
Можно так писать и всё зависит от вас только - если вы считаете, что вашему совершенному апи нужен такой подход - то почему бы и нет:

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
34
35
36
37
38
39
40
41
42
43
#include <iostream>
 
struct SystemInfo
{
    enum { buffer_size = 512 };
    char _dir[buffer_size];
    char _appName[buffer_size];
    char _version[buffer_size];
 
    SystemInfo()
    {
        const char* default[3] = { "C:\\12.exe", "MyBestCode", "1.01.218" };
        memcpy(_dir, default[0], strlen(default[0]) + 1);
        memcpy(_appName, default[1], strlen(default[1]) + 1);
        memcpy(_version, default[2], strlen(default[2]) + 1);
    }
    void show()
    {       
        std::cout << "\n SystemInfo: " << std::endl;
        std::cout << "\t dir: " << _dir << std::endl;
        std::cout << "\t appName: " << _appName << std::endl;
        std::cout << "\t version: " << _version << std::endl;
    }
    char* GetDir()
    {
        return _dir;
    }
};
 
SystemInfo gInfo;
 
 
int main()
{
    gInfo.show();
    
    const char* const newDir = "D:\\helloWorld.exe";
    char* dir = gInfo.GetDir();
    memcpy(dir, newDir, strlen(newDir) + 1);     
 
    gInfo.show();
    
}
0
Renji
2612 / 1795 / 539
Регистрация: 05.06.2014
Сообщений: 5,195
15.02.2018, 16:32 12
Цитата Сообщение от viramir Посмотреть сообщение
Почему к примеру нельзя писать так
Потому что WinAPI написан под Си, в котором такому синтаксису мешают технические ограничения. И убирать их никто не будет, так как иначе получится C++.
А в фреймворках типа Qt вы наверняка найдете функции с синтаксисом вида string cd=GetCurrentDirectory();.
0
15.02.2018, 16:32
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2018, 16:32

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

Графический режим. Применение графических функций. Методы реализации статического и динамического изображения
помогите очень надо ищю такжы програмиста за деньги задача a) (Задача № 1 и № 2) Используя...

Отделение интерфейса от реализации класса: компиляция кода реализации
Доброго времени суток, У меня возникла проблема с отделением интерфейса от реализации класса....

Построить схемы реализации в конъюнктивном базисе Буля следующих функций
Построить схемы реализации в конъюнктивном базисе Буля следующих функций

Разработать логические схемы для реализации частично определённых логических функций
разработать логические схемы для реализации частично определённых логических функций заданных в...


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

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

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