Как объявить последовательность символов для функции (C ++)?

0

Как сделать объявление для функции иметь последовательность символов в результате?

У меня это сейчас:

#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 " Нет контекста, в котором это преобразование возможно

  • 0
    Я собираюсь идти вперед и быть первым, кто скажет, а? Это должен быть звонок или объявление ?
  • 0
    Поскольку вы поместили typedef для Path внутри класса Setts вам нужно использовать перед ним имя класса для использования: Setts::Path
Показать ещё 4 комментария
Теги:

4 ответа

0
Лучший ответ

Я решил проблему. Спасибо всем. (Я просто удалил класс для упрощения.

#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);
3

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>;
  • 0
    Может быть, я не могу найти в Google, но я не могу найти страницу MSDN для класса STD. Мне не понятно, как включить std :: array в проект. + Я получил ошибку C2873: «Путь»: символ не может использоваться в объявлении об использовании + Я не могу получить доступ к странице msdn.microsoft.com/en-US в данный момент. Странный...
  • 0
    см, например, здесь
Показать ещё 6 комментариев
2

Я 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 для форматирования будет лучшим решением для вашего случая использования, чем массивы с фиксированным размером.

  • 1
    typedef std::array<char,MAX_PATH> Path;
  • 0
    Но действительно ли мне нужно включать все методы массива классов, когда я хочу определить только один тип?
Показать ещё 10 комментариев
0

Как правило, в 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 в качестве некоторой формы шаблона.

  • 1
    ОП явно просил c ++ !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню