Ir ao conteúdo
  • Cadastre-se

C Como corrigir erro warning: implicit declaration of function ‘scanf_s’


Posts recomendados

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

 typedef struct aluno {
	int ru;
	char nome[45];
	char email[60];
	struct aluno * proximo;
} t_cad;

t_cad *ini_cad = NULL; // declara essa variavel global que ira armazenar o inicio da lista encadeada

void cadastro() {
	
	int cont;
	t_cad* prox_cad;
	
	if (ini_cad == NULL)
	{
		ini_cad = (t_cad*)malloc(sizeof(t_cad));
		ini_cad ->proximo = NULL;
		if (ini_cad == NULL) exit(1);
	}
	prox_cad = ini_cad;

	while (1) {
		printf("Digite o RU:");
		scanf_s("%d", &prox_cad->ru);
		printf("Digite o Nome:");
		scanf_s("%[^\n]", &prox_cad->nome, 45);//nome tem no máximo 45 caracteres
		printf("Digite o email:");
		scanf_s("%s", &prox_cad->email, 60); //email tem no máximo 60 caracteres
		printf("Deseja continuar??? (1)SIM e (0)NAO");
		("\n %d", &cont);
		if (cont == 0) break;
	    prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad));
		prox_cad = prox_cad->proximo;
		prox_cad->proximo = NULL;	
	}
	printf("\n");
}
void pesquisa() {
	int ru_aux;
	char nome_aux[60];
	t_cad* prox_cad;

	do {
		printf("\n Digite parametro da pesquisa: \n1 RU \n2 Nome :\n0 para sair\n");
		scanf("%d", &op);
		if (op == 0) break;
		prox_cad = ini_cad;
		switch (op) {
		case 1:
			printf("\n Digite o RU do Aluno:");
			scanf("%d", &ru_aux);
			while (prox_cad != NULL) {
		     if (prox_cad-> ru == ru_aux)
		     {
			    printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
			    break;
			  }	
			  prox_cad = prox_cad->proximo;
			}
            break;
		case 2:
			printf("\n Digite o nome do Aluno:");
			scanf("%s", nome_aux);//não precisa de & para string
			while (prox_cad != NULL) {
		     if (strcmp(prox_cad->nome, nome_aux) == 0)
		     {
			    printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
			    break;
		      }
		      prox_cad = prox_cad->proximo;
			}
		    break;

		default:
			printf("\n****opcao invalida*****");
			break;
		}
	} while (1);
}
void liberarmem()
{
    t_cad *prox_cad;
    while (ini_cad != NULL) {
             prox_cad = ini_cad;
             ini_cad  = prox_cad->proximo;
             free(prox_cad);
		  	}
}

tenho um trabalho de faculdade para entregar segue o enunciado: 

Defina a estrutura de dados que você irá utilizar para fazer esta implementação e JUSTIFIQUE em texto porque você escolheu ela; 1. Deve-se armazenar o nome do aluno, seu e-mail e seu RU. Para o armazenamento utilize uma estrutura heterogênea de dados. 2. Não é necessário fazer a leitura dos dados dos dados dos alunos manualmente. Você já pode deixar pré-cadastrado os dados no seu código. Cadastre pelo menos uns 10 contatos de alunos na sua estrutura de dados. Um dos contatos deverá ser o seu próprio nome e o seu RU da UNINTER; 3. Em um menu na tela, peça para o usuário digitar um RU. O programa deverá realizar a busca por este RU na estrutura de dados e, caso localize o RU, deverá mostrar o nome correspondente do aluno e o e-mail deste contato. Caso não localize, uma mensagem de erro deve ser apresentada. 4. Para testar o programa, teste a busca com o seu RU e coloque a captura de tela

 

Então segue meu código que esta compilando com erro:

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

 typedef struct aluno {
    int ru;
    char nome[45];
    char email[60];
    struct aluno * proximo;
} t_cad;

t_cad *ini_cad = NULL; // declara essa variavel global que ira armazenar o inicio da lista encadeada

void cadastro() {
    
    int cont;
    t_cad* prox_cad;
    
    if (ini_cad == NULL)
    {
        ini_cad = (t_cad*)malloc(sizeof(t_cad));
        ini_cad ->proximo = NULL;
        if (ini_cad == NULL) exit(1);
    }
    prox_cad = ini_cad;

    while (1) {
        printf("Digite o RU:");
        scanf_s("%d", &prox_cad->ru);
        printf("Digite o Nome:");
        scanf_s("%[^\n]", &prox_cad->nome, 45);//nome tem no máximo 45 caracteres
        printf("Digite o email:");
        scanf_s("%s", &prox_cad->email, 60); //email tem no máximo 60 caracteres
        printf("Deseja continuar??? (1)SIM e (0)NAO");
        ("\n %d", &cont);
        if (cont == 0) break;
        prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad));
        prox_cad = prox_cad->proximo;
        prox_cad->proximo = NULL;    
    }
    printf("\n");
}
void pesquisa() {
    int ru_aux;
    char nome_aux[60];
    t_cad* prox_cad;

    do {
        printf("\n Digite parametro da pesquisa: \n1 RU \n2 Nome :\n0 para sair\n");
        scanf("%d", &op);
        if (op == 0) break;
        prox_cad = ini_cad;
        switch (op) {
        case 1:
            printf("\n Digite o RU do Aluno:");
            scanf("%d", &ru_aux);
            while (prox_cad != NULL) {
             if (prox_cad-> ru == ru_aux)
             {
                printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
                break;
              }    
              prox_cad = prox_cad->proximo;
            }
            break;
        case 2:
            printf("\n Digite o nome do Aluno:");
            scanf("%s", nome_aux);//não precisa de & para string
            while (prox_cad != NULL) {
             if (strcmp(prox_cad->nome, nome_aux) == 0)
             {
                printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); 
                break;
              }
              prox_cad = prox_cad->proximo;
            }
            break;

        default:
            printf("\n****opcao invalida*****");
            break;
        }
    } while (1);
}
void liberarmem()
{
    t_cad *prox_cad;
    while (ini_cad != NULL) {
             prox_cad = ini_cad;
             ini_cad  = prox_cad->proximo;
             free(prox_cad);
              }
}

 

 

O seguinte erro é apresentado:

 

main.c: In function ‘cadastro’: main.c:30:3: warning: implicit declaration of function ‘scanf_s’ [-Wimplicit-function-declaration] scanf_s("%d", &prox_cad->ru); ^~~~~~~ main.c: In function ‘pesquisa’: main.c:51:16: error: ‘op’ undeclared (first use in this function) scanf("%d", &op); ^~ main.c:51:16: note: each undeclared identifier is reported only once for each function it appears in

Link para o comentário
Compartilhar em outros sites

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

typedef struct aluno {
    int ru;
    char nome[45];
    char email[60];
    struct aluno * proximo;
} t_cad;

t_cad *ini_cad = NULL; // declara essa variavel global que ira armazenar o inicio da lista encadeada

void cadastro() {

    int cont;
    t_cad* prox_cad;
    
    if ( ini_cad == NULL ) {
        ini_cad = ( t_cad* ) malloc ( sizeof ( t_cad ) );
        ini_cad ->proximo = NULL;
        
        if ( ini_cad == NULL ) exit ( 1 );
    }
    
    prox_cad = ini_cad;
    
    while ( 1 ) {
        printf ( "Digite o RU:" );
        scanf ( "%d", &prox_cad->ru );
        printf ( "Digite o Nome:" );
        scanf ( "%45[^\n]", prox_cad->nome );
        printf ( "Digite o email:" );
        scanf ( "%60s", prox_cad->email ); //email tem no máximo 60 caracteres
        printf ( "Deseja continuar??? (1)SIM e (0)NAO" );
        //( "\n %d", &cont );
        
        //if ( cont == 0 ) break; //o que FAZ ISSO?
        
        prox_cad->proximo = ( t_cad * ) malloc ( sizeof ( t_cad ) );
        prox_cad = prox_cad->proximo;
        prox_cad->proximo = NULL;
    }
    
    printf ( "\n" );
}
void pesquisa() {
    int ru_aux, op;
    char nome_aux[60];
    t_cad* prox_cad;
    
    do {
        printf ( "\n Digite parametro da pesquisa: \n1 RU \n2 Nome :\n0 para sair\n" );
        scanf ( "%d", &op );
        
        if ( op == 0 ) break;
        
        prox_cad = ini_cad;
        
        switch ( op ) {
            case 1:
                printf ( "\n Digite o RU do Aluno:" );
                scanf ( "%d", &ru_aux );
                
                while ( prox_cad != NULL ) {
                    if ( prox_cad-> ru == ru_aux ) {
                        printf ( "ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email );
                        break;
                    }
                    
                    prox_cad = prox_cad->proximo;
                }
                
                break;
                
            case 2:
                printf ( "\n Digite o nome do Aluno:" );
                scanf ( "%s", nome_aux ); //não precisa de & para string
                
                while ( prox_cad != NULL ) {
                    if ( strcmp ( prox_cad->nome, nome_aux ) == 0 ) {
                        printf ( "ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email );
                        break;
                    }
                    
                    prox_cad = prox_cad->proximo;
                }
                
                break;
                
            default:
                printf ( "\n****opcao invalida*****" );
                break;
        }
    } while ( 1 );
}
void liberarmem() {
    t_cad *prox_cad;
    
    while ( ini_cad != NULL ) {
        prox_cad = ini_cad;
        ini_cad  = prox_cad->proximo;
        free ( prox_cad );
    }
}

toma... sem erros
O unico erro que tem é que você não colocou o main

adicionado 0 minutos depois

deixo claro que só arrumei os erros, agora compila. não comprovei lógica etc

Link para o comentário
Compartilhar em outros sites

@vangodp retornou o seguinte erro

ompilation failed due to following error(s)./usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 21
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

 

Link para o comentário
Compartilhar em outros sites

se você pretende usar todas essas funções a main deve ser a ultima. P q tudo o que for usado em C e C++ deve ser existir anteriormente, por isso main será a ultima sempre.

Logo tem a historia dos protótipos mas deixa isso pra lá shuehsueu, tenho a impressão de que você começou a programar hoje.

Link para o comentário
Compartilhar em outros sites

agora, vangodp disse:

se você pretende usar todas essas funções a main deve ser a ultima. P q tudo o que for usado em C e C++ deve ser existir anteriormente, por isso main será a ultima sempre.

Logo tem a historia dos protótipos mas deixa isso pra lá shuehsueu, tenho a impressão de que você começou a programar hoje.

sim sou novato no mundo da programação!! poderia me ajudar pra rodar o codigo??

Link para o comentário
Compartilhar em outros sites

qual sua experiência com programação?

Quantos dias ou meses etc?

Sabe o que é memória dinâmica? você a domina?

você pode achar que estou fazendo muitas perguntas mas é importante pois seu professor pode não ser "burro" e vai saber que certas partes do seu programa são coladas, porque se você n sabe onde vai o main certamente n vai colar que você lhe apresente algo como memória dinâmica.

Aqui existe 2 perguntas...

você quer aprender?
Ou você só quer a resposta?

Link para o comentário
Compartilhar em outros sites

ok

vamos lá...

adicionado 0 minutos depois
1 hora atrás, Fernando Vieira disse:

1. Deve-se armazenar o nome do aluno, seu e-mail e seu RU. Para o armazenamento utilize uma estrutura heterogênea de dados.

 

adicionado 2 minutos depois

nessa parte ta certo....

typedef struct aluno {
	int ru;
	char nome[45];
	char email[60];
};

Mas você n precisa que seja lista simplesmente ligadas certo?

adicionado 5 minutos depois

n vejo que ele esteja pedindo dados por teclado nem que o numero de cadastrados seja variavel.
 

2 horas atrás, Fernando Vieira disse:

2. Não é necessário fazer a leitura dos dados dos dados dos alunos manualmente. Você já pode deixar pré-cadastrado os dados no seu código. Cadastre pelo menos uns 10 contatos de alunos na sua estrutura de dados

 

Link para o comentário
Compartilhar em outros sites

8 minutos atrás, vangodp disse:

ok

vamos lá...

adicionado 0 minutos depois

 

adicionado 2 minutos depois

nessa parte ta certo....


typedef struct aluno {
	int ru;
	char nome[45];
	char email[60];
};

Mas você n precisa que seja lista simplesmente ligadas certo?

adicionado 5 minutos depois

n vejo que ele esteja pedindo dados por teclado nem que o numero de cadastrados seja variavel.
 

 

isso não precisa!

Link para o comentário
Compartilhar em outros sites

Então olha isso:
 

adicionado 0 minutos depois
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct Dados {
    int ru;
    char nome[45];
    char email[60];
} Aluno;

int main(){
    Aluno lista[10] = {
        { 123, "jhon snow", "[email protected]"},
        { 124, "batman", "[email protected]"},
        { 125, "mikey mouse", "[email protected]"}
        //termine você....
    };
    
    
    return 0;
}

 

adicionado 2 minutos depois

você pode tirar todos os arquivos de cabeçalho e deixar somente o stdio.h tambem... seu código fica mais limpo

adicionado 2 minutos depois
#include <stdio.h>

typedef struct Dados {
    int ru;
    char nome[45];
    char email[60];
} Aluno;

int main(){
    Aluno lista[10] = {
        { 123, "jhon snow", "[email protected]"},
        { 124, "batman", "[email protected]"},
        { 125, "mikey mouse", "[email protected]"}
        //termine você....
    };
    
    
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, vangodp disse:

Então olha isso:
 

adicionado 0 minutos depois

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

typedef struct Dados {
    int ru;
    char nome[45];
    char email[60];
} Aluno;

int main(){
    Aluno lista[10] = {
        { 123, "jhon snow", "[email protected]"},
        { 124, "batman", "[email protected]"},
        { 125, "mikey mouse", "[email protected]"}
        //termine você....
    };
    
    
    return 0;
}

 

funcionou! mas eu tambem precisaria que o codigo procura-se os alunos cadastrados por meio do "ru"

Link para o comentário
Compartilhar em outros sites

Ato seguinte é pedir o RU. Sabe fazer al menos isso? Então faça ai.

adicionado 4 minutos depois
typedef struct Dados {
    int ru;
    char nome[45];
    char email[60];
} Aluno;

int main(){
    Aluno lista[10] = {
        { 123, "jhon snow", "[email protected]"},
        { 124, "batman", "[email protected]"},
        { 125, "mikey mouse", "[email protected]"}
        //termine você....
    };
    
    int ru = 0;
    //Pedir RU aqui e guardar ele em ru

 

adicionado 13 minutos depois
#include <stdio.h>

typedef struct Dados {
    int ru;
    char nome[45];
    char email[60];
} Aluno;

int main(){
    Aluno lista[10] = {
        { 123, "jhon snow", "[email protected]"},
        { 124, "batman", "[email protected]"},
        { 125, "mikey mouse", "[email protected]"}
        //termine você....
    };
    
    int ru = 0;
    //Pedir RU aqui e guardar ele em ru
    
    
    int i = 0;
    while ( i < 10 ) {
        if(  ru == lista[i].ru ){
            printf("Encontrou");
            //mostrar aqui nome e email
            
            break;
        }else if( i == 9 ){
            printf("Nao encontrou");
        }
        i++;
    }
    
    
    return 0;
}

ta ai..

 

se você mudar a linha int ru = 0 para int ru = 123 por exemplo ele vai encontrar o primeiro da lista, caso a variavel ru n coincida com nenhum ru da lista vai mostrar "Nao encontrou".

O programa está comentado as partes que falta fazer, ao menos termine essas partes.

adicionado 23 minutos depois

Pratica ai viu...! Se você achar que ta difícil espera mais adiante. você precisa se antecipar a seu curso. Quando seu professor entrar em algo como variaveis dinamicas+ ponteiros, etc, é bom que você ja tenha contato anterior com essas coisas. Deixe de praticar karateca y começa a se enfurunhar com o compilador. suehsuehus

programar é escrever códigos, se achar que programar é outra coisa melhor mudar agora que ta começando, e n perder tempo, talvez programar n seja para você. Mas se sentir que gosta, que leva na veia isso de ser programador se antecipe a seu professor. Aqui esta o forum para duvidas, busque tutoriais, escreva códigos todo o dia, pdfs, etc. Seja um faixa preta da programação!!! sueusheush

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, vangodp disse:

Ato seguinte é pedir o RU. Sabe fazer al menos isso? Então faça ai.

adicionado 4 minutos depois

typedef struct Dados {
    int ru;
    char nome[45];
    char email[60];
} Aluno;

int main(){
    Aluno lista[10] = {
        { 123, "jhon snow", "[email protected]"},
        { 124, "batman", "[email protected]"},
        { 125, "mikey mouse", "[email protected]"}
        //termine você....
    };
    
    int ru = 0;
    //Pedir RU aqui e guardar ele em ru

 

adicionado 13 minutos depois

#include <stdio.h>

typedef struct Dados {
    int ru;
    char nome[45];
    char email[60];
} Aluno;

int main(){
    Aluno lista[10] = {
        { 123, "jhon snow", "[email protected]"},
        { 124, "batman", "[email protected]"},
        { 125, "mikey mouse", "[email protected]"}
        //termine você....
    };
    
    int ru = 0;
    //Pedir RU aqui e guardar ele em ru
    
    
    int i = 0;
    while ( i < 10 ) {
        if(  ru == lista[i].ru ){
            printf("Encontrou");
            //mostrar aqui nome e email
            
            break;
        }else if( i == 9 ){
            printf("Nao encontrou");
        }
        i++;
    }
    
    
    return 0;
}

ta ai..

 

se você mudar a linha int ru = 0 para int ru = 123 por exemplo ele vai encontrar o primeiro da lista, caso a variavel ru n coincida com nenhum ru da lista vai mostrar "Nao encontrou".

O programa está comentado as partes que falta fazer, ao menos termine essas partes.

adicionado 23 minutos depois

Pratica ai viu...! Se você achar que ta difícil espera mais adiante. você precisa se antecipar a seu curso. Quando seu professor entrar em algo como variaveis dinamicas+ ponteiros, etc, é bom que você ja tenha contato anterior com essas coisas. Deixe de praticar karateca y começa a se enfurunhar com o compilador. suehsuehus

programar é escrever códigos, se achar que programar é outra coisa melhor mudar agora que ta começando, e n perder tempo, talvez programar n seja para você. Mas se sentir que gosta, que leva na veia isso de ser programador se antecipe a seu professor. Aqui esta o forum para duvidas, busque tutoriais, escreva códigos todo o dia, pdfs, etc. Seja um faixa preta da programação!!! sueusheush

Muito obrigado! Vou me dedicar mais ao mundo da programação, abraços!!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...