Форум программистов, компьютерный форум CyberForum.ru

Передать локальную переменную в новую функцию - C++

Восстановить пароль Регистрация
 
ss1278ee
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 16
29.09.2016, 15:43     Передать локальную переменную в новую функцию #1
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <windows.h>
 
using namespace std;
 
int main()
{
 
string info;
 
cout<<"\n\n\n\n\nPlease input folder name)";
 
cin>>info;
system("cls");
 
string NewFolderName="C:\"+info;
 
if(CreateDirectory(NewFolderName.c_str(), NULL));
else cerr<<"\nFail to create derectory "<<NewFolderName<<":("<<endl;
}
void Copy(LPCTSTR szInDirName, LPCTSTR szOutDirName, bool flag = false)
{
    WIN32_FIND_DATA ffd;
    HANDLE hFind;
 
    TCHAR szFind[MAX_PATH + 1];
    TCHAR szInFileName[MAX_PATH + 1];
    TCHAR szOutFileName[MAX_PATH + 1];
 
    lstrcpy(szFind, szInDirName);
    lstrcat(szFind, "\\*.*"); 
 
    hFind = FindFirstFile(szFind, &ffd);
 
    do
    {
        //Формируем полный путь (источник)
        lstrcpy(szInFileName, szInDirName);
        lstrcat(szInFileName, "\");
        lstrcat(szInFileName, ffd.cFileName);
 
        //Формируем полный путь (результат)
        lstrcpy(szOutFileName, szOutDirName);
        lstrcat(szOutFileName, "\");
        lstrcat(szOutFileName, ffd.cFileName);
 
        if(flag)
        {
            if(ffd.dwFileAttributes & 0x00000010)
            {
                if(lstrcmp(ffd.cFileName, ".") == 0 ||
                    lstrcmp(ffd.cFileName, "..") == 0) continue;
 
                CreateDirectory(szOutFileName, NULL);
                Copy(szInFileName, szOutFileName);
            }
        } //иначе пропускаем папки
        else
            if(ffd.dwFileAttributes & 0x00000010) continue;
 
        CopyFile(szInFileName, szOutFileName, TRUE);
    }
    while(FindNextFile(hFind, &ffd));
 
    FindClose(hFind);
}
 
int maincopy()
{
    Copy("C:\\1", NewFolderName.c_str(), true);
}
Получаем:
In function 'int maincopy()':
error: 'NewFolderName' was not declared in this scope
warning: no return statement in function returning non-void [-Wreturn-type]
Объявить NewFolderName.c_str() вне функции не вышло. Как исправить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ture
 Аватар для ture
404 / 297 / 120
Регистрация: 27.11.2014
Сообщений: 1,004
29.09.2016, 15:49     Передать локальную переменную в новую функцию #2
ss1278ee, мы тут с товарищами в коллективе посовещались и думаем удалить эту функцию.
ss1278ee
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 16
29.09.2016, 20:37  [ТС]     Передать локальную переменную в новую функцию #3
Можно удалить. А толку:
In function 'void Copy(LPCTSTR, LPCTSTR, bool)':|
error: 'NewFolderName' was not declared in this scope|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 2 second(s)) ===|
nmcf
4281 / 3712 / 1247
Регистрация: 14.04.2014
Сообщений: 14,516
29.09.2016, 20:56     Передать локальную переменную в новую функцию #4
Ты тот текст показываешь? Ни та, ни другая функции не используются, и имени этого в Copy() нет.
sergestus
73 / 73 / 23
Регистрация: 26.10.2011
Сообщений: 212
Завершенные тесты: 1
29.09.2016, 21:20     Передать локальную переменную в новую функцию #5
Нужно перенести перед main строку:
C++
1
string NewFolderName="C:"+info;
ss1278ee
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 16
29.09.2016, 23:02  [ТС]     Передать локальную переменную в новую функцию #6
Цитата Сообщение от sergestus Посмотреть сообщение
Нужно перенести перед main строку:
Так не получается. Я ввожу info в консоли. Вне функции main, это перестает работать.
error: 'cout' does not name a type|
error: 'cin' does not name a type|
error: expected constructor, destructor, or type conversion before '(' token|
error: expected unqualified-id before 'if'|
error: expected unqualified-id before 'else'|
In function 'int maincopy()':|
warning: no return statement in function returning non-void [-Wreturn-type]|
||=== Build failed: 5 error(s), 1 warning(s) (0 minute(s), 2 second(s)) ===|
А NewFolderName="C:\"+info.
VAN0
42 / 42 / 25
Регистрация: 05.05.2013
Сообщений: 115
Завершенные тесты: 1
29.09.2016, 23:10     Передать локальную переменную в новую функцию #7
а если перед main
C++
1
string NewFolderName="C:";
а после ввода info
C++
1
NewFolderName = NewFolderName + info;
или вынести объявление NewFolderName из функции maincopy в область глобальных переменных.
sergestus
73 / 73 / 23
Регистрация: 26.10.2011
Сообщений: 212
Завершенные тесты: 1
29.09.2016, 23:20     Передать локальную переменную в новую функцию #8
Цитата Сообщение от ss1278ee Посмотреть сообщение
C++
1
string NewFolderName="C:"+info;
нужно еще второй слеш добавить:
C++
1
"C:\"
ss1278ee
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 16
29.09.2016, 23:33  [ТС]     Передать локальную переменную в новую функцию #9
Цитата Сообщение от VAN0 Посмотреть сообщение
а если перед main
C++
1
string NewFolderName="C:";
а после ввода info
C++
1
NewFolderName = NewFolderName + info;
или вынести объявление NewFolderName из функции maincopy в область глобальных переменных.
Так тоже не получается. Ведь info остается внутри функции main, и стирается после ее закрытия.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using namespace std;
 
string NewFolderName="C:";
 
int main()
{
 
string info;
 
cout<<"\n\n\n\n\nPlease input folder name)";
 
cin>>info;
system("cls");
}
 
string NewFolderName="C:"+info;
отдаст:

error: redefinition of 'std::string NewFolderName'|
note: 'std::string NewFolderName' previously declared here|
error: 'info' was not declared in this scope|
nmcf
4281 / 3712 / 1247
Регистрация: 14.04.2014
Сообщений: 14,516
30.09.2016, 09:08     Передать локальную переменную в новую функцию #10
Ты сначала определись, зачем тебе эта переменная и функция, если они не используются. У тебя main() по сути пустой.
ss1278ee
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 16
30.09.2016, 11:16  [ТС]     Передать локальную переменную в новую функцию #11
Цитата Сообщение от nmcf Посмотреть сообщение
Ты сначала определись, зачем тебе эта переменная и функция, если они не используются. У тебя main() по сути пустой.
Ну так я написал. То, что в main, не работает за пределами функции. Почему, я не знаю. За этим и функция.
main, чтобы указать имя новой директории.
maincopy, скопировать содержимое старой директории в новую.
ture
 Аватар для ture
404 / 297 / 120
Регистрация: 27.11.2014
Сообщений: 1,004
30.09.2016, 11:26     Передать локальную переменную в новую функцию #12
ss1278ee, передай ссылку или указатель на переменную в свою функцию, и не выноси мозги.
ss1278ee
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 16
30.09.2016, 12:42  [ТС]     Передать локальную переменную в новую функцию #13
ture, а как делается? С передачей ссылок сразу нагуглил, но прикрутить не получается.
ture
 Аватар для ture
404 / 297 / 120
Регистрация: 27.11.2014
Сообщений: 1,004
30.09.2016, 12:57     Передать локальную переменную в новую функцию #14
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <windows.h>
 
using namespace std;
 
void Copy(LPCTSTR,LPCTSTR,bool);
void maincopy(const wstring&);
 
int main() {
 
    wstring info;
 
    cout << "\n\n\n\n\nPlease input folder name)";
    wcin >> info;
    system("cls");
 
    wstring NewFolderName = LR"(C:\)"+info;
    if(CreateDirectory(NewFolderName.c_str(), NULL))
        maincopy(NewFolderName);
    else 
        wcerr << "\nFail to create derectory " << NewFolderName << ":(" << endl;
 
    return 0;
}
 
void Copy(LPCTSTR szInDirName, LPCTSTR szOutDirName, bool flag = false) {
    WIN32_FIND_DATA ffd;
    HANDLE hFind;
 
    TCHAR szFind[MAX_PATH + 1];
    TCHAR szInFileName[MAX_PATH + 1];
    TCHAR szOutFileName[MAX_PATH + 1];
 
    lstrcpy(szFind, szInDirName);
    lstrcat(szFind, LR"(\*.*)");
 
    hFind = FindFirstFile(szFind, &ffd);
 
    do {
        //Формируем полный путь (источник)
        lstrcpy(szInFileName, szInDirName);
        lstrcat(szInFileName, LR"(\)");
                lstrcat(szInFileName, ffd.cFileName);
 
        //Формируем полный путь (результат)
        lstrcpy(szOutFileName, szOutDirName);
        lstrcat(szOutFileName, LR"(\)");
                lstrcat(szOutFileName, ffd.cFileName);
 
        if(flag) {
            if(ffd.dwFileAttributes & 0x00000010) {
                if(lstrcmp(ffd.cFileName, LR"(.)") == 0 ||
                   lstrcmp(ffd.cFileName, LR"(..)") == 0) continue;
 
                CreateDirectory(szOutFileName, NULL);
                Copy(szInFileName, szOutFileName);
            }
        } //иначе пропускаем папки
        else
            if(ffd.dwFileAttributes & 0x00000010) continue;
 
        CopyFile(szInFileName, szOutFileName, TRUE);
    } while(FindNextFile(hFind, &ffd));
 
    FindClose(hFind);
}
 
void maincopy(const wstring& NewFolderName) {
    Copy(LR"(C:\1)", NewFolderName.c_str(), true);  
}
ss1278ee
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 16
30.09.2016, 19:25  [ТС]     Передать локальную переменную в новую функцию #15
Объясни пожалуйста, что за 'LR'.
Компилятор засыпал ошибками в связи с этим.
nmcf
4281 / 3712 / 1247
Регистрация: 14.04.2014
Сообщений: 14,516
30.09.2016, 19:38     Передать локальную переменную в новую функцию #16
Оставь только L, но косую черту в строке удвой.
ss1278ee
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 16
30.09.2016, 19:58  [ТС]     Передать локальную переменную в новую функцию #17
Так заработало:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <windows.h>
 
void Copy(LPCTSTR szInDirName, LPCTSTR szOutDirName, bool flag = false)
{
    WIN32_FIND_DATA ffd;
    HANDLE hFind;
 
    TCHAR szFind[MAX_PATH + 1];
    TCHAR szInFileName[MAX_PATH + 1];
    TCHAR szOutFileName[MAX_PATH + 1];
 
    lstrcpy(szFind, szInDirName);
    lstrcat(szFind, "\\*.*"); //ищем файлы с любым именем и рысширением
 
    hFind = FindFirstFile(szFind, &ffd);
 
    do
    {
        //Формируем полный путь (источник)
        lstrcpy(szInFileName, szInDirName);
        lstrcat(szInFileName, "");
        lstrcat(szInFileName, ffd.cFileName);
 
        //Формируем полный путь (результат)
        lstrcpy(szOutFileName, szOutDirName);
        lstrcat(szOutFileName, "");
        lstrcat(szOutFileName, ffd.cFileName);
 
        if(flag) //если flag == true, то копируем и папки
        {
            if(ffd.dwFileAttributes & 0x00000010)
            {
                if(lstrcmp(ffd.cFileName, ".") == 0 ||
                    lstrcmp(ffd.cFileName, "..") == 0) continue;
 
                CreateDirectory(szOutFileName, NULL);
                Copy(szInFileName, szOutFileName);
            }
        } //иначе пропускаем папки
        else
            if(ffd.dwFileAttributes & 0x00000010) continue;
 
        CopyFile(szInFileName, szOutFileName, TRUE);
    }
    while(FindNextFile(hFind, &ffd));
 
    FindClose(hFind);
}
 
using namespace std;
 
int main()
{
    string info;
 
cout<<"\n\n\n\n\nPlease input folder name)";
 
cin>>info;
system("cls");
 
string NewFolderName="C:"+info;
 
if(CreateDirectory(NewFolderName.c_str(), NULL));
else cerr<<"\nFail to create derectory "<<NewFolderName<<":("<<endl;
 
    Copy("C:\\1", NewFolderName.c_str(), true);
}
Кстати, у меня везде двойной слеш "\". Код закинул копипастом, и не понимаю на каком этапе этого действа от двух слешей остался один. Теперь показывает невалидный код. Просто в ступоре.
nmcf
30.09.2016, 20:04
  #18

Не по теме:

При вставке сюда слэш может пропадать. Недопилили что-то.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2016, 20:04     Передать локальную переменную в новую функцию
Еще ссылки по теме:

Записать каждое слово строки в новую переменную. C++
Возврат ссылки на локальную переменную C++
Как в данном контексте правильно разместить статическую локальную переменную? C++

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

Или воспользуйтесь поиском по форуму:
ss1278ee
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 16
30.09.2016, 20:04  [ТС]     Передать локальную переменную в новую функцию #19
пс. после первого редактирования осталось "lstrcat(szOutFileName, "");" Вообще отлично. Умный форум.
Yandex
Объявления
30.09.2016, 20:04     Передать локальную переменную в новую функцию
Ответ Создать тему
Опции темы

Текущее время: 11:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru