Компилятору не нравится void: '(- объявление функции - PullRequest
0 голосов
/ 05 ноября 2011

Я пытаюсь написать функцию для изменения некоторых имен папок, но у меня возникают трудности с фактическим объявлением.

Вот мой код:

void ChangeVersion(char* NewVer)
{
    ifstream show_current_version;
    show_current_version.open(*removed*);
    char show_current_version_var[1024];
    if (show_current_version.is_open())
    {
        while (!show_current_version.eof())
        {
              show_current_version >> show_current_version_var;
        }                                         
    }
    show_current_version.close();
    // show_current_version_var is old version
    char OldVersion[1024] = show_current_version_var;

    // start rename
    cout << "Changing versions...";
    rename("*removed*", OldVersion);
    rename(NewVer, "*removed*");
    cout << "done!" << endl; 
} 

Как вы можете сказать, я новичок в c ++ ...

Я читал на различных учебных сайтах по c ++, что если вы хотите, чтобы функция ничего не возвращала, вы объявляете ее недействительной. Однако, когда я сделал это, мой компилятор говорит неверный инициализатор. Я использую dev-cpp.

Я думаю, это потому, что моя функция выводит текст, но на веб-сайтах функция void имеет несколько операторов cout ...

Я попытался инициализировать его с помощью char *, как и другие мои функции, но я получаю ту же ошибку. То же самое с int и char.

Спасибо за чтение.

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Пара мелких вещей

Когда вы публикуете код, публикуйте все, что нам нужно для его компиляции:

// You need these to make it compile.
#include <iostream>
#include <fstream>

using namespace std;

ОК.Ошибки:

show_current_version.open(*removed*);
                          ^^^^^^^^^   What is this supposed to be ?

Эта функция ожидает C-String.Так что «удалено» действительно.Но звезды * не имеют смысла.

char OldVersion[1024] = show_current_version_var;

Вы не можете копировать массивы так:

char OldVersion[1024];
std::copy(show_current_version_var, show_current_version_var+1024, OldVersion);

Хотя было бы лучше использовать std ::вектор, а не массив.Тогда вам разрешено копировать.

std::vector<char>   show_current_version_var(1024);
// STUFF
std::vector<char>   OldVersion(show_current_version_var);

В качестве альтернативы, если вы специально храните строки (не BLOB-объекты char), тогда std :: string, вероятно, будет лучшим выбором.

1 голос
/ 05 ноября 2011

Вы действительно должны более внимательно рассмотреть вывод компилятора. Как правило, он сообщает вам, в какой строке содержится ошибка, что дает вам много работы.

Приступая к конкретной проблеме, ошибочная строка (из того, что я понял, не пробовал компилировать):

char OldVersion[1024] = show_current_version_var;

Вы не можете назначить переменную статическому массиву подобным образом. Есть только несколько вещей, которые можно использовать для инициализации статического массива. Например:

char OldVersion[1024] = "Static string";
char example[1024] = { 0 };

Попробуйте сделать:

char OldVersion[1024];
strncpy(OldVersion, show_current_version_var, 1024);
// Null-terminate the string for good measure
OldVersion[1023] = 0;

Или просто используйте show_current_version_var там, где вы будете использовать OldVersion (я не вижу смысла копировать строку в вставленном вами коде).

В любом случае, я не знаю, чего вы пытаетесь достичь, но вам действительно стоит прочесть о C ++. Это довольно сложный язык для использования.

0 голосов
/ 05 ноября 2011

Я не думаю, что вы можете сделать это:

char OldVersion[1024] = show_current_version_var;

Вы можете инициализировать массивы только с помощью фигурного списка (например, {'p', 'a', 'x'}).

Вместо этого,вам следует попробовать:

char OldVersion[1024];
memcpy (OldVersion, show_current_version_var, sizeof (OldVersion));

Полная, компилируемая версия показана ниже:

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
void ChangeVersion(char* NewVer)
{
    ifstream show_current_version;
    show_current_version.open("qqq");
    char show_current_version_var[1024];
    if (show_current_version.is_open())
    {
        while (!show_current_version.eof())
        {
              show_current_version >> show_current_version_var;
        }
    }
    show_current_version.close();
    // show_current_version_var is old version
    char OldVersion[1024];
    memcpy (OldVersion, show_current_version_var, sizeof (OldVersion));

    // start rename
    cout << "Changing versions...";
    rename("*removed*", OldVersion);
    rename(NewVer, "*removed*");
    cout << "done!" << endl;
}

int main() {
    return 0;
}
...