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

Passagem de parametros em C.


Guest Fagner

Pergunta

Ola pessoal ...

Estou precisando de auxilio de voces no meu codigo C. Como voces poderão notar, estou comecando em C. Ou seja, estou verde, porem com muita persistencia acredito que chego la, hehehe. :)

Problema:

Criei uma funcao chamada ordenaString, esta funcao tem como objetivo apenas ordenar um vetor de caracteres. Não testei se a funcao esta fazendo o que deveria fazer, tambem não e o foco no momento.

Meu problema esta quando passo um string para funcao "ordenaString". Preciso que a funcao retorne a String formata, sendo que o parametro que esto passando faz parte de uma estrutura. Estou precisando auxilio para passagem deste parâmetro, pois todas as formas que tentei me retornou erro do tipo:

configura.c:480:2: aviso: nenhuma linha-nova no fim do arquivo

configura.c: In function ‘void ReadPerifericos(config05**)’:

configura.c:202: erro: cannot convert ‘char (*)[255]’ to ‘char*’ for argument ‘1’ to ‘char ordenaString(char*)’

configura.c: In function ‘char ordenaString(char**)’:

configura.c:469: erro: ISO C++ forbids comparison between pointer and integer

configura.c:475: erro: invalid conversion from ‘char*’ to ‘char’

configura.c:477: erro: cannot convert ‘char**’ to ‘char*’ for argument ‘1’ to ‘char* strcpy(char*, const char*)’

Conto com auxilio de voces, e desde já obrigado.

//-------------------------------------------------------------------------------------------------------------

struct config05 {

char Funcao[MAX];

char SAM[MAX];

char Tipo[MAX];

char PortaSerial[MAX];

char BitsPorSegundo[MAX];

char BitsDeDados[MAX];

char Paridade[MAX];

char BitsDeParada[MAX];

char BitsDeParidade[MAX];

char Config[MAX];

char xxxIRQ[MAX];

struct config05 *prox;

};

void ReadPerifericos(struct config **inicio)

{

struct config05 *aux=NULL, *novo=NULL, *aux1=NULL;

FILE* fp;

FILE* fp1;

char c[20];

int flag;

aux=*inicio;

aux1=*inicio;

//char log=

fp1=fopen("audit.log","a+");

fp=fopen("config05.ini","r");

if(fp==NULL)

fprintf(fp1,"Erro ao abrir config05.ini");

else

fprintf(fp1,"<---Aberto config05.ini com sucesso!--->\n");

while(!feof(fp))

{

flag=0;

novo=(struct config05 *)malloc(sizeof(struct config05));

fgets (novo->Funcao, MAX, fp);

// fprintf(fp1,"Este e um arquivo chamado:\n%s\n", s);

if(strncmp (novo->Funcao,"[ECF]",4)==0)

{

flag=1;

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"[ECF] \n");

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"novoFuncao->%s",novo->Funcao);

fgets (novo->Tipo, MAX, fp);

/* PASSANDO STRING PARA FUNCAO ORDENA STRING */

ordenaString(&novo->Tipo);

fprintf(fp1,"Imprime ---->");

fprintf(fp1,"novoTipo->%s",novo->Tipo);

fgets (novo->PortaSerial, MAX, fp);

fprintf(fp1,"novoPortaSerial->%s",novo->PortaSerial);

fgets (novo->BitsPorSegundo, MAX, fp);

fprintf(fp1,"novoBitsPorSegundo->%s",novo->BitsPorSegundo);

fgets (novo->BitsDeDados, MAX, fp);

fprintf(fp1,"novoBitsDeDados->%s",novo->BitsDeDados);

fgets (novo->Paridade, MAX, fp);

fprintf(fp1,"novoParidade->%s",novo->Paridade);

fgets (novo->BitsDeParada, MAX, fp);

fprintf(fp1,"novoBitsDeParada->%s \n",novo->BitsDeParada);

printf ("----------------------------------------- \n");

}

else if (strncmp(novo->Funcao,"[TECLADO OPERADOR]",17)==0)

{

flag=1;

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"[TECLADO OPERADOR] \n");

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"novoFuncao->%s",novo->Funcao);

fgets (novo->Tipo, MAX, fp);

fprintf(fp1,"novoTipo->%s",novo->Tipo);

fgets (novo->PortaSerial, MAX, fp);

fprintf(fp1,"novoPortaSerial->%s",novo->PortaSerial);

fprintf(fp1,"----------------------------------------- \n");

}

else if (strncmp(novo->Funcao,"[LEITOR_CMC7]",12)==0)

{

flag=1;

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"[LEITOR_CMC7] \n");

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"novoFuncao->%s",novo->Funcao);

fgets (novo->Tipo, MAX, fp);

fprintf(fp1,"novoTipo->%s",novo->Tipo);

fgets (novo->PortaSerial, MAX, fp);

fprintf(fp1,"novoPortaSerial->%s",novo->PortaSerial);

fgets (novo->BitsPorSegundo, MAX, fp);

fprintf(fp1,"novoBitsPorSegundo->%s",novo->BitsPorSegundo);

fgets (novo->BitsDeDados, MAX, fp);

fprintf(fp1,"novoBitsDeDados->%s",novo->BitsDeDados);

fgets (novo->Paridade, MAX, fp);

fprintf(fp1,"novoParidade->%s",novo->Paridade);

fgets (novo->BitsDeParada, MAX, fp);

fprintf(fp1,"novoBitsDeParada->%s",novo->BitsDeParada);

fprintf(fp1,"----------------------------------------- \n");

}

else if (strncmp(novo->Funcao,"[LEITOR_DOCUMENTOS]",18)==0)

{

flag=1;

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"[LEITOR_DOCUMENTOS] \n");

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"novoFuncao->%s",novo->Funcao);

fgets (novo->Tipo, MAX, fp);

fprintf(fp1,"novoTipo->%s",novo->Tipo);

fgets (novo->PortaSerial, MAX, fp);

fprintf(fp1,"novoPortaSerial->%s", novo->PortaSerial);

fgets (novo->BitsPorSegundo, MAX, fp);

fprintf(fp1,"novoBitsPorSegundo->%s", novo->BitsPorSegundo);

fgets (novo->BitsDeDados, MAX, fp);

fprintf(fp1,"novoBitsDeDados->%s", novo->BitsDeDados);

fgets (novo->Paridade, MAX, fp);

fprintf(fp1,"novoParidade->%s", novo->Paridade);

fgets (novo->BitsDeParada, MAX, fp);

fprintf(fp1,"novoBitsDeParada->%s", novo->BitsDeParada);

fprintf(fp1,"----------------------------------------- \n");

}

else if (strncmp(novo->Funcao,"[sCANNER_SERIAL]",15)==0)

{

flag=1;

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"[sCANNER_SERIAL] \n");

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"novoFuncao->%s",novo->Funcao);

fgets (novo->Tipo, MAX, fp);

fprintf(fp1,"novoTipo->%s",novo->Tipo);

fgets (novo->PortaSerial, MAX, fp);

fprintf(fp1,"novoPortaSerial->%s",novo->PortaSerial);

fgets (novo->BitsPorSegundo, MAX, fp);

fprintf(fp1,"novoBitsPorSegundo->%s",novo->BitsPorSegundo);

fgets (novo->BitsDeDados, MAX, fp);

fprintf(fp1,"novoBitsDeDados->%s",novo->BitsDeDados);

fgets (novo->Paridade, MAX, fp);

fprintf(fp1,"novoParidade->%s",novo->Paridade);

fgets (novo->BitsDeParada, MAX, fp);

fprintf(fp1,"novoBitsDeParada->%s",novo->BitsDeParada);

fprintf(fp1,"----------------------------------------- \n");

}

else if (strncmp(novo->Funcao,"[PINPAD]",7)==0)

{

flag=1;

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"[PINPAD] \n");

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"novoFuncao->%s",novo->Funcao);

fgets (novo->Tipo, MAX, fp);

fprintf(fp1,"novoTipo->%s",novo->Tipo);

fgets (novo->PortaSerial, MAX, fp);

fprintf(fp1,"novoPortaSerial->%s",novo->PortaSerial);

fgets (novo->BitsPorSegundo, MAX, fp);

fprintf(fp1,"novoBitsPorSegundo->%s",novo->BitsPorSegundo);

fgets (novo->SAM, MAX, fp);

fprintf(fp1,"novoSAM->%s",novo->SAM);

fprintf(fp1,"----------------------------------------- \n");

}

else if (strncmp(novo->Funcao,"[bALANCA SERIAL]",15)==0)

{

flag=1;

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"[bALANCA_SERIAL] \n");

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"novoFuncao->%s",novo->Funcao);

fgets (novo->Tipo, MAX, fp);

fprintf(fp1,"novoTipo->%s",novo->Tipo);

fgets (novo->PortaSerial, MAX, fp);

fprintf(fp1,"novoPortaSerial->%s",novo->PortaSerial);

fgets (novo->BitsPorSegundo, MAX, fp);

fprintf(fp1,"novoBitsPorSegundo->%s",novo->BitsPorSegundo);

fgets (novo->BitsDeDados, MAX, fp);

fprintf(fp1,"novoBitsDeDados->%s",novo->BitsDeDados);

fgets (novo->Paridade, MAX, fp);

fprintf(fp1,"novoParidade->%s",novo->Paridade);

fgets (novo->BitsDeParada, MAX, fp);

fprintf(fp1,"novoBitsDeParada->%s",novo->BitsDeParada);

fprintf(fp1,"----------------------------------------- \n");

}

else if (strncmp(c,"[GAVETA]",7)==0)

{

flag=1;

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"[GAVETA] \n");

fprintf(fp1,"----------------------------------------- \n");

fprintf(fp1,"novoFuncao->%s",novo->Funcao);

fgets (novo->Tipo, MAX, fp);

fprintf(fp1,"novoTipo->%s",novo->Tipo);

fgets (novo->Config, MAX, fp);

fprintf(fp1,"novoConfig->%s",novo->Config);

fprintf(fp1,"----------------------------------------- \n");

}

if(flag==1)

{

novo->prox=aux->prox;

aux->prox=novo;

}

}

fprintf(fp1,"<-----Finalizada leitura do arquivo!----->\n");

fclose(fp);

fclose(fp1);

}

//-------------------------------------------------------------------------------------------------------------

char ordenaString(char string[MAX])

{

char troca[MAX];

int i,j, posicao=0, cont=0;

for(i=0; i<256; i++)

troca=0;

for(i=0; string; i++)

if(string== '=')

posicao=i+1;

for(j=i ; string[j]!=0; j++)

{

cont=cont+1;

troca[cont]=string[j];

}

strcpy(string,troca);

return (string);

}

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Oi 'Fagner'!

Observe no trecho de código abaixo, como você passa um parametro parecido para strncmp e fprintf.

Observe , também que você não usa o operador & para a passagem destes valores. O mesmo deve ser feito para a passagem de parâpetro de sua função. Ou seja sem o operador &. Estude o porquê disso e verifique que você não estava passando o conteúdo de novo->Tipo para sua função. Em vez disso, você estava passando o endereço de memória.

if(strncmp (novo->Funcao,"[ECF]",4)==0)
{
   flag=1;
   fprintf(fp1,"----------------------------------------- \n");
   fprintf(fp1,"[ECF] \n");
   fprintf(fp1,"----------------------------------------- \n");
   fprintf(fp1,"novoFuncao->%s",novo->Funcao);
   fgets (novo->Tipo, MAX, fp);
   
   /* PASSANDO STRING PARA FUNCAO ORDENA STRING */

   ordenaString(&novo->Tipo);

   fprintf(fp1,"Imprime ---->");
   fprintf(fp1,"novoTipo->%s",novo->Tipo);
...
}

Link para o comentário
Compartilhar em outros sites

  • 0

Ola 'Denis'!

Entendi o quis me dizer, porem fiquei com dúvida no seguinte ponto. Quando não coloco o '&' eu não estou apenas fazendo uma copia do dado?

Ou seja, não estou alterando o dado na posição de memoria atual, e sim fazendo uma nova copia e alterando a mesma ?

Como disse antes sou apenas um novato, por favor se eu estiver me equivocando me corrige.

Link para o comentário
Compartilhar em outros sites

  • 0
Ola 'Denis'!

Entendi o quis me dizer, porem fiquei com dúvida no seguinte ponto. Quando não coloco o '&' eu não estou apenas fazendo uma copia do dado?

Ou seja, não estou alterando o dado na posição de memoria atual, e sim fazendo uma nova copia e alterando a mesma ?

Como disse antes sou apenas um novato, por favor se eu estiver me equivocando me corrige.

Você deve estudar "passagem de parâmetro por valor" e "passagem de parâmetro por referência".

A "passagem de parâmetro por valor" funciona da seguinte forma: Seja, o código abaixo:

void main()
{
   int x, y;
   x = 3;
   y = soma(x);
}
int soma(int a)
{
   a := a + 3;
   return (a);
}
O valor de x será 3 e o valor de y será 6. Ou seja, somente o valor 3 que estava em x foi passado para o parâmetro a da função soma. Na "passagem de parâmetro por referência" o que é passado para o parâmetro é o endereço da variável e, assim, seu conteúdo (valor) é modificado. Veja o exemplo abaixo:
void main()
{
   int x, y;
   x = 3;
   y = soma(&x);
}
int soma(int *a)
{
   a := a + 3;
   return (a);
}
O valor de x será 6 e o valor de y será 6. Ou seja, o parâmetro a agora não é mais um inteiro, apenas. Ele é um ponteiro para o tipo inteiro e espera receber o endereço de uma variável. Neste caso representado pelo símboplo & na frente da variável x em soma(&x);. Quando a em a := a + 3; recebe a atribuição de a + 3; o valor estará sendo armazenado no endereço onde está a variavel x. Complicando um pouco para que você não cometa erros. Se você fizer como no código abaixo:
void main()
{
   int x, y;
   x = 3;
   y = soma(&x);
}
int soma(int a)
{
   a := a + 3;
   return (a);
}
O resultado será x = 3 e y com um valor inesperado, pois o parâmetro soma, esperando receber o valor de x, recebeu o endereço de memória de x. Ou outro exemplo de erro comum. Veja o código abaixo:
void main()
{
   int x, y, z;
   z = 0;
   x = 3;
   y = soma(x);
}
int soma(int *a)
{
   a := a + 3;
   return (a);
}

Se x, y e z ocupam, respectivamente os endereços de memória 1, 2 e 3, então o resultado da execução do programa acima teremos x = 3, y = 3 e z = 3. Pois o parâmetro "a" esperava receber o endereço de "x" mas recebeu seu "valor" que é o endereço de "z". Daí a bagunça alterando o que não deveria ser alterado.

Concluindo: Os dois tipos de erros COMUNS por falta de atenção, não são detectados na compilação e são muito difíceis de serem percebidos.

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,2k
    • Posts
      652k
×
×
  • Criar Novo...