[C++] Problem z wywołaniem funckji

Witam, mam taki problem. Testowałem wywołanie funkcji o oto co zrobiłem:

Zawartość pliku test.cpp

#include 

#include "function.h"

int main ()

{

    void authorization ();

}

Zawartość pliku function.h

void authorization ()

{

     string priority;

    string password;

    cout << "Type your priority:\t";

    cin >> priority;


    if (priority == "admin")

    {

                 cout << "Type password for administrator priority:\t";

                 cin >> password;

                 if (password == "asemblore")

                              cout << "Hoooray, admin module works!";                 

                              else 

                              cout << "Sorry, this is not administrator funcion password. Remember, impersonateing any of Salazaar Software employee is a criminal and may be wanting by police.";

     }

     if (priority == "moderator")

     {

                  cout << "Type password for moderator priority:\t";

                  cin >> password;

                  if (password == "doistezous")

                  cout << "Hoooray, mod module works!";                 

                              else 

                              cout << "Sorry, this is not moderator funcion password. Remember, impersonateing any of Salazaar Software employee is a criminal and may be wanting by police.";

                              }

                        if (priority == "employee")

                        {

                              cout << "Type password for employee priority:\t";

                  cin >> password;

                  if (password == "alitlawe")

                  cout << "Hoooray, empy module works!";                 

                              else 

                              cout << "Sorry, this is not employee funcion password. Remember, impersonateing any of Salazaar Software employee is a criminal and may be wanting by police.";

                              }       

    if ( (priority != "admin") && (priority != "moderator") && (priority != "employee") )

    cout << "There's no " << priority << " priority";


     }

I wyskakuje mi mnóstwo błędów typu: 3 C:\Dev-Cpp1\function.h `string’ undeclared (first use this function) Co zrobiłem źle?

tutaj jest coś nie tak, jeśli funkcja jest int, to musi coś zwracać poprzez return na końcu z tego co ja rozumiem (aczkolwiek moja wiedza jest znikoma) więc albo void main, albo return 0

a nie

#include

? chociaż jak już wspomniałem laikiem jestem

No przede wszystkim include w cudzysłowie, wtedy plik szukany jest w katalogu z plikiem głównym.

Po drugie po co spacje przy funkcjach? To chyba jest błąd, nigdy nie pisz tak, powinno być

int main()

void authorization();

I tak dalej.

Jeszcze co do tego co napisał Airborn.

Jedynie int main, mam nadzieję, że wiesz dlaczego?

A return 0; nie musisz pisać, przynajmniej u mnie i tak kompilator sam sobie go uzupełnia, chociaż nie zaszkodzi, jeżeli napiszesz na końcu return 0;.

Jesli nie ma nic napisane to kompilator domyśla się, że funkcja zwraca 0

Nie, ponieważ <> to sa do standardowej biblioteki a “” to do biezacego pliku Złączono Posta : 26.03.2007 (Pon) 19:56

To nie jest błąd

Aha no sorry, pomyliło mi się, include twojego pliku nagłówkowego jest dobrze, w cudzysłowie. Natomiast mimo wszystko nalegam, abyś usunął te spacje z funkcji, tak się nie pisze po prostu. No i podaj jakie to błędy wywala kompilator/linker?

Aaaa już wiem, przecież nie załączyłeś biblioteki do obsługi stringów! Hehe taki banał…

#include

powinno załatwić sprawę :smiley:

W pliku function powinno znaleźć się include string oraz iostream.

[Linker error] undefined reference to `priority’

[Linker error] undefined reference to `priority’

Hej wrzuciłem ten kod do Anjuty, popoprawiałem i masz, zapomniałeś również o

using namespace std;

#include 

#include "function.h"

int main ()

{

    authorization ();

}

function.h

#ifndef FUNCTION_H

#define FUNCTION_H


#include 

#include 

using namespace std;


void authorization ()

{

   string priority;

    string password;

    cout << "Type your priority:\t";

    cin >> priority;


    if (priority == "admin")

    {

                 cout << "Type password for administrator priority:\t";

                 cin >> password;

                 if (password == "asemblore")

                              cout << "Hoooray, admin module works!";                 

                              else

                              cout << "Sorry, this is not administrator funcion password. Remember, impersonateing any of Salazaar Software employee is a criminal and may be wanting by police.";

     }

     if (priority == "moderator")

     {

                  cout << "Type password for moderator priority:\t";

                  cin >> password;

                  if (password == "doistezous")

                  cout << "Hoooray, mod module works!";                 

                              else

                              cout << "Sorry, this is not moderator funcion password. Remember, impersonateing any of Salazaar Software employee is a criminal and may be wanting by police.";

                              }

                        if (priority == "employee")

                        {

                              cout << "Type password for employee priority:\t";

                  cin >> password;

                  if (password == "alitlawe")

                  cout << "Hoooray, empy module works!";                 

                              else

                              cout << "Sorry, this is not employee funcion password. Remember, impersonateing any of Salazaar Software employee is a criminal and may be wanting by police.";

                              }       

    if ( (priority != "admin") && (priority != "moderator") && (priority != "employee") )

    cout << "There's no " << priority << " priority";


     }


#endif

polecam również metodę definiowania nazwy takiej jak nazwa pliku co zapobiega dwukrotnemu włączeniu jakiegoś pliku nagłówkowego, taki dobry nawyk :wink:

I tylko przez using namespace std; pojawialy sie bledy?

No w sumie wystarczyło dodać

#include 

#include 

using namespace std;

do function.h

Mi nadal wyskakuja bledy po poprawkach

Złączono Posta : 26.03.2007 (Pon) 21:11

a twoj kod dziala - dlaczego? przeciez ja mam prawie identyczny nie liczac zabezpieczenia define

Złączono Posta : 26.03.2007 (Pon) 21:13

i po twoim kodzie program nie dzialla poprawnie - po prostu pojawia sie puste czarne okienko

Łatwiej spytać co zrobiłeś dobrze. Prawie nic.

int main () 

{ 

    void authorization (); 

}

Jeśli deklarujesz zwracany typ - zwracaj go.

int main () 

{ 

    void authorization (); 

    return 0;

}

Jeśli wywołujesz funkcję - nie pisz zwracanego typu.

int main () 

{ 

    authorization (); 

    return 0;

}

Poza tym zależnie od środowiska deklaracja użycia przestrzeni nazw std nie musi być wymagana (jest domyślna). Zwracam też uwagę na następujące kwestie:

  • dlaczego umieszczasz kod w pliku nagłówkowym?

  • dlaczego z jednej strony wykorzystujesz obiekty (cin, cout) a z drugiej piszesz strukturalnie?

  • dlaczego umieszczasz hasła w samym pliku?

Dwa ostatnie w sumie mocno filozoficzne, pierwsze wskazuje na to, że nie masz pojęcia o faktoryzacji kodu i pisaniu modułów.

Jeszcze drobiazg:

  • jak zadajesz pytanie: pisz jakiego środowiska używasz,

  • jak wyskakują Ci błędy - cytuj je.

Wrzuciłem go na warsztat do Anjuty i doprowadziłem do tego, żeby się kompilował, nie sprawdzałem działania.

Najlepiej chyba będzie jak jeszcze raz przemyślisz tan kod i napiszesz go jeszcze raz bo takie proste błędy robić to aż wstyd :stuck_out_tongue:

Jeszcze podpowiem, że aplikacje uruchamiane pod Windows w trybie poleceń, wymagają chyba uzupełnienia argumentów int main():

int main(int argc, char* argv[])

Nie wymagają. Gdyby wymagały to program nie kompilowałby się. Punktów startowych zdefiniowanych jest kilka, jeden z nich ma pustą (void) listę parametrów. Uważasz, że deklarowanie main() z parametrami jest dobrą praktyką? Nieużywane parametry też nie są najlepszym pomysłem.

Nie jest to konieczne

Umieszczam tam definicję funkcji. Dlaczego? Podział programu na moduły.

A jak najlepiej jest zabezpieczyć hasło?

A no to chyba DOS wymaga tych argumentów… nie wiem zresztą, nie używam :wink:

Dodam tylko, że skompilowałem to co wrzuciłem i u mnie działa (korzystam z Ubuntu 6.10, Anjuta 2.0.2, gcc 4.1.2 20060928)

Włącz raportowanie błędów na poziomie W4 to się przekonamy, czy to jest konieczne. Programowanie nie polega na zrobieniu czegoś, co działa, tylko na pisaniu solidnego kodu.

Umieściłeś tam implementację funkcji a nie jej prototyp i na to ci zwróciłem uwagę. Nie wiesz w związku z tym na czym polega podział na moduły.

Przechować hash i wpisaną wartość hashować; porównywać hashe.

To zależy od implementacji, generalnie jednak większość środowisk definiuje kilka różnych prototypów funkcji startowej (main, _main, wmain, _wmain; każda z kilkoma wariantami różniącymi się parametrami).

Sqlazack: przykładowy poprawny podział na moduły:

// main.cxx

#include "defs.hxx"

#include "module.hxx"


int main(int argc, char *argv[])

{

    ShowHelp(argv[0]);

    printf("Parametrów: %d\n", argc);

    return 0;

}

// defs.hxx

#ifndef __DEFS_H

#define __DEFS_H


#include 


#endif /* __DEFS_H */

// module.hxx

#ifndef __MODULE_H

#define __MODULE_H


// prototyp

void ShowHelp(char *wszProgramName);


#endif /* __MODULE_H */

// module.cxx

#include "defs.hxx"

#include "module.hxx"


// implementacja

void ShowHelp(char *wszProgramName)

{

    if (NULL == wszProgramName)

      printf("Blad!\n");

    else

      printf("Program: %s\n", wszProgramName);

}

W VC++ zamiast oplatać całość #ifndef #define#endif można na początku pliku nagłówkowego wpisać:

#pragma once