[C++] funkcja nie przekazuje wartości zmiennej do funkcji

0

Witam,
Mam 3 funkcje, z których 2 odwołują się do tej pierwszej ale nie jest przekazywana wartość zmiennej uname.

#include<iostream>
#include<fstream>
using namespace std;

void clnk() {
    string uname,baza,umowy,raporty;

system(baza.c_str());
system(umowy.c_str());
system(raporty.c_str());

baza="md \\\\serwer\\"+uname+"\\baza";
raporty="md \\\\serwer\\"+uname+"\\raporty";
umowy="md \\\\serwer\\"+uname+"\\umowy";

system(baza.c_str());
system(umowy.c_str());
system(raporty.c_str());

baza="SHORTCUT /f:\"\\\\serwer\\baza\\" + uname + ".lnk\" /a:c /t:\\\\serwer\\" + uname + "\\baza";
raporty="SHORTCUT /f:\"\\\\serwer\\raporty\\" + uname + ".lnk\" /a:c /t:\\\\serwer\\" + uname + "\\raporty";
umowy="SHORTCUT /f:\"\\\\serwer\\umowy\\" + uname + ".lnk\" /a:c /t:\\\\serwer\\" + uname + "\\umowy";

cout<<uname<<"=================================== [ok]\n";
}

void name(){
    string uname;
cout<<"musisz byc zalogowany do udziałów sieciowych (konto z grupy @admini lub @manager)"<<endl;
cout<<"nazwe usera (j_kowalsky)\n";
cin>>uname;
clnk();
}

void namelist(){
    string uname,fname;
ifstream plik("users.txt");
while(!plik.eof()){ 
getline(plik,uname);
clnk();
}}

int main()

{
string uname,baza,umowy,raporty;
int i;

cout<<"wybierz opcje:\n\n";
cout<<"1: utworzenie uzytkownika\n";
cout<<"2: utworzenie uzytkownikow z listy (users.txt)\n";
cout<<"3: koniec\n";
cout<<"\n WARNING! Musi byc utworzone konto na serwerze z katalogiem domowym!\n\n";
cout<<"Twoj wybor: ";
cin>>i;

switch(i){
    case (1): 
        name();
        break;
    
    case (2): 
        namelist();
        break;
    
    case (3):  
                cout<<"bye, bye...\n";
    deflaut : cout<<"zly wybor!\n";
               break;
} 

cout<<endl<<"Zostaly utworzone skroty\n"; 
system("pause");
return(0);
}    

Nie mam już pomysłów a wiem że zrobiłem prosty bład. Będę wdzięczny za pomoc.
pozdrawiam

0

Tak. Prosty błąd polega na tym że nie umiesz C/C++. Za każdym razem tworzysz NOWĄ ZMIENNĄ. To ze ją tak samo nazwiesz o niczym nie świadczy...
Musisz tą zmienną przekazać do funkcji jako argument...

0

To się w ogóle skompilowało? To widać potrzebujesz wyższego ustawienia warningów, na przykład -Wall -Wextra -Werror -pedantic -ansi -Wunused jeśli to g++.

Ja dostaję:

cpp_main.cpp: In function 'void clnk()':
cpp_main.cpp:8:24: error: 'system' was not declared in this scope
cpp_main.cpp: In function 'int main()':
cpp_main.cpp:73:19: error: 'system' was not declared in this scope
cc1plus.exe: warnings being treated as errors
cpp_main.cpp:67:1: error: label '<b>deflaut</b>' defined but not used

Po dodaniu #include <cstdlib> i zmianie "deflaut:" na "default:" (nawet bez kompilowania, w NetBeans po sformatowaniu kodu od razu widać było, że coś jest nie tak z tą linijką) dało się to już skompilować, co nie znaczy, że program działa już prawidłowo.
Szkoda, że g++ nie ostrzega przy nieużywanych obiektach (chyba, że klasa nie ma zdefiniowanego konstruktora i nie ma jako właściwości innych obiektów ze zdefiniowanymi konstruktorami...), zobaczyłbyś wtedy, że Twoje zmienne typu string w funkcji main() są tylko od picu. Kompilator nie ostrzega, ale IDE już może, na przykład NetBeans C/C++ podkreśla na szaro nieużywane zmienne. ;)

Prześledźmy co się dzieje tutaj:

    switch (i) {
        case (1):
            name();
            break;

jeżeli i == 1 to wywołujemy funkcję name():

void name() {
    string uname;
    cout << "musisz byc zalogowany do udziałów sieciowych (konto z grupy @admini lub @manager)" << endl;
    cout << "nazwe usera (j_kowalsky)\n";
    cin >> uname;
    clnk();
}

Funkcja name nie zwraca żadnej wartości, nie przyjmuje żadnych parametrów. W pierwszej linijce tworzysz pusty string uname, który jest zmienną lokalną. Później po wyświetleniu wiadomości dla użytkownika, ten wprowadza pewną wartość do uname, po czym wywołana jest funkcja clnk() (nie dało się bardziej czytelnej, zrozumiałej nazwy wymyśleć?).

void clnk() {//
    string uname, baza, umowy, raporty;

Ta funkcja z kolei tworzy kolejną lokalną zmienną o nazwie uname (między innymi), również zawierającą pusty string. Zaczynasz łapać?

Rozejrzyj się za jakimś kursem C++, sprawdź część omawiającą funkcje, przegazywanie argumentów do funkcji, zwracanie wartości przez funkcje, oraz zasięg ważności zmiennych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1