Как сделать объявление для функции иметь последовательность символов в результате?
У меня это сейчас:
#define _MAX_PATH 260
char * GetTempFileName(char fileName [_MAX_PATH]);
Но результат должен быть в типе char [_MAX_PATH]
#include <array>
typedef std::array<char,_MAX_PATH> Path;
extern class Setts
{
char path [_MAX_PATH];
public:
Setts();~Setts();
Path getTempFileName(const Path &fileName);
} setts;
Setts::~Setts(){}
Path Setts::getTempFileName(const Path &fileName)
{
GetCurrentDirectory(_MAX_PATH, path);
strcat(path, "\\");
strcat(path, fileName);
return path;
}
Это то, что делает проблему для меня...
error C2143: syntax error : missing ';' before 'Setts::GetTempFileNameA'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2556: 'int Setts::GetTempFileNameA(Setts::Path)' : overloaded function differs only by return type from 'Setts::Path Setts::GetTempFileNameA(Setts::Path)'
Неужели невозможно получить результат в char char char [_MAX_PATH]? Проблема здесь в том, что при создании нового типа Path, все функции условий, которые зависят от типа char [_MAX_PATH], вызывают ошибки в проекте.
Из комментариев с g-makulik
Что означает, что данные path.data()... выглядят как какая-то функция, что это делает? Он оценивается после того, как результат сохраняется в переменной пути? - user1141649 16 минут назад
г-makulik:
It provides access to the std::array underlying data (an array of char[260]). You can use it in other places to interface that array as well. –
Я попытался упростить его, поскольку совместимость с остальной частью проекта:
settings.h:
#include <stdlib.h>
#include <iostream>
#include <array>
typedef char Path [_MAX_PATH];
extern class Setts
{
Path& path;
public:
Setts();~Setts();
Path& getTempFileName(const Path &fileName);
bool load();
Path& BasePath;
Path& ScenPath;
Path& TempPath;
#define DEL_TEMP_ON_EXIT 1;
Path& logname;
bool intense;
} setts;
settings.cpp:
#include <windows.h>
#include "settings.h"
#include <stdio.h>
Setts::~Setts(){}
Path& Setts::getTempFileName(const Path &fileName)
{
GetCurrentDirectory(_MAX_PATH, path);
strcat(path, "\\");
strcat(path, fileName);
return path;
}
bool Setts::load()
{
TempPath = getTempFileName("scendata.tmp");
logname = getTempFileName("ats_cache.log");
return (result == ERROR_SUCCESS);
}
Теперь я получил ошибку: near TempPath = getTempFileName("scendata.tmp");
и logname = getTempFileName("ats_cache.log");
:
'Setts :: getTempFileName': невозможно преобразовать параметр 1 из 'const char [13]' в 'const Path (&)' Причина: не может преобразовать из 'const char [13]' в 'const Path' Нет контекста, в котором это преобразование возможно ошибка C2664: 'Setts :: getTempFileName': не может преобразовать параметр 1 из 'const char [14]' в 'const Path (&)' Причина: не может преобразовать из 'const char [14]' в 'const Path " Нет контекста, в котором это преобразование возможно
Я решил проблему. Спасибо всем. (Я просто удалил класс для упрощения.
#define _MAX_PATH 260
char path [_MAX_PATH];
char BasePath [_MAX_PATH];
char ScenPath [_MAX_PATH];
char TempPath [_MAX_PATH];
char logname [_MAX_PATH];
char* getTempFileName(char *fileName, char *targetVariable);
char* getTempFileName(char *fileName, char *targetVariable)
{
GetCurrentDirectory(_MAX_PATH, targetVariable);
strcat_s(targetVariable, _MAX_PATH, "\\");
strcat_s(targetVariable, _MAX_PATH, fileName);
return targetVariable;
}
getTempFileName("scendata.tmp",TempPath);
getTempFileName("ats_cache.log",logname);
std::array
, std::string
, std::vector
и простая struct
. Все они полезны.
typedef std::string Path; // or
typedef std::array<char, MAX_PATH> Path; // or
typedef std::vector<char> Path;
Path GetTempFileName(const Path &path);
или просто:
struct Path
{
char value[MAX_PATH];
};
С++ 11 представляет using
в качестве альтернативы для typedef
:
using Path = std::string; // or
using Path = std::array<char, MAX_PATH>; // or
using Path = std::vector<char>;
Я c++ вам лучше делать:
#include <array>
typedef std::array<char,260> Path;
Path MyTempFileName(const Path& fileName);
Здесь фиксированная версия вашего кода:
#include <array>
class Setts
{
public:
Setts();~Setts();
typedef std::array<char,_MAX_PATH> Path;
Path& MyTempFileName(Path fileName);
private:
Path path; //Path to INI
};
Setts::~Setts(){}
Setts::Path& Setts::MyTempFileName(Setts::Path fileName)
{
GetCurrentDirectory(_MAX_PATH, path.data());
strcat(path.data(), "\\");
strcat(path.data(), fileName);
return path;
}
Но я бы сказал, используя std::string
для хранения данных, а std::ostringstream
для форматирования будет лучшим решением для вашего случая использования, чем массивы с фиксированным размером.
typedef std::array<char,MAX_PATH> Path;
Как правило, в C вы должны предоставить выходной буфер функции, а также размер ее. Кроме того, если fileName имеет нулевое завершение, нет необходимости указывать размер буфера.
char * GetTempFileName(const char *fileName, char *tempFileName, size_t tempFileNameSize);
Функция должна возвращать указатель tempFileName или NULL в случае ошибки. Вы бы назвали это так:
char fileName[] = "myFile.txt";
char tempFileName[_MAX_PATH];
if (GetTempFileName(fileName, tempFileName, sizeof(tempFileName)) == NULL) {
// handle error
}
Я также предполагаю, что реализация GetTempFileName будет использовать параметр fileName в качестве некоторой формы шаблона.
Path
внутри классаSetts
вам нужно использовать перед ним имя класса для использования:Setts::Path