Ir para conteúdo
Fórum Script Brasil

Marcelo Utikawa da Fonseca

Membros
  • Total de itens

    297
  • Registro em

  • Última visita

Tudo que Marcelo Utikawa da Fonseca postou

  1. As DLLs necessárias são de acordo com os módulos do Qt utilizados. Por exemplo: se usou o módulo de rede, será preciso a Qt5Network.dll Para projetos QtWidget simples são necessários apenas Qt5Core.dll e Qt5Widget.dll. Se puder, coloque aqui o conteúdo do arquivo .pro do seu projeto para identificar quais as DLLs necessárias.
  2. Tente usar o Spy++. É uma ferramenta da Microsoft, deve te ajudar. Link: https://msdn.microsoft.com/en-us/library/dd460756.aspx
  3. Perfeito @vangodp . Concordo totalmente com a colocação, alocar tudo de uma só vez é muito melhor mesmo. A única questão é que, nesse caso, teria que ser acesso em apenas 1 dimensão. Não poderia ser feito matriz[x][y]. Deveria ser: matriz [x * linhas + y]. Mas seria até mais rápido o acesso visto que seria um acesso direto à posição desejada, não leitura de um endereço (para carregar o endereço das colunas) para depois ir na posição do valor. Eu só comentei pois, se for alocar tudo de uma vez, não deve existir o loop com alocações para as colunas já que toda a memória já foi alocada.
  4. Boa noite! Antes de qualquer coisa, queria dizer que no seu código não está demonstrada a criação da matriz porém estou assumindo que você está declarando conforme a sua outra pergunta. Por isso inclusive que fiz alguns comentários lá para que você já corrija a criação da matriz também! :-) Você só disse que ocorre um problema mas não explicou qual o problema que acontece. Imagino que ocorra algum erro que termine o seu programa, o que indica acesso não permitido a alguma região da memória. Se for isso, o problema está no acesso à matriz em si. Passar como ponteiro ou array não muda a forma de acesso nesse caso. Isso acontece porque sua matriz tem um tamanho de 10 x 10, por exemplo. E assim você só pode acessar de 0 a 9 em cada dimensão. Exemplo: matriz[x][y] sendo x de 0 a 9 e y também de 0 a 9. Se x ou y for maior que 9, você terá problemas... No seu código de verificação você está usando n para indicar o tamanho da matriz. É o mesmo tamanho utilizado para criar a matriz? Você também não está verificando o valor digitado pelo usuário para ri e rj. A lógica em si parece estar ok...
  5. Bom dia! Apenas para corrigir alguns pontos da resposta do vangodp: 1) Para que fosse possível receber o ponteiro na função e alocá-lo, precisamos passar o endereço do ponteiro. Assim, apesar de estranho, a função deveria ter 3 asteriscos: void construirMatriz(int ***tabuleiro, int n) E a chamada deveria ser: construirMatriz(&tabuleiro, n); Também seria necessário fazer algumas alterações no código porém como o vangodp sugeriu é muito melhor! Assim não compensa ficar fazendo código que não será utilizado... :-) 2) Existe um problema na alocação. Por ser um ponteiro de duas dimensões, devemos primeiro alocar o bastante para n ponteiros de 1 dimensão, ou seja, (void *). Segue agora o código corrigido: #include <stdio.h> #include <stdlib.h> void** callstore ( unsigned int rows, unsigned int cols, unsigned int size ) { unsigned int i; void** matrix = NULL; matrix = (void **) malloc( rows * sizeof(void *) ); for ( i = 0; i < rows; i++ ) { * ( matrix + i ) = ( void* ) malloc ( size * cols ); } return matrix; } void freeMemory ( void** matrix, int linhas ) { int i; for ( i = 0; i < linhas; i++ ) { free ( * ( matrix + i ) ); } free ( matrix ); } int main (){ unsigned int N = 10; //reserva int** matriz = (int**)callstore( N, N, sizeof(int) ); //função generica de reserva de memoria. Reserva N*N para inteiros matriz[0][0] = 10; matriz[9][9] = 20; printf("%d\n", matriz[0][0]); printf("%d\n", matriz[9][9]); //libera freeMemory( (void **)matriz, N); getchar(); return 0; }
  6. Olá! O scanf lê apenas o número, mantendo no buffer o que não é utilizado. No caso ficou a quebra de linha no buffer. Assim, a função gets, ao ser chamada, recebe esta quebra de linha que ficou no buffer e já retorna. Para resolver o problema, mude o seu scanf para: scanf("%d%*c", &opc); o %*c informa ao scanf que deve ser lido um char. Devido ao asterisco, esse char será descartado e não armazenado em uma variável. Abraços, Marcelo Utikawa da Fonseca
  7. Boa tarde! Primeiro um comentário: achei muito interessante esse enunciado. Um exercício que realmente mostra a utilidade de uma classe e sobre algo mais concreto! E o código está muito bom também... :) Apenas dois problemas: 1- O resto da divisão por 100 é entre 0 e 99. Ou seja: 7% representa qualquer valor entre 0 e 6, não 0 e 7. Assim a comparação para mutação deve ser < 7 e não <= 7. 2- Alterei printf_s para printf pois estava dando erro na compilação. Essa versão com o _s é específica da microsoft e aqui estou usando o linux. Dê sempre preferência pelas funções ANSI pois assim seu programa funcionará em outras plataformas também. Usar o padrão é sempre bom! :) Eu dei uma organizada no código e também dividi em dois arquivos: protozoarios.h e protozoarios.c Eu também mudei um pouco o método mutate e print: usei do { } while(); para não precisar repetir o código, criei variável g para armazenar o valor do gene e usar apenas 1 printf e também removi o return pois não é necessário quando a função é do tipo void. Seguem os arquivos formatados e com as mudanças que sugeri: protozoario.h #ifndef PROTOZOARIOS_H #define PROTOZOARIOS_H #include <stdio.h> #include <stdlib.h> #include <time.h> const int MaxElementos = 512; // máximo de protozoários // definicao dos genes enum Gene { //aminoácidos reais representados de 0 a 3 Adenina = 0, Citosina = 1, Guanina = 2, Timina = 3 }; // classe Principal aqui class Protozoario { private: int Serial; Gene Genotipo[10]; public: Protozoario(); Protozoario(Gene genotipo[10]); void print(); void mutate(); Protozoario getClone(); Protozoario GetCopula(Protozoario Parceiro); }; namespace RunTime { int LastSerial = 0; int NovoSerial() { // se quiser randômico é só implementar, porém tome cuidado: // cada serial é único return ++LastSerial; } Gene NovoGene() { srand(time(NULL)); int select = rand() % 4; switch(select) { case 0: return Adenina; break; // uma aminoácido case 1: return Citosina; break; // uma aminoácido case 2: return Guanina; break; // uma aminoácido case 3: return Timina ; break; // uma aminoácido } return Adenina; // Se algo der errado, retorna Adenina } // lista de ponteiros para os protozoários criados Protozoario *Lista[MaxElementos]; } // RunTime namespace #endif protozoario.c #include "protozoario.h" Protozoario::Protozoario() { this->Serial = RunTime::NovoSerial(); for(int n = 0; n != 10; n++) { this->Genotipo[n] = Adenina; } } Protozoario::Protozoario(Gene genotipo[10]) { this->Serial = RunTime::NovoSerial(); for(int n = 0; n != 10; n++) { this->Genotipo[n] = genotipo[n]; //cópia do genótipo como parâmetro } // 7% dos casos tem uma mutação srand(time(NULL)); int esp = rand() % 100; if(esp < 7) { this->mutate(); } } Protozoario Protozoario::getClone() { Protozoario temp; temp.Serial = RunTime::NovoSerial(); for(int n = 0; n != 10; n++) { temp.Genotipo[n] = this->Genotipo[n]; } return temp; } // retorna um protozoário através de combinação Protozoario Protozoario::GetCopula(Protozoario Parceiro) { Protozoario ret; // retorno bool est = false; srand(time(NULL)); ret.Serial = RunTime::NovoSerial(); // para os genes aleatórios for(int n = 0; n != 10; n++) { est = rand() % 2; // idealiza a randomização de true ou false if(est == true) { ret.Genotipo[n] = this->Genotipo[n]; } else { ret.Genotipo[n] = Parceiro.Genotipo[n]; } } // 7% dos casos tem uma mutação srand(time(NULL)); int esp = rand() % 100; if(esp < 7) { ret.mutate(); } return ret; } void Protozoario::mutate() { srand(time(NULL)); int GeneAlvo = rand() % 10; // ponteiro-alvo para o gene que se modificará Gene Antigo = this->Genotipo[GeneAlvo]; Gene Novo; do { Novo = RunTime::NovoGene(); } while(Antigo == Novo); this->Genotipo[GeneAlvo] = Novo; } void Protozoario::print() { int g; // expressão de saída: // Protozoário // Serial: 0 // Genotipo: 0120103012 printf("Protozoario:\nSerial: %i\nGenotipo: ", this->Serial); for(int n = 0; n != 10; n++) { switch(this->Genotipo[n]) { case Adenina : g = 0; break; case Citosina: g = 1; break; case Guanina : g = 2; break; case Timina : g = 3; break; } printf("%i", g); } printf("\n"); } Sobre como fazer o main: você precisa apenas incluir o protozoarios.h e usar as funções conforme quiser. Criar um menu onde o usuário solicita a criação de um novo protozoário, por exemplo... É essa sua dúvida? O que mais diz no enunciado? O que falta ser feito? Digo isso pois o que era solicitado já foi feito... Abraços, Marcelo Utikawa da Fonseca
  8. Olá! Durante a compilação de um programa existem duas fases: 1- A compilação propriamente dita, que é o processo em que é gerado o arquivo objeto do seu código 2- A linkagem, que é a geração do executável através da união de todo o código necessário pelo seu programa. Isto inclui o arquivo objeto gerado no passo anterior e mais os outros arquivos objeto contendo as funções não definidas no seu código como o printf ou o sem_init. No caso do printf, por ser uma função padrão, já é parte integrante do compilador e portanto já é adicionada automaticamente. Já para a função sem_init o compilador não inclui automaticamente então você deve especificar. A adição do semaphore.h no seu código apenas declara que existe a função com os parâmetros informados. Assim o compilador consegue executar o primeiro passo mas não o segundo. Se você estiver compilando no linux com o gcc, use a seguinte sintaxe: gcc -pthread -o programa arquivo.c Sendo programa o nome do executável que será gerado e arquivo.c o nome do seu arquivocom o código fonte. Além disso a função sem_init deve receber o endereço do semáforo. O correto seria chamar ela assim: sem_init(&customers,TRUE, 0); Abraços, Marcelo Utikawa da Fonseca
  9. Olá! Existem dois problemas no seu programa: 1- Na fórmula a+b+c/2, o número 2 divide apenas o c, não a soma. O correto é: s = (a+b+c)/2; 2- Em C deve ser utilizado um operador para realizar a multiplicação. O operador é o asterisco. Além disso,a expressão inteira deve ser passada como parâmetro para a função sqrt: area = sqrt(s*(s-a)*(s-b)*(s-c)); Abraços, Marcelo Utikawa da Fonseca
  10. Olá! Ambos os exercícios você precisa criar structs. Os membros das structs devem ser capazes de armazenar os dados que o enunciado pede. Para o exercício 1 você precisa criar uma estrutura com 3 variáveis: uma para cada termo da equação. Para o exercício 2 você precisa da estrutura que define um ponto. Assim a estrutura deve conter as variáveis x e y. Já que você precisa armazenar figuras com até 400 pontos, você precisa de uma outra estrutura que defina uma figura. Esta estrutura deve ter duas variáveis: o número de pontos da figura e um vetor de 400 posições para os pontos. Como são 50 figuras, crie um vetor desta última estrutura com 50 posições. Acho que já dá para você começar agora... :) Abraços, Marcelo Utikawa da Fonseca
  11. Eu não sei qual outra linguagem que usa ponteiros... E para apostilas ou textos mais completos acho que o Google pode ajudar mais você... :) Abraços, Marcelo Utikawa da Fonseca
  12. Olá! Ou você diz algo como uma pilha, lista ligada? Abraços, Marcelo Utikawa da Fonseca
  13. Boa tarde! Seu problema é no scanf. Você tem que passar o endereço da variável e não o seu valor: scanf("%d", &v[aux]); Apesar de v ser um vetor, você precisa usar o operador & pois ao usar os colchetes você "transformou" o vetor em um int simples. Abraços, Marcelo Utikawa da Fonseca
  14. Olá! Vice consegue carregar cada boneco, independentemente do teclado? Por exemplo: criar uma função que carregue cada obj em sequência? Se sim, basta usar este código na sua função, carregando o boneco desejado conforme o parâmetro recebido. Se não, fama primeiro este teste. Abraços, Marcelo Utikawa da Fonseca
  15. Seu problema é com a variável resultado. Ela é uma variável local da função multMatriz e portanto é destruída após o retorno da função. Usar o endereço retornado imediatamente como você faz onde funciona diminui a probabilidade de a memória ter sido sobrescrita. Ou seja: funciona por uma coincidência! :) Para retornar uma matriz como você quer fazer, precisa alocar a memória. Veja a questão do CaioBrito, Matrizes e Ponteiros. A função iniciaMatriz inicializa perfeitamente uma matriz exatamente como você quer fazer. Estou no celular agora, não consigo reescrever o código aqui! Qualquer coisa avise! Abraços, Marcelo Utikawa da Fonseca
  16. Mais um complemento! :) O vetor de chars deveria ter ao menos 5 posições pois é necessário espaço para armazenar o caracter nulo que indica o final da string. Abraços, Marcelo Utikawa da Fonseca
  17. O -> serve para acessar um membro de uma union, estrutura através de ponteiro. É exatamente o mesmo que o operador . faria se não fosse um ponteiro. Exemplo: struct coordenada { int x; int y; }; int main(void) { struct coordenada XY, *ptr; // Primeiro modo: acesso direto: XY.x = 10; XY.y = 20; // Segundo modo: acesso indireto atraves do ponteiro: ptr = &XY; ptr->x = 10; ptr->y = 20; return 0; } As duas formas estão corretas e fazem exatamente o mesmo: atribuem 10 a x e 20 a y. Se restar dúvidas avise que eu tento explicar melhor e dar mais exemplos! Abraços, Marcelo Utikawa da Fonseca
  18. Realmente percebi que eram jogadas aleatórias. E gostei da comparação, eu nunca tinha pensado no ponto de vista sobre "jogar contra o computador será jogar contra mim"... :)
  19. Olá! Parabéns pelo jogo. Acabei de jogar uma partida aqui... Melhor ainda pois ganhei!!! :D Uma sugestão: poderia tentar melhorar o código de checagem da jogada com um for, evitando a repetição do código. Eu faria uma função que checa apenas 1 linha (horizontal, vertical, diagonal) por vez para tornar o código mais "legível". Por exemplo: #define CHECAR_HORIZ 0 #define CHECAR_VERT 1 #define CHECAR_DIAG 2 int checa_linha(int direcao, int indice, char jogador) { switch(direcao) { case CHECAR_HORIZ: return (tabuleiro[indice][0]==jogador && tabuleiro[indice][1]==jogador && tabuleiro[indice][2]==jogador); case CHECAR_VERT: return (tabuleiro[0][indice]==jogador && tabuleiro[1][indice]==jogador && tabuleiro[2][indice]==jogador); case CHECAR_DIAG: if(indice == 0) { // Primaria! return (tabuleiro[0][0]==jogador && tabuleiro[1][1]==jogador && tabuleiro[2][2]==jogador); } else { // Secundaria! return (tabuleiro[0][2]==jogador && tabuleiro[1][1]==jogador && tabuleiro[2][0]==jogador); } } return 0; } Abraços, Marcelo Utikawa da Fonseca
  20. Ponteiros são variáveis que apontam para um endereço. É uma referência. Para declarar um ponteiro, use a sintaxe: tipo_da_variavel *nome_do_ponteiro; O tipo passado ao criar o parâmetro apenas indica o que se espera que exista no endereço apontado. Um programa de exemplo usando ponteiros: #include <stdio.h> int main(void) { int x = 5; // variavel int int y = 8; // variavel int int *p; // ponteiro para uma variavel int p = &x; // usei o & para retornar o endereco de x. O endereco foi armazenado no ponteiro *p += 20; // Usei * para acessar o endereco apontado, acrescentando 20 ao valor anterior printf("Valor em x = %d\n", x); // Vai exibir 25 pois o ponteiro alterou o valor que estava armazenado no endereco de x p = &y; // Agora p recebe o endereco de y printf("Valor contido no endereco apontado por p = %d\n", *p); // Agora vai exibir 8 pois este é o valor de y return 0; } Precisando de algo mais avise! Abraços, Marcelo Utikawa da Fonseca
  21. Boa tarde! Existem alguns problemas no seu código: 1- Primeiro um "warning"... :) Sempre antes usar o scanf, use um printf para avisar o usuário o que deve ser digitado. Sem avisar o usuário não sabe o que tem que digitar e com certeza não vai entender nada do que está acontecendo! 2- Os índices para um vetor iniciam de 0. Se o vetor tem 3 elementos, os índices são 0, 1 e 2. No seu programa, todo for usa índices iniciando por 1 e indo até o maior elemento. No exemplo seria 1, 2 e 3. Isso é errado e gera o erro que você está recebendo. 3- Existe for que corre de 1 até nLinhas e você usa o índice para acessar um campo de coluna. Se a matriz não for simétrica (3x3, 4x4, etc.) vai dar problema também 4- No código abaixo: pivot = mat[i][i]; Você também usa o índice de linha em coluna Resolvendo esses problemas seu programa já deve funcionar! A função que inicia a matriz está correta, o problema não está nela! Abraços, Marcelo Utikawa da Fonseca
  22. Bom dia! Esta lógica é complicada mesmo mas o principal é encontrar no enunciado o que precisa ser calculado ao invés de se prender à história... :) Segue abaixo um programa para fazer o cálculo pelos dois métodos: #include <math.h> #include <stdio.h> float CalcPhiN(int n) { if(n < 0) return 0; if(n == 0) return 1; if(n == 1) return (sqrt(5) - 1)/2; return CalcPhiN(n-2) - CalcPhiN(n-1); } int main(void) { int n, i; float result, phi = (sqrt(5) - 1)/2; printf("Valor de phi: %f\n", phi); printf("Digite a potencia de phi: "); scanf("%d", &n); if(n<0) { printf("Potencia invalida! Deve ser >= a 0.\n"); return 1; } else { result = 1; for(i=0; i<n; i++) result *= phi; } printf("Metodo 1: Multiplicacao\n\tphi ^ n = %f\n", result); printf("Metodo 2: Recursao\n\tphi ^ n = %f\n", CalcPhiN(n)); return 0; } Abraços, Marcelo Utikawa da Fonseca
  23. Bom dia! O problema pode ser com o tipo do ponteiro matriz3. Coloque a declaração dele aqui e também o tipo de retorno da função multMatriz. Abraços, Marcelo Utikawa da Fonseca
  24. Olá! Pelo que eu entendi você tem que ler um arquivo, correto? Como os dados devem ser armazenados? Um único vetor, uma fila, lista? De qualquer forma, por ser necessário alocar dinamicamente, será necessário usar malloc e ponteiros. Abraços, Marcelo Utikawa da Fonseca
  25. Olá! Eu já ouvi falar do arduino mas nunca mexi com um... Tem algum manual de referência sobre como programar ele? Que SO você está rodando nele? Se for linux eu tenho alguns códigos de teste para escrever em qualquer endereço, desde a memória ram até registradores da cpu. Mas eu acho que já deve ter alguma coisa pronta para acessar o hardware dele... Mais umacoisa: sempre que você for ler algum botão ou coisa assim deve usar lógica de debounce para evitar pegar os pulsos que normalmente ocorrem ao pressionar um botão. Abraços, Marcelo Utikawa da Fonseca
×
×
  • Criar Novo...