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

"error: b was not declared in this scope"

Ostatnio zmodyfikowano 2013-11-24 16:02
Autor Wiadomość
malwareX
Temat założony przez niniejszego użytkownika
"error: b was not declared in this scope"
» 2013-11-24 13:12:59
Witam wszystkich mam do wykonania zadanie o następującej treści
"Utworzyć 3 funkcje (podprogramy) o nazwach Setup, Run i Cleanup
/*         i przenieść do nich część odpowiedzialną za inicjalizację, obliczenia
/*         oraz zakończenie (pauza) programu."



Oto mój kod

C/C++
#include <iostream>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void Setup()

{
   
    int i;
    double a, b, c, rand_max;
    setlocale( LC_ALL, "" );
    srand( time( NULL ) );
    rand_max = RAND_MAX;
}

void Run()

{
    Setup();
    for( i = 0; i < 100; i++ )
    {
        do
        {
            a = rand() / rand_max * 30.0 + 10.0;
            b = rand() / rand_max * 30.0 + 10.0;
            c = rand() / rand_max * 30.0 + 10.0;
        }
        while
        ( a + b < c );
       
        ( b + c < a );
        ( a + c < b );
        printf( "%g %g %g\n", a, b, c );
    }
}

void Cleanup()
{
    system( "pause" );
}


int main( void )
{
    Setup();
    Run();
    Cleanup();
    return 0;
}


A to błędy:
 
D:\344\main.cpp||In function 'void Setup()':|
D:\344\main.cpp|12|warning: unused variable 'i' [-Wunused-variable]|
D:\344\main.cpp|13|warning: unused variable 'a' [-Wunused-variable]|
D:\344\main.cpp|13|warning: unused variable 'b' [-Wunused-variable]|
D:\344\main.cpp|13|warning: unused variable 'c' [-Wunused-variable]|
D:\344\main.cpp|13|warning: variable 'rand_max' set but not used [-Wunused-but-set-variable]|
D:\344\main.cpp||In function 'void Run()':|
D:\344\main.cpp|23|error: 'i' was not declared in this scope|
D:\344\main.cpp|27|error: 'a' was not declared in this scope|
D:\344\main.cpp|27|error: 'rand_max' was not declared in this scope|
D:\344\main.cpp|28|error: 'b' was not declared in this scope|
D:\344\main.cpp|29|error: 'c' was not declared in this scope|
D:\344\main.cpp|32|error: 'a' was not declared in this scope|
D:\344\main.cpp|32|error: 'b' was not declared in this scope|
D:\344\main.cpp|32|error: 'c' was not declared in this scope|
||=== Build finished: 8 errors, 5 warnings (0 minutes, 0 seconds) ===|

Z tego co rozumiem po logach muszę zadeklarować jeszcze raz wszystkie zmienne z 1 funkcji ,więc w jaki sposób to zrobić skoro jej wywołanie(  Setup();  ) nie daje żadnego skutku ? Bo inicjalizacja to (tak mi się wydaje ) deklarowanie zmiennych czy się mylę ?
P-97270
Pokropow
Zmienne lokalne
» 2013-11-24 13:36:33
zmienne a, b i c są stworzone w funkcji setup() i tylko tam są widoczne. Jak chcesz z nich korzystać poza funkcją to stwórz je jako globalne lub przekaż je jako argumenty do innych funkcji.
P-97274
Buby
» 2013-11-24 13:43:13
Polecam użycie referencji.
Spójrz:

C/C++
#include <iostream>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void Setup( int & rand_max ) /* Deklarujemy argumenty funkcji jako refernecje */
{
    setlocale( LC_ALL, "" );
    rand_max = RAND_MAX;
}

void Run( double & a, double & b, double & c, double & rand_max ) /* tutaj tez */
{
    Setup();
    for( i = 0; i < 100; i++ )
    {
        do
        {
            a = rand() / rand_max * 30.0 + 10.0;
            b = rand() / rand_max * 30.0 + 10.0;
            c = rand() / rand_max * 30.0 + 10.0;
        }
        while
        ( a + b < c );
       
        ( b + c < a );
        ( a + c < b );
        printf( "%g %g %g\n", a, b, c );
    }
}

void Cleanup()
{
    system( "pause" );
}


int main( void )
{
    srand( time( NULL ) );
    int i = 0;
    doube a, b, c, rand_max;
    Setup( rand_max ); /* Podajemy zmienne jako argumenty */
    Run( a, b, c, rand_max ); /* tutaj tez*/
    Cleanup();
    return 0;
}

Polecam poczytać Ci o referencjach - kurs c++ na tej stronie.
P-97279
Pokropow
» 2013-11-24 13:50:24
Jeżeli nie wiesz co to referencje to można też stworzyć zmienne globalne

C/C++
#include <iostream>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

double a, b, c, rand_max;
void Setup()

{
    setlocale( LC_ALL, "" );
    srand( time( NULL ) );
    rand_max = RAND_MAX;
}

void Run()

{
    Setup();
    for( int i = 0; i < 100; i++ )
    {
        do
        {
            a = rand() / rand_max * 30.0 + 10.0;
            b = rand() / rand_max * 30.0 + 10.0;
            c = rand() / rand_max * 30.0 + 10.0;
        }
        while
        ( a + b < c );
       
        ( b + c < a );
        ( a + c < b );
        printf( "%g %g %g\n", a, b, c );
    }
}

void Cleanup()
{
    system( "pause" );
}


int main( void )
{
    Setup();
    Run();
    Cleanup();
    return 0;
}
P-97281
Buby
» 2013-11-24 13:54:58
@Pokropow,
używanie zmiennych globalnych jest złem wcielonym.
Przykładowo, jeśli używasz ich w funkcji, z tego co zrozumiałem
następuje kopiowanie zmiennej do adresu i operowanie na kopii.
Co sprawia, że zajmujemy niepotrzebnie dodatkową pamięć.
Poza tym jeśli zmienimy zmienną globalną w funkcji a, to w funkcji b
jej wartość będzie taka jak przy deklaracji. Możemy to ominąć za pomocą
referencji lub wskaźnika.
P-97283
kubek3898
» 2013-11-24 13:59:49
Używanie
system()
 też jest nie zalecane i odradzane, a jednak w tym programie występuje. Jeśli pytającemu lepiej używać zmiennych globalnych to niech ich używa :). Po kodzie widać, że jest dość początkujący, także temat referencji może być dla niego ciut niezrozumiały.
P-97286
Pokropow
» 2013-11-24 14:13:10
Oczywiście że korzystanie ze zmiennych globalnych jest złem wcielonym (chociaż nie dlatego,że marnują pamięć,ale dlatego że nie powinno być dwóch zmiennych o tej samej nazwie) ale w małych projektach , w których mamy tylko kilka zmiennych można  nich spokojnie korzystać(byle miały unikalne nazwy).
P-97290
kynol
» 2013-11-24 14:34:38
Dokladnie , zmienne globalne mozna uzywac ale sa odradzane, w tym przypadku tak jak Buby napisal uzywaj referencji, jesli nie wiesz co to, to poczytaj na google, w skrocie Ci powiem ze dzialaja one na oryginalnych obiektach
P-97295
« 1 » 2
  Strona 1 z 2 Następna strona