Ir ao conteúdo
  • Cadastre-se

ScreenBlack

Membro Pleno
  • Posts

    1.062
  • Cadastrado em

  • Última visita

Tudo que ScreenBlack postou

  1. "underscore" usado como prefixo, costumam ser usados para especificar tratamentos internos e específicos no código. Não recebem conteúdo informado diretamente pelo usuário ou bibliotecas independentes. Os defines destacados por você, são redefinições para chamadas de funções ou simplificações de rotinas. Exemplo de um define especificado acima: [b]#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / SERVOS_PER_TIMER)) // returns the timer controlling this servo[/b] Quando chamada a função "SERVO_INDEX_TO_TIMER(_servo_nbr)" na verdade estará fazendo a divisão "_servo_nbr / SERVOS_PER_TIMER" e definindo que o valor resultante será do tipo "timer16_Sequence_t". É apenas uma forma de simplificação para executar o cálculo. Sobre a linha: digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,LOW);a expressão:SERVO(timer,Channel[timer])é uma referência para uma posição do vetor "servos":servos[SERVO_INDEX(_timer,_channel)]A expressão acima está especificada pelo define:#define SERVO(_timer,_channel) ( servos[SERVO_INDEX(_timer,_channel)] )A chamada inteira seria:digitalWrite( servos[SERVO_INDEX(_timer,_channel)].Pin.nbr, LOW );Acredito que, suprimindo essas dúvidas, consiga entender de maneira mais clara as demais dúvidas destadas.Att.
  2. Você não especificou exatamente o que quer dizer não "pegar", mas acredito que esteja se referindo a leitura não ocorrer quando a função "scanf()" é chamada. Acredito que esse erro seja por causa do caracter "ENTER" que fica no buffer de leitura da função "scanf()". Experimente trocar a chama por: scanf("%d%*c",&aux); scanf("%c%*c", &continuar); A máscara "%*c" tratará de ignorar o último carácter lido do teclado (carácter "ENTER"). Espero que ajude. Att.
  3. Se entendi direito, daria pra fazer utilizando um buffer de entrada (um vetor de char) para armazenar o conteúdo digitado pelo usuário e a partir daí tratar o conteúdo, convertendo-os para inteiro e alocando em posições de um vetor também de inteiros. Mesmo usando essa solução, ainda existiria o limite de entrada, que seria o tamanho dos vetores. Se desejar que o usuário possa entrar com conteúdos sem limites pré-definidos, precisará da alocação dinâmica de memória. OBS: Se for utilizar essa solução, vale lembrar que, carácter numérico é diferente de valor numérico. Por isso há a necessidade da conversão char to int.
  4. É possível fazer isso com alocação dinâmica de memória. Comandos: malloc() // Alocação de memória realloc() // Realocação de memória (tratar o retorno, pois será uma nova posição de memória) free() // Liberação de memória A variável precisa ser um ponteiro para ponteiro. Onde o primeiro ponteiro possuirá a referência para o índice e o segundo a referência para o número recebido. Exemplo: unsigned int **vetor = NULL;// Adicionando o primeiro valorvetor = malloc( sizeof(unsigned int *) ); // Aloca a primeira posição do índicevetor[0] = malloc( sizeof(unsigned int) ); // Aloca memória para guardar o valor inteiro na primeira posiçãovetor[0] = 123;// Adicionando o segundo valorvetor = realloc( vetor, sizeof(unsigned int *) * 2 ); // Realoca a estrutura de índice, acrescentando mais uma posiçãovetor[1] = malloc( sizeof(unsigned int) ); // Aloca memória para a segunda posição do vetorvetor[1] = 234;// Liberando memória referente aos valores inseridosfree(vetor[1]); // Libera memória referente a segunda posição do vetorfree(vetor[0]); // Libera memória referente a primeira posição do vetor// Liberando memória referente ao índicefree(vetor); // Libera a memória referente ao índice Dessa forma, é possível aumentar ou reduzir o espaço disponível para as informações entrantes do usuário. Att.
  5. Consegui fazer o programa responder todos os comandos, mesmo como a inicialização "SDL_INIT_VIDEO" (com esta flag, o programa não identificava o evento de "pressionado", apenas o "liberado"). Usei essa chamada: SDL_SetHint("SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS", "1");Veja se funciona pra você, também.Att.
  6. Fiz a validação da centralização do direcional, baseado pela coordenada. Meu joystick está com valor de centralização em -256. Segue como ficou minha modificação: #include <stdlib.h>#include <stdio.h>#include <SDL.h>#define CENTERPOS -256#define CENTER 0#define UP 1#define DOWN 2#define LEFT 3#define RIGHT 4int main(int argc, char *argv[]){ int num_botao, num_axis, flag = 0, axis_flag = 0, axis_flag_anterior = 0, position = 0; SDL_Event evento; SDL_Init(SDL_INIT_JOYSTICK); SDL_Joystick *joy = SDL_JoystickOpen(0); while(1) { int release = 0, press = 0; // Loop de evento. while(SDL_PollEvent(&evento)) { // Retorna o código do botão pressionado num_botao = evento.jbutton.button; // Verificar o tipo de direcional (se é left, right, up, down) // 32767 para down - right // -32767 para up - left num_axis = evento.jaxis.value; // Coloquei esse flag pois o programa, // fica enviado 'evento.jbutton.button' automaticamente nos 12 primeiros loops if(flag++ > 12) { if(!axis_flag_anterior) axis_flag_anterior = axis_flag; if(num_axis) { axis_flag = num_botao; } else { // Flag para tentar tratar o caso em que // dois botões direcionais são pressionados ao mesmo tempo /* if(axis_flag_anterior != axis_flag) if(num_botao && !axis_flag){ axis_flag_anterior = axis_flag; } if(!num_botao && !num_axis){ axis_flag = axis_flag_anterior; } */ } // verifica que tipo de evento ocorreu printf("\n------------------------\n"); switch(evento.type) { // Se for evento do direcional case SDL_JOYAXISMOTION: { if(num_axis && (num_axis != -256) ) { printf("direcional (FOI PRESSIONADO): codigo = %d\n", num_botao); press = 1; switch (num_botao) { case 0: if ( num_axis < CENTERPOS ) position = LEFT; else position = RIGHT; break; case 1: if ( num_axis < CENTERPOS ) position = UP; else position = DOWN; break; } } else { num_botao = axis_flag; printf("direcional (DEIXOU DE SER PRESSIONADO): codigo = %d\n", num_botao); release = 1; position = CENTER; } break; } case SDL_JOYBUTTONDOWN: { printf("botao (FOI PRESSIONADO): codigo = %d\n", num_botao); press = 1; if(num_botao == 6) { exit(0); } break; } case SDL_JOYBUTTONUP: { release = 1; printf("botao (DEIXOU DE SER PRESSIONADO): codigo = %d\n", num_botao); break; } } printf("Release = %d (CODIGO : %d) [Sentido: %d] \n", release, num_botao, position); printf("Press = %d (CODIGO : %d) [Sentido: %d] \n", press, num_botao, position); printf("------------------------\n"); } } } return 0;}
  7. A entendi. Usando a função "SDL_JoystickGetAxis()", talvez funcione. Quando o botão volta para o estado natural, a função retornaria zero. /** * Get the current state of an axis control on a joystick. * * The state is a value ranging from -32768 to 32767. * * The axis indices start at index 0. */extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick * joystick, int axis);Será que funciona?Att.
  8. Nunca usei SDL, mas dando uma olhada na documentação, encontrei certos comandos que talvez possam te ajudar. /** * Update the current state of the open joysticks. * * This is called automatically by the event loop if any joystick * events are enabled. */extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void);/** * Enable/disable joystick event polling. * * If joystick events are disabled, you must call SDL_JoystickUpdate() * yourself and check the state of the joystick when you want joystick * information. * * The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE. */extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); Link para referência: SDL_joystick Espero que ajude. Att.
  9. Está certa a saída no arquivo. Você está trabalhando com valores inteiros (4 bytes cada) e esparava vê-los em caracter (1 byte cada). Por isso o nome do arquivo é .dat (também porderia ser .bin), pois trata-se de dados binários armazenados, não necessariamente precisa ser de forma legível. Nesse caso, quem precisa entender é o programa.
  10. No arquivo listaDeFilas.h, foi declarada uma struct com elementos do tipo fila, porém, no arquivo listaDeFilas.c, está sendo atribuído esse tipo fila em uma variável tipo listaDeFilas: while ( p->prox ) { p = p->prox; } Troquei na struct listaDeFilas.h o tipo dos elementos para listaDeFilas, e o código compilou corretamente: typedef struct listaDeFilas{ TF* unidade; struct listaDeFilas *prox; struct listaDeFilas *ant;} TLF; Só não sei dizer se o resultado de saída é o que você pretende: 5 3 4 3 3 5 4 5 4
  11. Sua lógica está correta. Apenas um erro na função "printf()", que mostra os valores no vetor: printf(\t%d", vet[i]); corrija para: printf("%d", vet[i]); E uma observação no uso da função "malloc()": Não faça typecast para o retorno da função. No seu caso, o parâmetro da função está correto, mas, se estivesse errado, o erro não seria apresentado, devido ao typecast estar forçar o compilador para não tratar o retorno.
  12. Os cinco valores já ficam armazenados no vetor quando faz a leitura do arquivo. Bastando apenas informar pro vetor qual o valor a ser retornado. Isso já está no exemplo que postei acima.
  13. Sobre o erro da leitura, deve ser por causa da função "scanf()". Troque ela por esta: scanf("%d%*c",&num[i]); // Ignora o "ENTER" No caso do "fseek()", você não precisa dele, pois já carrega o vetor inteiro no momento que você faz a leitura. No exemplo que postei anteriormente, já é feito o corregamento do vetor inteiro e mostrado o valor da terceira posição. Att.
  14. 1) Primeiro feche o arquivo no modo de escrita, para que o S.O. armezene os dados. 2) Quando o o arquivo for aberto para leitura, o ponteiro de referência estará no início do arquivo, portanto, não há necessidade do "fseek()", para o seu caso. 3) Na função "fread()", está salvando o conteúdo de um vetor numa variável simples e na função "printf()", tentando mostrar o vetor inteiro. Segue a correção: // Etapa da escrita fp = fopen("numeros.dat","wb"); fwrite(&num,sizeof(num),1,fp); fclose(fp); // Etapa da leitura fp = fopen("numeros.dat","rb"); fread(&num,sizeof(num),1,fp); printf("a terceira posicao é: %d \n", num[2]); fclose(fp);
  15. Não sei se esse seria o fórum mais adequado, pois trata-se de licenças e não de código. Mas respondendo: Pelo que lí nas licenças, parece ser totalmente livre para distribuição. Isso confirma a permissão do Code::Blocks poder distribuir o MinGW na instalação. Link para a licença do MinGW Link para a licença GCC
  16. ScreenBlack

    Duvidas em C++

    Maldito "scanf()". Sempre gerando confusão. Isso ocorre devido ao "lixo" que fica em memória, quando utilizada a função "scanf()". Depois que digita o número e aperta o "ENTER", esse "ENTER" é o caracter que fica na memória (que nada mais é do que uma quebra de linha). Quando faz a leitura novamente usando "scanf()", a função detecta esse "ENTER" na memória e o utiliza como sendo o valor digitado pelo usuário, gerando assim a quebra de linha 'desconhecida' (o famoso "passando batido"). Para solucionar esse problema, uma alternativa é descartar esse último caracter no momento da leitura. Para isso, pode utilizar uma das duas maneiras abaixo: scanf("%d%*c",&a); // "%*c" é a máscara que lê o último carácter, porém o ignora. ou então:scanf(" %d",&a); // Adicionando um espaço na frente da máscara "%d" Att.
  17. Não testei seu código, mas pude ver dois erros. 1) Na função "main()", você está especificando o vetor "vet" como sendo do tipo "No *", mas na função "insere()", ele é recebido como "int *". Além disso, como o vetor é estático, logo, não há necessidade em receber ele como ponteiro duplo na função "insere()". 2) Na função insere, você está entrando em recursividade sem alterar algum dos parâmetros passados, logo, se a condição "if()" for válida, ele entrará em loop infinito. Modificação da variável "vet": Na função "main()":int main(void){ No *vet[10]; [...] insere( b, a, vet ); [...] printf("%d, %p", (*vet)[i], vet[i]);} Na função "insere()":void insere( int chave, int tam, No *vet[] ){ [...] novoNo = malloc( sizeof(No) ); [...]} Não é necessário fazer typecast no retorno da função "malloc()" e também não é aconselhável, pois pode esconder erros em códigos, quando se força a troca de um tipo por outro.
  18. Vamos lá... Existem alguns errinhos de linguagem específicos do C. 1) Quando se trabalha com string, necessitamos de um terminador de string (definido como '\0'). Ele é um caracter no final da string. Dessa forma, se quisermos uma string com 3 caracteres, precisamos declarar o vetor com 4 posições. char vetor[4];vetor[0] = 'a';vetor[1] = 'b';vetor[2] = 'c';vetor[3] = '\0'; printf("vetor: %s", vetor); 2) Para declarar uma string como "limpa", deve-se colocar o terminador de string em todas as posições. Existem duas maneiras simples de fazer isso. - Usando a forma como você fez, porém trocando o espaço pelo terminador (espaço é um caracter legível, por isso que não considera como limpeza) - Usando a limpeza de maneira direta: char vetor[10] = {'\0'}; // Inicia limpo o vetor 3) Você está utilizando o sinal de comparação (igualdade) quando vai atribuir o valor do vetor a em b. O sinal de atribuição é apenas um igual ("="). Corrigi seu código para você comparar: int main(void){ char a[4] = {'\0'}; char b[4] = {'\0'}; int i = 0; int j = 0; int n = 0; printf ("Digite uma palavra de 3 letras: "); scanf("%s", a); for ( i = 2; i >= 0; i-- ) b[i] = a[2-i]; printf ("\n\nPalavra digitada: %s \n", a); printf ("A palavra digitada anteriormente copiada de tras para frente em b: %s \n\n", ; system("pause"); return 0;}
  19. Não é bem assim. É possível ter um único caracter em uma string. Quando especificado o tipo char como vetor, para utilizar as funções da biblioteca string.h, faz necessário o caracter finalizador de string, mesmo se ela possuir apenas um caracter. É isso que a máscara "%s" trata. Já não ocorre quando trabalha com variável simples (não vetor). A máscara "%c" não fará a verificação do terminador de string. @lunalovegood não é aconselhavel utilizar a função "fflush()" para limpeza no buffer de entrada. A documentação especifica o uso dela apenas para buffer de saída. Por mais que possa funcionar em um ambiente/biblioteca, não é garantida a funcionalidade dela em todos (portabilidade). O erro que ocorre quando utiliza a função "scanf()", é que mantem armazenado no buffer de entrada o caracter do "ENTER", depois da letra especificada. Por isso que, na próxima execução da função "scanf()", pode passar batido, sem que ocorra a devida leitura. Para contornar isso, pode utilizar a limpeza desse "ENTER" de duas formas: scanf("%c%*c", &op); // Ignora o caracter seguinte ao pretendido, ou seja, o ENTER ou entãoscanf(" %c", &op); // Adicionar um espaço na frente da máscara Att.
  20. ScreenBlack

    Matriz

    Está ocorrendo multiplicação de uma matriz, e não multiplicação de matrizes. Mas o seu código está certo. Está faltando apenas mostrar o resultado. Troque esta linha: cout << " A[i][j] " << x << endl; Por esta: for ( i = 0; i < 5; i++ ){ for ( j = 0; j < 5; j++ ) cout << " A[i][j]: " << A[i][j] << endl; cout << endl;} Ou se preferir, pode agrupar a impressão na rotina de multiplicação: for ( i = 0; i < 5; i++ ) { for ( j = 0; j < 5; j++ ) { A[i][j] = A[i][j] * x; cout << " A[i][j]: " << A[i][j] << endl; } cout << endl;} Att.
  21. No primeiro "if" , existe um "(" sobrando: if ( ( pesquisa( aux, conjuntoB ) == 0 )
  22. Só para constar. Esse código é C e não C++, apesar de funcionar também em C++. Em C++ o correto não é utilizar a função "printf()", mas sim as chamadas do namespace "std": Exemplo: std::cout << "Então teu nome é " << idade << " e tens " << nome << " anos de idade." << std::endl; Para entrada de dados: std::cin >> idade; Att.
  23. Fala ae, vizinho! Acredito que estejas usando a lib time.h para manipular a data/hora. Caso seja, essa lib dispobiliza um tipo chamado "struct tm" onde você pode informar ou recuperar valores contidos no tipo "time_t". Segue link pra mais informações att.
  24. Acredito que esse link te ajude. Ele explica os parâmetros existentes e o seu significado. Att.
  25. Descobri porque eu não conseguia compilar. Estão utilizando o gcc sem referencia para as bibliotecas. Dessa forma o compilador permite a interpretação das funções mesmo com dependência cíclica. Após compilar, fui fazer uns testes e percebi que o código trata bem pouco as referências passadas por parâmetro. Por exemplo, a remoção de um voo em uma raiz vazia gerou, como esperado, segmentation fault. Aconselho primeiro a rever todas as validações desse tipo. Assim assegura que, caso apareçam novos erros, serão por outros motivos. Se passar o formato e sequencia das entradas para o programa, facilita para que possamos testar mais. Att.

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!