[C++] Problem z wywołaniem funckji


(Salazaar) #1

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?


(Airborn) #2

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


(Sawyer47) #3

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;.


(Salazaar) #4

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


(Sawyer47) #5

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.


(Salazaar) #6

[Linker error] undefined reference to `priority'

[Linker error] undefined reference to `priority'


(Sawyer47) #7

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:


(Salazaar) #8

I tylko przez using namespace std; pojawialy sie bledy?


(Sawyer47) #9

No w sumie wystarczyło dodać

#include 

#include 

using namespace std;

do function.h


(Salazaar) #10

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


(Ryan) #11

Ł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.


(Sawyer47) #12

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[])

(Ryan) #13

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.


(Salazaar) #14

Nie jest to konieczne

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

A jak najlepiej jest zabezpieczyć hasło?


(Sawyer47) #15

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)


(Ryan) #16

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