Ir para o conteúdo
kvyil

"Passar" vector para uma função

Mensagens Recomendadas

kvyil

Boa noite caros programadores :P

Estou mais uma vez com um enorme problema, a situação é a seguinte:

- Tenho uma função com o mome de jogo. em que já devem conhecer que serve para gerar um numero aleatório, as tentativas para acertar no numero aleatório são guardadas num vector.

- Estou a tentar criar uma outra função que seja responsável por guardar os valores desse vector num ficheiro.

A minha grande questão é, como é que chamo a função de criar ficheiros no sitio onde pretendo e como passo o array da função do jogo

para a que seja manipulado na função criar ficheiros. Espero ter me feito entender.  :)

O código da função jogo é o seguinte:


void jogo () {
         int palpite [100];
         int b=0, a=0, alea, num, qtd=0;
         clock_t start, end; //tipo de dados para a biblioteca Time
         double elapsed; 
         start = clock();//inicio da contagem do tempo 
                cabecalho();                
                printf("Adivinhe o n%cmero entre 0 e 100: ", 163);//pede o numero ao user pela primeira vez
                scanf("%d", &num); 
                //srand(time(NULL));//gera um numero aleatorio cada vez que é executado o programa
                alea=rand()%100+1;//gera o numero entre 0 e 100
                while(num !=alea){ //repete o ciclo enquanto o numero for diferente do gerado
                
                palpite [a++] = num; //regista o palpite no array 
                                 if(num <alea) //se o numero for nemor que o aleatorio faz o seguinte: 
                                             {
                                                  qtd++;//Encrementador que conta o numero de tentativas
                                                  system("color 04");// amarela, quando o numero menor que o gerado pelo programa
                                                  printf("N%cmero escolhido menor que o pretendido, AUMENTE um pouco\n\n",163);
                                                  printf("Digite outro n%cmero inteiro entre 0 ate 100: ",163);
                                                  scanf("%d", &num);
                                                  system("cls");//limpa a consola de tudo o que foi escrito
                                                  cabecalho();
                                              }
                                 else //se não for nanor então é maior que o pretendido e faz: 
                                      {
                                              system("cls");//limpa a consola de tudo o que foi escrito
                                              cabecalho();
                                              qtd++;//Encrementador que conta o numero de tentativas
                                              system("color 06");// vermelha ser utilzado quando o utilizador inserir um numero maior
                                              printf("N%cmero escolhido maior que o pretendido, DIMINUA um pouco\n\n",163);
                                              printf("Digite outro n%cmero inteiro entre 0 ate 100: ",163);
                                              scanf("%d", &num);
                                              system("cls");//limpa a consola de tudo o que foi escrito
                                              cabecalho();
                                      }
                } //então sai do ciclo se o numero digitado for igual ao gerado
                system("color 02");//verde, é utilizada quando o utilizador acerta no numero
                end = clock();//fim da contagem do tempo do programa
                elapsed = ((double) (end - start)) / CLOCKS_PER_SEC; //calcula a difereça do tempo inicial com o final 
                system ("cls");
                cabecalho();
                printf ("Parab%cns acertou no n%cmero!!\n\n", 130, 163);
                printf ("Resultado da Jogada:\n\n"); //felicita o utilizador por ter acertado no numero
                printf ("O n%cmero correcto: %d\n", 163, alea); //Diz então qual foi o numero gerado
                printf ("Tentativa(s) usada(s): %d\n", qtd); //mostra as tentativas utilizadas   
                printf ("Tempo: %.2f segundos \n\n",elapsed); //apresenta o tempo que demorou - diferena do end e do start                
                printf ("As tentativas usadas foram as seguintes:\n"); 
                for (b = 0; b < a; b++){ //ciclo que mostra as tentativas do array
                printf("%d, ", palpite[b]);}
                printf ("\n");


está parte está a funcionar como o esperado, só queria mesmo era saber como chamo a função de criar ficheiro logo a seguir a este código, e depois como passo para a função de criar ficheiro os dados do array.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

void guarda(int array[], int num_elems) {
    // do something
}

ou

void guarda(int* array, int num_elems) {
    // do something
}

E passas com o nome do array:

guarda(nome_do_array, numero_de_elementos);


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
kvyil

Devo estar a fazer alguma coisa de errado. Porque ele cria-me um ficheiro com texto que nunca mais acaba :(

eu declaro a função antes da main:

void cria_ficheiro(int *aleatorio, int *quantidades, double *tempo, int *conta_a, int *conta_b, int vector, int *num_b);


depois chamo-a da seguinte forma:

cria_ficheiro (&alea, &qtd, &elapsed, &b, &a, &palpite, &elementos);


e por fim é assim que ela está criada:

void cria_ficheiro (int *aleatorio, int *quantidades, double *tempo, int *conta_a, int *conta_b, int vector, int *num_b)
{             
                  FILE *fp;
                  fp = fopen ("resultado.txt", "w");
                  for (conta_b = 0; conta_b < conta_a; conta_b++){ //ciclo que mostra as tentativas do array
                  fprintf (fp, "As tentativas foram: %d \n", vector, *num_b);}
                  fprintf (fp, "O numero aleaatorio foi: %d, as tentativas %d , e tempo foi %f \n", *aleatorio, *quantidades, *tempo);
                  fclose (fp);                 
                  //printf ("O numero aleaatorio foi: %d, as tentativas %d , e tempo foi %f \n", *aleatorio, *quantidades, *tempo);
}


Acho que me estou a confundir com os apontadores e não sei o que realmente é passado para a função se é o valor de cada posição do array ou se é o endereço de memoria :confused:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Estás a passar o endereço de memória para tudo. É para isso que serve o & antes da variável. Repara também que um array funciona da mesma forma que um ponteiro. O nome da variável que representa o array é o ponteiro para a primeira posição do array. O índice soma ao ponteiro o valor*sizeof(type_of_array).

Aquilo que estás a fazer é enviar o endereço para o endereço do array, logo, em vez de acederes ao array, vais aceder a um sítio que tem o endereço para o array:

&array -> array -> (0) (1) (2) (3) ...

O que estás a fazer:

&array -> (0) (1) (2) (3) ...

Sendo que esses valores não estão aí. Logo estás a aceder a "lixo".

A mesma coisa para o ponteiro do número de elementos (que assumo que é a tua variável quantidades). Tu tens um valor, por exemplo 52 que está num determinado local de memória. Tu estás a enviar o ponteiro para a função. O que recebes lá é um endereço:

&quantidades -> (quantidades) 52

A não ser que queiras alterar o valor dessa variável dentro da função, não faz sentido estares a enviar um ponteiro para lá. Basta enviares o valor, ou seja, a variável quantidades, per se.

Se queres enviar o ponteiro para dentro da função, mas queres ler conteúdo dessa variável, tens que indicar em código:

//main
int quantidades = 52;
int x = &quantidades; // x tem o endereço de memória onde está o 52 (isto não é correcto, não compila correctamente em 64-bit)
int y = quantidades; // y tem o valor 52

funcao(&quantidades);

//... fim do main

void funcao(int *quantidades) {
    int x = quantidades; // x tem o endereço de memória onde está o 52 (isto não é correcto, não compila correctamente em 64-bit)
    int y = (*quantidades); // y tem o valor 52
}


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.