Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Podczas kompilacji programu wyskakuje dziwny log dotyczący std::string.

Ostatnio zmodyfikowano 2014-08-27 10:26
Autor Wiadomość
prostyy
Temat założony przez niniejszego użytkownika
Podczas kompilacji programu wyskakuje dziwny log dotyczący std::string.
» 2014-08-10 08:42:58
To mój program (nieskończony ale to nie ważne bo chce zobaczyć czy funkcja jest bez błędów)
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>

using namespace std;
int wczytajOsobe( string tabImie[ 0 ], string tabNazwisko[ 0 ], int tabWiek[ 0 ] )
{
    bool czyDobrze = cin.good();
    do
    {
        cout << "Podaj imie: ";
        cin >> tabImie[ 0 ];
        cin.good();
        cin.clear();
        cin.sync();
    } while( czyDobrze != true );
   
}


int main()
{
    string imie[ 2 ];
    string nazwisko[ 2 ];
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
}

Problem jest następujący. Podczas kompilacji wyskakuje coś takiego przy pierwszej pętli for w funkji int main()
D:\A_programowanie\test.cpp|27|error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_string<char>*}' for argument '1' to 'int wczytajOsobe(std::string*, std::string*, int*)'|

Proszę o pomoc.
 
P-115256
Mateus.
» 2014-08-10 09:14:31
C/C++
int wczytajOsobe( string tabImie[ 0 ], string tabNazwisko[ 0 ], int tabWiek[ 0 ] )
{
        bool czyDobrze = cin.good();

Tak nie tworzy się kopii tablic używanych w funkcji (chociaż tutaj powinna być raczej zmienna string, a nie tablica). To co jest w następnej linijce nie jest potrzebne. Można łatwiej sprawdzać. Poza tym funkcja
int
 musi zwracać wartość. Może powtórz podstawy zanim weźmiesz się za stringi.
P-115257
prostyy
Temat założony przez niniejszego użytkownika
» 2014-08-10 09:56:49
Tak brzmiało polecenie z kursu:
Napisz prosty program, który wczyta imię, nazwisko i wiek dwóch osób. Funkcja główna programu ma mieć następującą postać:

C/C++
int main()
{
    std::string imie[ 2 ];
    std::string nazwisko[ 2 ];
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
}

Jeżeli coś robię źle to czy możecie powiedzieć mi co to jest i jak to poprawić?
P-115258
Jacob99
» 2014-08-10 10:54:46
Na pewno to miało wykorzystywać tablicę stringów?. Co to jest za kurs?

A błąd wcale nie jest dziwny. Jeśli nie umiesz przetłumaczyć z angielskiego to brzmi on tak:

D:\A_programowanie\test.cpp|27|błąd: nie można przekonwertować 'std::string {aka std::basic_string<char>}' na 'std::string* {aka std::basic_string<char>*}' dla argumentu '1' w 'int wczytajOsobe(std::string*, std::string*, int*)'|
 
P-115259
Monika90
» 2014-08-10 11:06:39
Jeżeli funkcja main musi mieć podaną postać, to parametry funkcji wczytajOsobe muszą być referencjami.
P-115260
Mateus.
» 2014-08-10 11:38:24
W funkcji
wczytajOsobe
 możesz odbierać argumenty np. tak:
int wczytajOsobe( string & tabImie, string & tabNazwisko, int & tabWiek )
Stringi nie muszą być zabezpieczane przed błędem wczytania, bo może w nich być chyba wszystko.
Natomiast zmienna
tabWiek
 musi być przed błędnymi danymi zabezpieczona. Z funkcją
wypiszOsobe
 nie powinieneś mieć problemów, bo to jedna linijka kodu :-)
P-115262
prostyy
Temat założony przez niniejszego użytkownika
» 2014-08-10 16:32:57
Myślę, że to mi pomoże ale męczyłem się z tym tak długo, że wezmę się za to jutro :). Dzięki wszystkim.
Ps. Jacob99 to jest kurs z tej strony czyli cpp0x.pl.
P-115278
radek04
» 2014-08-26 16:56:34
Mam bardzo podobny problem.
To moja pierwotna wersja:
C/C++
#include <iostream>
#include <string>

int wczytajOsobe( std::string im[], std::string n[], int w[] )
{
    std::cout << "Wpisz imie nr 1: ";
    std::cin >> im[ 0 ];
    std::cout << "Wpisz nazwisko nr 1: ";
    std::cin >> n[ 0 ];
    std::cout << "Wpisz wiek nr 1: ";
    std::cin >> w[ 0 ];
   
    std::cout << "Wpisz imie nr 2: ";
    std::cin >> im[ 1 ];
    std::cout << "Wpisz nazwisko nr 2: ";
    std::cin >> n[ 1 ];
    std::cout << "Wpisz wiek nr 2: ";
    std::cin >> w[ 1 ];
   
    return 0;
}

int wypiszOsobe( std::string im[], std::string n[], int w[] )
{
    std::cout << "Imie 1: " << im[ 0 ] << "\n" << std::cout << "Nazwisko 1: " << n[ 0 ] << "\n" << std::cout << "Wiek 1: " << w[ 0 ] << "\n";
    std::cout << "Imie 2: " << im[ 1 ] << "\n" << std::cout << "Nazwisko 2: " << n[ 1 ] << "\n" << std::cout << "Wiek 2: " << w[ 1 ] << "\n";
   
    return 0;
}

int main()
{
    std::string imie[ 2 ];
    std::string nazwisko[ 2 ];
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
}

To rozwiązany problem (z pomocą Internetu):
C/C++
#include <iostream>
#include <string>

int wczytajOsobe( std::string & im, std::string & n, int & w )
{
    std::cout << "Wpisz imie: ";
    std::cin.clear();
    std::cin.sync();
    std::cin >> im;
    std::cout << "Wpisz nazwisko: ";
    std::cin.clear();
    std::cin.sync();
    std::cin >> n;
    std::cout << "Wpisz wiek: ";
    std::cin.clear();
    std::cin.sync();
    std::cin >> w;
   
    return 0;
}

int wypiszOsobe( std::string & im, std::string & n, int & w )
{
    std::cout << std::endl << "Imie: " << im << std::endl << "Nazwisko: " << n << std::endl << "Wiek: " << w << std::endl;
   
    return 0;
}

int main()
{
    std::string imie[ 2 ];
    std::string nazwisko[ 2 ];
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
}

Tylko nie do końca rozumiem, dlaczego np. w funkcji
wczytajOsobe
 jako argumenty nie muszą wystąpić tablice np.
std::string im[]
 czy też
std::string & im[]
.

Przecież w trakcie kursu tak się uczyliśmy w rozdziale 19.
Może mi to ktoś wyjaśnić? Chyba nic z kursu nie opuściłem, ale tego nie mogę zrozumieć.
P-116148
« 1 » 2 3
  Strona 1 z 3 Następna strona