Ir para conteúdo
Fórum Script Brasil
  • 0

Manipular variáveis em arquivos diferentes


Marcia Rosa

Pergunta

Olá,

Estou iniciando no desenvolvimento C. Estou com o seguinte problema:

-Tenho dois arquivos: arq1.c e arq2.c.

-Fiz um include do arq2.c dentro do arq1.c onde chamo uma função do arq2.c.

-Dentro do arq2.c tenho uma variável char nome que recebe um valor tratada dentro da função invocada.

-Como faço para receber essa variável dentro do arq1.c que chamou a função?

Obrigada.

Márcia.

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0
void teste(int *x) {

*x = 12;

}

// ...

int x = 0; // x é igual a 0

teste( &x ); // agora x é igual a 12

Mnemonic,

Até tentei fazer isso só que dá erro que a variável x não foi declarada.

Declarei ela no arq2.c; fiz include do arq2.c no arq1.c e após invocar o método que preenche o valor de X no arq2.c dei um print para exibir o valor de X.

Continuo na mesma.

Obrigada pela tentativa.

Link para o comentário
Compartilhar em outros sites

  • 0

Márcia,

Acho que sua dificuldade está em diferenciar como passar valor de variável e passar variável por referência.

Arquivo1
main()
{
   int x =0;
   
   Metodo1( x ); // Aqui você está passando o valor de X, que é 0. Qualquer operação neste método não altera x do arquivo1.
   printf("X = %d", x ); // Aqui vai printar 'X = 0'

   Metodo2( &x ); // Aqui você está passando uma referencia ao endereço de memória da variável X. Operação no método altera x aqui.
   printf("X = %d", x ); // Aqui vai printar 'X = 12'
}

Arquivo2

Metodo1( int x )
{
   x = 12; // x no caso é simplesmente uma variável local
}

Metodo2( int *x )
{
   *x = 12; // aqui altera o valor da variável local x do Arquivo1
}

Espero ter ajudado,

WebPantoja

Editado por webpantoja
Link para o comentário
Compartilhar em outros sites

  • 0
Márcia,

Acho que sua dificuldade está em diferenciar como passar valor de variável e passar variável por referência.

Arquivo1
main()
{
   int x =0;
   
   Metodo1( x ); // Aqui você está passando o valor de X, que é 0. Qualquer operação neste método não altera x do arquivo1.
   printf("X = %d", x ); // Aqui vai printar 'X = 0'

   Metodo2( &x ); // Aqui você está passando uma referencia ao endereço de memória da variável X. Operação no método altera x aqui.
   printf("X = %d", x ); // Aqui vai printar 'X = 12'
}

Arquivo2

Metodo1( int x )
{
   x = 12; // x no caso é simplesmente uma variável local
}

Metodo2( int *x )
{
   *x = 12; // aqui altera o valor da variável local x do Arquivo1
}

Espero ter ajudado,

WebPantoja

webpantoja,

Com certeza melhorou meu entendimento desse tal de *ponteiro. Vou testar essa sua dica e ver se vai dar certo. Pela lógica, creio que dará certo.

Antes preciso ver o por quê e fazer o meu compilador voltar a funcionar. Estava tudo bem até ontem a tarde. Assim que o refizer voltar a ativa, dou resposta no tópico.

Muito obrigada.

Márcia.

Link para o comentário
Compartilhar em outros sites

  • 0
Márcia,

Acho que sua dificuldade está em diferenciar como passar valor de variável e passar variável por referência.

Arquivo1
main()
{
   int x =0;
   
   Metodo1( x ); // Aqui você está passando o valor de X, que é 0. Qualquer operação neste método não altera x do arquivo1.
   printf("X = %d", x ); // Aqui vai printar 'X = 0'

   Metodo2( &x ); // Aqui você está passando uma referencia ao endereço de memória da variável X. Operação no método altera x aqui.
   printf("X = %d", x ); // Aqui vai printar 'X = 12'
}

Arquivo2

Metodo1( int x )
{
   x = 12; // x no caso é simplesmente uma variável local
}

Metodo2( int *x )
{
   *x = 12; // aqui altera o valor da variável local x do Arquivo1
}
Espero ter ajudado, WebPantoja
webpantoja, Acho que funcionou. Não pude ter certeza porque eu tenho que retornar um char de 16. Poderia me dizer como ficaria usando char? Fiz aqui e não deu certo:
Arquivo1
main()
{
   char variavel[16];
   
   Metodo2( &variavel );
   printf("X = %s", variavel  );
}

Arquivo2


Metodo2( char *variavel  )
{
   *variavel  = "return ok";
}

Link para o comentário
Compartilhar em outros sites

  • 0

Nos exemplos que passei são int, com char você não pode simplesmente passar o ponteiro, basta criar ele antes e passar, olha só:

Arquivo1
main()
{
   char variavel[16];
   char *pont = variavel; // Cria ponteiro para variável 
   
   Metodo2( &pont );
   printf("X = %s", variavel  );
}

Arquivo2


void Metodo2( char **variavel  ) //Aqui você recebe um ponteiro de um ponteiro lol
{
   strcpy( *variavel, "return ok");
}

Agora vai dar certo.

Editado por webpantoja
Link para o comentário
Compartilhar em outros sites

  • 0
Nos exemplos que passei são int, com char você não pode simplesmente passar o ponteiro, basta criar ele antes e passar, olha só:

Arquivo1
main()
{
   char variavel[16];
   char *pont = variavel; // Cria ponteiro para variável 
   
   Metodo2( &variavel );
   printf("X = %s", variavel  );
}

Arquivo2


void Metodo2( char **variavel  ) //Aqui você recebe um ponteiro de um ponteiro lol
{
   strcpy( *variavel, "return ok");
}

Agora vai dar certo.

Perfeito. Funcionou exatamente como precisava. Só confirmar se o que alterei está certo....

Em "Metodo2( &variavel );" no arquivo1 eu mudei para "Metodo2( &pont );". Assim funcionou. Tá certo?

Aproveitar e perguntar mais uma coisa....sempre que passar char no parâmetro deve ser com dois asteríscos "void Metodo2( char **variavel )"?

Muito obrigada. Você não sabe o quanto me ajudou pois em nenhuma apostila e material que encontrei na internet há referências de fazer algo desse modo que você me ensinou.

Márcia.

Link para o comentário
Compartilhar em outros sites

  • 0

Márcia,

Tá certo sim... no exemplo eu criei o ponteiro mas eu passei a variável.. já corrigi aí.. rsrs

Qualquer variável que você passe a referência, ou seja, utilizando o '&', tem que receber do outro lado como um ponteiro, ou seja, com o '*'. Quando você passa a variável usando 'pont' ele já é normalmente um ponteiro. Do outro lado normalmente já deveria ter 1 *. Agora se você passa a referência dele, usando o '&pont', tem que adicionar um outro '*' do outro lado, ficando assim '**'.

Que bom que te ajudei, normalmente você acha essas coisas em livros mais antigos, no qual tem somente o C padrão ANSI. As vezes você vê apostilas aí na internet mas eles misturam muito C com C++, o que pode acabar complicando. C++ tem umas facilidades a mais que o C, então quem começa no C++ e vai para o C sente dificuldade, ao contrário a transição é mais fácil.

Att,

WebPantoja

Editado por webpantoja
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...