Ir para conteúdo
Fórum Script Brasil

Marcelo Utikawa da Fonseca

Membros
  • Total de itens

    297
  • Registro em

  • Última visita

1 Seguidor

Sobre Marcelo Utikawa da Fonseca

  • Data de Nascimento 04/08/1978

Contatos

  • Website URL
    http://
  • ICQ
    0

Perfil

  • Gender
    Male
  • Location
    Caieiras - SP

Últimos Visitantes

2.418 visualizações

Marcelo Utikawa da Fonseca's Achievements

0

Reputação

  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
×
×
  • Criar Novo...