Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

PsySc0rpi0n

[Resolvido] Funções e ponteiros

Mensagens Recomendadas

PsySc0rpi0n

Boas novamente...

Vou ter exame na quinta-feira de linguagem C e preciso de ajuda...

As minhas dúvidas neste momento são na interacção entre ponteiros e funções, ou seja, em retirar mais que uma informação de uma função.

Já criei dois programas com esse efeito.

Um deles é um programa que apresenta as duas raízes de um polinómio de 2º grau no ecrã através de uma função.

#include <stdio.h>
#include <math.h>
float bin (float a, float b, float c, float *x2){
  float delta, x1;
  delta = pow (b, 2)-4*a*c;
  x1 = ((-b)+sqrt (delta))/(2*a);
  *x2 = ((-b)-sqrt (delta))/(2*a);
  return x1;
}
int main () {
  float a, b, c, delta, x1, x2;
  int i, j, k;
  for (i=0; i<50; i++) //Desenha ====== e *
 printf ("=");
  printf ("\n*");
  for (j=0; j<15; j++) //Corrige os espaços à esquerda e centra
 printf (" ");
  printf ("FÓRMULA RESOLVENTE");
  for (k=0; k<15; k++) //Corrige os espaços à direita
 printf (" ");
  printf ("*\n");
  for (i=0; i<50; i++) //Desenha ======
 printf ("=");
  printf ("\n");
//======Do not edit unless you know what you're doin'!!!================
  printf ("Introduza a, b e c: \n");
  scanf ("%f%f%f", &a, &b, &c);
  delta = pow (b, 2)-4*a*c;
  if (delta < 0 || a == 0)
 printf ("Não tem raízes reais ou o \"a\" é zero!\n");
  else {
 x1= bin (a, b, c, &x2);
 printf ("Raíz 1 = %.2f\tRaíz 2 = %.2f\n", x1, x2);
  }
getchar ();
return 0;
}

O outro é um programa que pede dois valores e apresenta a soma e a subtracção desses números através de uma função.

#include <stdio.h>
float add_subt (float num1, float num2, float *a, float *b) {
  *a = num1 + num2;
  *b = num1 - num2;
}
int main (void){
  float a, b;
  float num1, num2;
  printf ("Introduza dois números: \n");
  scanf ("%f%f", &num1, &num2);
  add_subt (num1, num2, &a, &b);
  printf ("A soma dos dois números é %.2f e a subtracção é %.2f \n", a, b);

getchar ();
return 0;
}

Uma das dúvidas que tenho é:

No caso do segundo programa, eu declaro as variáveis "a" e "b" porque as estou a enviar como argumentos de uma função ou porque as vou usar no último printf?

Ou a pergunta feita de outra maneira:

Numa função main, eu tenho que declarar as variáveis que vou enviar a uma outra função como argumentos?

Depois de me responderem a esta e de eu entender eu coloco a seguinte dúvida senão acabo por me baralhar todo...

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Numa função main, eu tenho que declarar as variáveis que vou enviar a uma outra função como argumentos?

Basicamente, sim.

As variaveis tem que existir antes do seu endeereco ser enviado para outra funcao, mas podem comecar a existir de outras formas diferentes de declaracao/definicao.

Piquinhice: a delaracao duma variavel nao cria essa variavel obrigatoriamente (se nao for uma definicao).

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Os argumentos que as funções recebem não têm que ser obrigatoriamente usados para cálculos, pois não?

No caso da função add_subt, os dois ponteiros não foram usados em cálculos.

Ou seja, quando numa função são declarados ponteiros como argumentos, esses argumentos na realidade não enviam valores vindos da função mais mas sim endereços de memória de variáveis que foram declaradas na função main, correcto? Está correcto o meu raciocínio?


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

a resposta simples é : sim.

se a função necessita de uma variável, ela tem de estar definida (declarada) antes dessa chamada.

agora, a resposta complicada é : depende.

a resposta à tua pergunta é um pouco mais complexa do que parece. primeiro de tudo tens de perceber duas coisas:

- a passagem de argumentos para uma função é sempre por valor (em C)

- estamos a falar do envio de ponteiros para a função

para te explicar o primeiro ponto tem atenção que o que estás a enviar realmente para a função é um endereço de memória.

é isso que estás a fazer quando fazes:

add_subt (num1, // estás a enviar o valor guardado na variável "num1"
         num2, // estás a enviar o valor guardado na variável "num2"
         &a,   // estás a enviar o endereço de memória da variável "a"
         &b);  // estás a enviar o endereço de memória da variável "b"

agora a parte que é "chata" :

como estas a enviar um endereço de memória, nada te obriga que o valor enviado seja uma referência a uma variável existente.

exemplo:

#include <math.h>
#include <stdio.h>

void potencia(double base,
             double expoente,
             double * resultado)
{
   double res = pow(base, exp)

   if (resultado == NULL)
   {
     printf("O resultado e : %lf\n", res);
   }
   else
   {
     *resultado = res; 
   }
}

int main()
{
 double res;

 potencia(10, 2, &res); // como estou a fornecer a variável, é claro que necessitas a ter declarado
 potencia(10, 3, NULL); // não estou a fornecer a variável, logo não necessito de declarar nada

 return 0;
}

33

no final : se estás a fornecer a variável, é claro que ela tem de "existir", mas a sua necessidade depende sempre da implementação e uso desta dentro da função.

----

no teu código, apesar de não ser usado nos cálculos, estás a "usar" o valor ao aplicar a operação unária de "desreferenciação" (operador *). Logo, terá de ser sempre um endereço válido, porque caso contrário, terás acessos inválidos de memória.

no entanto podes alterar facilmente o código para combater essa obrigatoriedade:

// alterei o tipo de retorno porque não tinhas a retornar nada
void add_subt (float num1,
              float num2,
              float *a,
              float *b) {

 if (a != NULL)
   *a = num1 + num2;

 if (b != NULL)
   *b = num1 - num2;
}

deste modo, nada te impede de enviar o valor de NULL nos argumentos "a" e/ou "b" ...

Editado por HappyHippyHippo
  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Acho que percebi mais ou menos embora ache que ainda não precise de conhecer esse conceito... Mas é bom alargar os conhecimentos...


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Agora tenho este exercício para tentar fazer:

Escreva uma função que recebe como dados de entrada dois números

inteiros N1 e N2 (N1 tem de ser menor que N2). A função deve devolver a soma dos

números que são múltiplos de 3 e a soma dos números pares do conjunto de valores

compreendidos entre N1 e N2 inclusive. A função deve ainda devolver o valor 0 se

não existirem números pares e 1 para as restantes situações.

Escreva a função Main que permite pedir dados e verificar se N1 é menor

que N2 e só chamar a função desenvolvida na alínea a) quando os números N1 e N2

forem introduzidos correctamente, apresentando de seguida os resultados devolvidos

pela função.

Eu tenho o seguinte code mas não me está a funcionar bem...

#include <stdio.h>
int mult3_par (int num1, int num2, int *respar, int *resmult3) {
  int i;
  for (i = num1; i<= num2; i++) {
  if (i%2)
	 ;
  else {
	 *respar += i;
	 return 1;
  }
  }

  for  (i = num1; i <= num2; i++){
  if (i%3)
	 ;
  else {
	 *resmult3 += i;
	 return 0;
  }
  }
}




int main (void){
  int respar = 0, resmult3 = 0, num1, num2;
  printf ("Introduza dois números inteiros, o segundo maior que o primeiro: \n");
  scanf ("%d%d", &num1, &num2);
  if (num1 < num2){
  respar = mult3_par (num1, num2, &respar, &resmult3);
  resmult3 = mult3_par (num1, num2, &respar, &resmult3);
  printf ("A soma dos números pares é %d!\n", respar);
  printf ("A soma dos números ímpares múltiplos de 3 é %d!\n", resmult3);
  }
  else
 printf ("O segundo número é menor que o primeiro!");

getchar ();
return 0;
}

Não consigo copiar o code da consola para aqui e ficar a identação correcta...

Edited;

Na consola dá-me estes erros:

exame_normal_11_12_3a.c: In function ‘mult3_par’:
exame_normal_11_12_3a.c:25:1: warning: control reaches end of non-void function [-Wreturn-type]
exame_normal_11_12_3a.c: In function ‘mult3_par’:
exame_normal_11_12_3a.c:25:1: warning: control reaches end of non-void function [-Wreturn-type]
/tmp/ccdPY7TD.o: In function `mult3_par':
exame_normal_11_12_3a.c:(.text+0x0): multiple definition of `mult3_par'
/tmp/ccG184VK.o:exame_normal_11_12_3a.c:(.text+0x0): first defined here
/tmp/ccdPY7TD.o: In function `main':
exame_normal_11_12_3a.c:(.text+0x99): multiple definition of `main'
/tmp/ccG184VK.o:exame_normal_11_12_3a.c:(.text+0x99): first defined here
collect2: error: ld returned 1 exit status

Não sei porquê mas no ideone.com não dá erros...

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

1º - porque estás a fazer return no meio do ciclo ?

2º - porque estás a gravar o valor de retorno da função, visto que este valor não tem significado ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Ok... Vou tentar corrigir...

E quanto aos erros de compilação?

Esquece essa parte...

Já corrigi o code mas o resultado está a dar o dobro do desejado...

#include <stdio.h>
int mult3_par (int num1, int num2, int *respar, int *resmult3) {
  int i;
  for (i = num1; i<= num2; i++) {
  if (i%2)
	 ;
  else {
	 *respar += i;
	 //return 1;
  }
  }

  for  (i = num1; i <= num2; i++){
  if (i%3)
	 ;
  else {
	 *resmult3 += i;
	 //return 0;
  }
  }
}




int main (void){
  int respar = 0, resmult3 = 0, num1, num2;
  printf ("Introduza dois números inteiros, o segundo maior que o primeiro: \n");
  scanf ("%d%d", &num1, &num2);
  if (num1 < num2){
  mult3_par (num1, num2, &respar, &resmult3);
  mult3_par (num1, num2, &respar, &resmult3);
  printf ("A soma dos números pares é %d!\n", respar);
  printf ("A soma dos números ímpares múltiplos de 3 é %d!\n", resmult3);
  }
  else
 printf ("O segundo número é menor que o primeiro!");
getchar ();
return 0;
}

O enunciado dizia ainda que a função deveria retornar 0 se não houvesse pares e 1 caso contrário...

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

- andas a referenciar o ficheiro .c duas vezes no gcc

- depois de executar os dois ciclos for, não tens nada a ser retornado


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

A parte dos erros já resolvi...

Agora o facto de o resultado estar a dar em dobro é que ainda não topei... Estou quase lá mas ainda não foi desta...

Edited;

Já consegui...

Agora só falta arranjar a parte de retornar 0 se não houver pares e retornar 1 caso contrário...

#include <stdio.h>
void mult3_par (int num1, int num2, int *respar, int *resmult3) {
  int i;
  for (i = num1; i<= num2; i++) {
  if (i%2)
	 ;
  else {
	 *respar += i;
  }
  }

  for  (i = num1; i <= num2; i++){
  if (i%3)
	 ;
  else {
	 *resmult3 += i;
  }
  }
}




int main (void){
  int respar = 0, resmult3 = 0, num1, num2;
  printf ("Introduza dois números inteiros, o segundo maior que o primeiro: \n");
  scanf ("%d%d", &num1, &num2);
  if (num1 < num2){
  mult3_par (num1, num2, &respar, &resmult3);
  printf ("A soma dos números pares é %d!\n", respar);
  printf ("A soma dos números múltiplos de 3 é %d!\n", resmult3);
  }
  else
 printf ("O segundo número é menor que o primeiro!");
getchar ();
return 0;
}

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

bem, nesse caso já sabes que terás de retornar algo. lembra-te também que retornar um valor termina por completo a execução da função.


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Pronto, o programa ficou assim, embora os returns da função sejam inúteis mas podia pôr um printf na função main a mostrar os retornos...

#include <stdio.h>
int mult3_par (int num1, int num2, int *respar, int *resmult3) {
  int i;
  for (i = num1; i<= num2; i++) {
  if (i%2)
	 ;
  else {
	 *respar += i;
  }
  }
  for  (i = num1; i <= num2; i++){
  if (i%3)
	 ;
  else {
	 *resmult3 += i;
  }
  }
  if (*respar)
 return 0;
  else
 return 1;
}

int main (void){
  int respar = 0, resmult3 = 0, num1, num2;
  printf ("Introduza dois números inteiros, o segundo maior que o primeiro: \n");
  scanf ("%d%d", &num1, &num2);
  if (num1 < num2){
  mult3_par (num1, num2, &respar, &resmult3);
  printf ("A soma dos números pares é %d!\n", respar);
  printf ("A soma dos números múltiplos de 3 é %d!\n", resmult3);
  }
  else
 printf ("O segundo número é menor que o primeiro!");
getchar ();
return 0;
}

Eu agora preciso de ajuda para fazer o seguinte exercício, tendo sempre em mente os meus conhecimentos, pois vou ter exame na quinta-feira e apenas posso usar o que foi dado nas aulas...

O exercício pede o seguinte:

Escrever um programa que peça uma string e inverta a string, ou seja, o output deve ser o seguinte com a seguinte string inserida peli user:

Teste

output:

Teste

eTest

teTes

steTe

esteT

E não estou a ver como fazer isto.

Aliás, a minha primeira ideia era copiar o caractere da última posição para a primeira, o da penúltima posição para a segunda e etc...

Mas acho que não vai funcionar porque ao colocar o caractere da última posição na primeira vai acontecer isto:

Teste

eeste

não é?

Outra dúvida é se posso guardar a string original noutra array assim

str_aux [] = str_vec;


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

dica :

- o que tens de fazer é trocar os caracteres

- para copiar a string usa a função strcpy

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Espero que não faça mal eu estar a falar de arrays numa thread que inicialmente era de funções e ponteiros...

O mecanismo já percebi que seria esse...

Depois pensei em copiar o último caractere para o primeiro mas depois não sabia quando parar. Agora estive a ver uma possível solução e não estou a perceber como é que aquele code faz o pretendido... Já tentei fazer tudo passo a passo no papel e não obtenho o resultado pretendido.

Vou gastar mais um bocado de tempo com isto...

O code que estou a tentar entender é este:

int i,j;
char frase[6]= "Teste" ,a;
for (i=0; i<5 ; i++)
{
 if(i==0)
  printf("%s\n",frase);
 else
 {
  for(j=4,a=frase[4]; j>0 ; j--)
  frase[j]=frase[j-1];
  frase[0]=a;
  printf("%s\n",frase);
 }
}
return 0;
}

Mas o resultado que eu vejo aqui é:

No for

j=4

último caractere fica com o terceiro

Teste -> Testt

j=3

o penúltimo caractere fica com o ante-penúltimo

Testt -> Tesst

j=2

o ante-penúltimo caractere fica com o caractere anterior ao ante-penúltimo

Tesst -> Teest

j=1

Teest -> TTest

frase[0]=a;

eTest

Acho que já percebi...

Estava-me a escapar o for externo...

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Bem, hoje não vou mais insistir neste exercício...

Estou a tentar fazer um outro que pede uma carrada de coisas...

Para já precisava de saber como passo para uma função um array, ou seja:

a minha função deve receber um array da função main como argumento mas não sei ao certo de como o fazer.

Será:

float funcao (float array1, char array2);

ou será:

float funcao (float array1 [], char array2 []);

É que estes arrays foram "preenchidos" através de um loop for da seguinte maneira:

for (i=0; i<MAX; i++){
  printf ("Introduza a altura: \n");
  scanf ("%f", &high [i]);
  printf ("Introduza o género (M/m ou F/f): \n");
  scanf (" %c", &gender [i]);
  }

O exercício pede

Escreva um programa que leia a altura (metros) e o sexo (M ou F) de 12

pessoas. O programa deverá apresentar como resultados: o menor valor de altura

introduzido, a média da altura dos homens, o número de mulheres e o sexo da pessoa

mais alta do grupo.

Estou a pensar em criar uma função para cada tarefa: uma função para apresentar o menor valor de altura, outra para a média da altura dos homens, outra para o número de mulheres e outra para o sexo da pessoa mais alta do grupo.

Senão criar apenas uma função e devolver o que preciso, tudo através de ponteiros...


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

não é por nada, mas o que necessitas fazer não é inverter uma string:

Teste -> esteT != Teste -> etseT

Será:

float funcao (float array1, char array2);

ou será:

float funcao (float array1 [], char array2 []);

o primeiro é claro que não ... estás a dizer que recebes um floar e um char (começa a usar double's !!!)

as soluções que tens é a tua segunda opção ou com ponteiros (novamente)

no entanto, tanto numa como noutra solução, estás a "perder" o tamanho do array:

#include <stdio.h>
#include <string.h>

void f1(double b[])
{
   printf("%ld\n", sizeof b); // output = 8 (bytes)
}

void f2(double * c)
{
   printf("%ld\n", sizeof c); // output = 8 (bytes)
}

void f3(double d[25])
{
   printf("%ld\n", sizeof d); // output = 8 (bytes)
}

int main(void) {
   double a[25];
   printf("%ld\n", sizeof a); // output = 200 (8*25 bytes)
   f1(a);
   f2(a);
   f3(a);
   return 0;
}

tens de arranjar uma maneira de teres a informação de tamanho do array na função

Estou a pensar em criar uma função para cada tarefa: uma função para apresentar o menor valor de altura, outra para a média da altura dos homens, outra para o número de mulheres e outra para o sexo da pessoa mais alta do grupo.

Senão criar apenas uma função e devolver o que preciso, tudo através de ponteiros...

tanto faz, mas lembra-te que na segunda opção podes usar o que apresentei aqui:

// alterei o tipo de retorno porque não tinhas a retornar nada
void add_subt (float num1,
              float num2,
              float *a,
              float *b) {

 if (a != NULL)
   *a = num1 + num2;

 if (b != NULL)
   *b = num1 - num2;
}

deste modo, nada te impede de enviar o valor de NULL nos argumentos "a" e/ou "b" ...

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Sobre como passar arrays pra funções já percebi.

Não percebo é porque é que perco o tamanho do array.

Quanto ao outro problema, vou criar um array para as alturas e outro para o género e preenchê-los no mesmo loop for e assim cada altura fica associada ao respectivo género.

Depois na função é que vou tentar fazer a comparação dos valores e enviar para a função main. . .

Achas que estou a pensar bem?


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Quanto ao outro problema, vou criar um array para as alturas e outro para o género e preenchê-los no mesmo loop for e assim cada altura fica associada ao respectivo género.

isso levaria a teres dois arrays separados. o que não é muito interessante

o que se faz é criar uma estrutura que engloba toda a informação de uma entidade a ser manipulada:

typedef enum
{
 Masculino,
 Feminino
} Genero;

typedef struct
{
 double altura;
 Genero genero;  
} Pessoa;

depois é só criar um array desse tipo de dados

Pessoa lista[20];

lista[0].altura = 1.75;
lista[0].genero = Masculino;

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Pois mas ainda não falámos nesse tipo de ferramentas. . .

Terei que me arranjar sem ela. . .

Nestas condições, será que o meu raciocínio é viável?

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Ah, faltou ali explicar porque perco o tamanho do array quando faço a passagem para a função e como fazer para contornar o problema. . .


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

porque estás a enviar um endereço de memória, um número.

o código (tipo de dados) é que diz como interpretar os dados existentes nessa memória:

como resolver :

- sabes o tamanho antes de chamar a função

- não sabes dentro da função

- como fazer para saber dentro da função ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Estamos aqui a falar de quanta memória é usada pelo array ou do tamanho com que eu declaro o array?

Se for a primeira situação, podemos usar o

sizeof (array [25]); 

Se for o tamanho com que eu declarei a array, não estou a ver. . .

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o que necessitas saber é a quantidade de elementos que o array tem, isto dentro da função.

repara:

int main()
{
 double a[25];

 printf("%ld\n", sizeof(a)); // output = 200 (8*25 > 8 bytes de cada double * 25 posições do array)

 // qual o output aqui ?
 printf("%ld\n", sizeof(a) / sizeof(double));

 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

O output será o tamanho do array -> 25. . .

E agora) essa manipulação é feita na função de que forma?

Atribuo esse valor como tamanho da array já dentro da função?

double array1 [sizeof (*array1) / siseof (double) ] ; 

Será isto?

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

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.