
Marcelo Utikawa da Fonseca
Membros-
Total de itens
297 -
Registro em
-
Última visita
Tudo que Marcelo Utikawa da Fonseca postou
-
Olá a todos! Já faz um bom tempo que eu tenho uma idéia de um compactador diferente mas nunca tive tempo / motivação para desenvolver. Agora resolvi postar aqui para compartilhar a idéia e quem sabe alguém resolver ajudar ou ao menos incentivar o desenvolvimento... Eu já vi por cima alguns algoritmos de compactação/descompatação e acredito que há uma forma melhor de se trabalhar. Pelo que eu já vi o normal é, a partir dos dados do arquivo, se identificarem os padrões dos dados, montar as tabelas e criar referências a estes padrões internamente. Assim o arquivo final inclui essa sequência de padrões (ou ao menos a forma de criá-los com os dados) além do restante dos dados. O que eu imagino é o seguinte: ao invés de o arquivo carregar os dados e estruturas de compactação, poderíamos ter os dados fora do arquivo. Os padrões fariam parte do programa em si. O arquivo compactado, dessa forma, não conteria os dados originais. Ele seria, em uma forma bem simples de se descrever, uma "receita" indicando como montar o arquivo final a partir dos padrões existentes no compactador. Ou seja: ao invés de o compactador possuir apenas o programa em si, passaria a ter diversas sequências de dados. Isso tornaria o programa bem maior, algo como 100 MB, por exemplo. Mas nos tempos atuais, com boas conexões de internet, acho que não seria um problema. Além disso, de acordo com o uso, poderiam ser desenvolvidas novas sequências de dados. A atualização poderia ser pela internet, como ocorre com os antivírus, por exemplo. Assim existiriam os padrões específicos para o arquivo sendo compactado, como uma imagem .jpg, um vídeo em flv, um executável... E então, o que acham disso? Sugestões? Críticas? Tudo é bem-vindo! :rolleyes: Abraços, Marcelo Utikawa da Fonseca
-
Boa tarde! Não existe uma forma de se descobrir pois não há na string um identificador. Um exemplo seria o ISO-8859-1 e o UTF-8. Uma string apenas com os caracteres normais (letras sem acentuação, números) seria exatamente igual em ambas codificações. Já se tivesse um caracter acentuado, por exemplo, teria uma diferença. Assim, o máximo que daria para fazer é tentar consistir os dados para verificar se o formato bate com algum padrão. Exemplo: no UTF-8, os caracteres especiais podem ter até 4 bytes. A codificação é a seguinte: Até 0x007F (7 bits), o valor resultante não é alterado: será apenas 1 byte, 0xxxxxxx em binário Depois, até 0x07FF (11 bits), serão dois bytes no formato: 110xxxxx e 10xxxxxx Ou seja: em uma string UTF-8, quando o oitavo bit de qualquer byte estiver ligado, indica que é um caracter com mais de 7 bits e portanto deverá obedecer a regra acima. Pode ser um pouco complicado de entender mas, em resumo: sem saber a codificação original, o máximo que podemos fazer é tentar descobrir a codificação, sem qualquer garantia de estarmos certos ou não...
-
Não é a linguagem que muda. Ou é algum problema com as apostilas ou é você que está errando em algum lugar. Antes de tudo garanta que você tenha um ambiente configurado corretamente. Você está usando o que? Visual Studio Express? Qual o outro? Sobre o cout não declarado: em linguagem C não existe uma função pré-definida no compilador. Qualquer função que você queira usar tem de ser declarada. Assim, no caso do cout, você deveria incluir o header (arquivo de cabeçalho, o .h) que define a função cout. Nesse programa em que ocorre o erro do cout, inclua o seguinte na primeira linha do arquivo com o seu código: #include <iostream>
-
Um endereço é um número. Porém não é possível fazer a soma diretamente pois não é suportado por LPVOID. Assim, basta converter para um valor numérico, fazer a soma e converter novamente para LPVOID: lpNewAddress = (LPVOID)((unsigned int)lpBufferAddress + (unsigned int)Offset);
-
Ajuda com Comunicação Ethernet
pergunta respondeu ao HenriqueT de Marcelo Utikawa da Fonseca em C, C++
Boa tarde! Eu já fiz vários programas que trabalham com rede. Não é tão difícil não! :) Eu tenho códigos que rodam no Linux e Windows. Segue abaixo um exemplo que eu fiz no linux, Não sei se vai funcionar no windows também. Eu acho que não! Nesse programa você passa na linha de comando o computador que vai receber a mensagem, a porta que ele está escutando e uma string de texto a ser transmitida. #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> int ihm_connect(char *host, unsigned int port) { struct hostent *ptrh; /* pointer to a host table entry */ struct protoent *ptrp; /* pointer to a protocol table entry */ struct sockaddr_in sad; /* structure to hold an IP address */ int sd; /* socket descriptor */ memset((char *)&sad,0,sizeof(sad)); /* clear sockaddr structure */ sad.sin_family = AF_INET; /* set family to Internet */ /* Check command-line argument for protocol port and extract */ /* port number if one is specified. Otherwise, use the default */ /* port value given by constant PROTOPORT */ if (port > 0) /* test for legal value */ sad.sin_port = htons(port); else { /* print error message and exit */ fprintf(stderr,"Bad port number %d\n",port); return -1; } /* Convert host name to equivalent IP address and copy to sad. */ ptrh = gethostbyname(host); if ( ((char *)ptrh) == NULL ) { fprintf(stderr,"Invalid host: %s\n", host); return -1; } memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length); /* Map TCP transport protocol name to protocol number. */ if ( ((ptrp = getprotobyname("tcp"))) == NULL) { fprintf(stderr, "Cannot map \"tcp\" to protocol number"); return -1; } /* Create a socket. */ sd = socket(AF_INET, SOCK_STREAM, ptrp->p_proto); if (sd < 0) { fprintf(stderr, "Socket creation failed\n"); return -1; } /* Connect the socket to the specified server. */ if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) { fprintf(stderr,"Connect failed\n"); return -1; } return sd; } int main(int argc, char *argv[]) { int ret = 0; unsigned int size, sent; int tcp_socket = -1; if(argc != 4) { printf("Sintaxe:\n\t%s <servidor> <porta> <texto>\n", argv[0]); return 1; } // Conecta ao servidor e configura o socket para o modo que não bloqueia tcp_socket = ihm_connect(argv[1], atoi(argv[2])); if(tcp_socket > 0) { size = strlen(argv[3]); sent = send(tcp_socket, argv[3], size, 0); if(sent != size) { printf("Erro durante transmissao!\n"); } } else { printf("Erro durante conexao!\n"); } return 0; } Segue abaixo um trecho de código de um outro programa que eu fiz. Ele é para windows, eu fiz no visual studio, não sei se usando o mingw vai funcionar tudo. MODBUS_HANDLER_TX(Modbus_TCP_Tx) { SOCKET ConnectSocket = INVALID_SOCKET; struct addrinfo *result = NULL, *ptr = NULL, hints; int iResult; char strIP[20]; sprintf(strIP, "%d.%d.%d.%d", Prog.ip[0], Prog.ip[1], Prog.ip[2], Prog.ip[3]); ZeroMemory( &hints, sizeof(hints) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; // Resolve the server address and port iResult = getaddrinfo(strIP, "502", &hints, &result); if (iResult != 0) { Error("getaddrinfo failed: %d", iResult); return 0; } // Attempt to connect to the first address returned by // the call to getaddrinfo ptr=result; // Create a SOCKET for connecting to server ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { Error("Error at socket(): %ld", WSAGetLastError()); freeaddrinfo(result); return 0; } // Connect to server. iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { closesocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; } // Should really try the next address returned by getaddrinfo // if the connect call failed // But for this simple example we just free the resources // returned by getaddrinfo and print an error message freeaddrinfo(result); if (ConnectSocket == INVALID_SOCKET) { Error("Unable to connect to server!"); return 0; } // Send an initial buffer iResult = send(ConnectSocket, (const char *)data, size, 0); if (iResult == SOCKET_ERROR) { Error("send failed: %d", WSAGetLastError()); closesocket(ConnectSocket); return 0; } // shutdown the connection for sending since no more data will be sent // the client can still use the ConnectSocket for receiving data iResult = shutdown(ConnectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { Error("shutdown failed: %d", WSAGetLastError()); closesocket(ConnectSocket); return 0; } iResult = recv(ConnectSocket, (char *)data, MODBUS_BUFFER_SIZE, 0); if (iResult == 0) Error("Connection closed"); else if(iResult < 0) { iResult = 0; Error("recv failed: %d", WSAGetLastError()); } // cleanup closesocket(ConnectSocket); return iResult; } Tem esse site que explica bem detalhadamente como funciona a rede no linux: http://www.linuxhowtos.org/C_C++/socket.htm Acho que isso já dá para você começar... Se tiver alguma outra dúvida é só falar! -
Como remover elemento de um vetor em C ?
pergunta respondeu ao Binder de Marcelo Utikawa da Fonseca em C, C++
Olá! O código que você criou está quase certo. Como dito pelo mJi, faltou apenas o for que faria a cópia de todos os elementos a seguir, não apenas o seguinte. Assim o código correto seria: printf("Remover codigo igual a: \n"); scanf("%d",&removecodigo); for(i=0;i<ultimo;i++) { if(vet[i].codigo == removecodigo) { for(j=i; j<ultimo-1; j++) vet[j].codigo = vet[j+1].codigo; ultimo--; } printf("codigo = %d\n",vet[i].codigo); } Não precisamos "apagar" o valor do último elemento pois ele não será exibido. E devemos subtrair 1 da variável último pois removemos 1 elemento. O loop do j percorre até último-1 pois dentro do loop acessamos o elemento seguinte ao contador. Não esqueça de declarar a variável j! -
Qualquer pessoa que quiser pode criar uma lib e disponibilizar. Depende do que você esteja precisando para saber onde procurar! No linux, por exemplo, basta instalar um pacote -dev de qualquer lib e você já pode criar um programa que a utilize. Por exemplo: se você quer fazer um programa que acesse um banco de dados MySQL, instale o pacote libmysqlclient-dev
-
Arvore Binária de Busca
pergunta respondeu ao CristianeRibeiro de Marcelo Utikawa da Fonseca em C, C++
Finalmente estou configurando meu windows para poder programar nele... Depois posso tentar testar o seu código! Por enquanto, coloque no fórum o retorno do compilador para eu tentar ajudar... :) -
Outra coisa: o printf é uma função como outra qualquer, deve ter os parênteses entre os parâmetros. Por exemplo: printf("PRIMO"); E as funções devem iniciar com { e terminar com } . Isso é o que as delimita, indicando onde começa e onde termina. No caso da função primo não existe a abertura mas em compensação compensou em fechamento! :blink: Arrume essas coisas, compile novamente e veja o que deu errado. Qualquer coisa poste o retorno do compilador no fórum!
-
Arredondamento de float no printf
pergunta respondeu ao cjacchus de Marcelo Utikawa da Fonseca em C, C++
Na verdade a linguagem C nunca arredonda para cima, ele simplesmente trunca o valor, excluindo o que não for utilizado. Ou seja, podia ser 0.699999, nunca o número exibido seria 0.7! -
Problema em leitura e escrita de struct
pergunta respondeu ao steel_sp de Marcelo Utikawa da Fonseca em C, C++
Boa noite! Se dados.cpf for uma string, não há nada de errado! Mas o programa está esperando o usuário digitar algo que irá ser salvo em dados.cpf, algo que acredito desnecessário pois a função digitacpf já deve fazer isso, correto? Outra coisa: digitacpf e validacpf usa variáveis globais? Isso não é nada aconselhável, passe as variáveis como parâmetro! E evite usar gets, ela não limita o número de caracteres e portanto é muito fácil de se gerar um buffer overflow... Use fgets! Mande a declaração de struct agenda, pode ser útil! :) -
(Resolvido) Velocidade de loop em C
pergunta respondeu ao evandrolnr de Marcelo Utikawa da Fonseca em C, C++
Realmente pode ser o compilador otimizando o código. Ele pode nem estar executando o for pois sabe que apenas 1 condição será verdadeira! adicione o modificador volatile nas variáveis i e j para eliminar essa otimização: /* TestaLoop.c */ #include <stdio.h> #include <stdlib.h> int main(){ for(volatile int i=0;i< 5000000;i++) for(volatile int j=0;j< 5000000;j++) if (i == 3000000 && j == 3000000) printf("\nachou i e j %d\t%d\n",i,j); return 0; } -
(Resolvido) Pulando alsguns scanf
pergunta respondeu ao Anderson G. de Marcelo Utikawa da Fonseca em C, C++
O correto é %f e %d ao invés de f% e d%... isso deve resolver seu problema... :) -
[Dúvida] Compilador para dispositivos móveis
pergunta respondeu ao ImBigBoo de Marcelo Utikawa da Fonseca em C, C++
Você não consegue rodar o gcc nele??? E como assim não consegue compilar, apenas escrever códigos na raça? Você quer uma IDE para programação??? -
Desenvolvimento de Jogos - [Duvidas]
pergunta respondeu ao Matheus Flauzino de Marcelo Utikawa da Fonseca em C, C++
Agora eu compreendi... ^_^ Então eu faria o seguinte. Crie uma matriz que represente o terreno, por exemplo de 100x100. Para cada posição você carrega inicialmente um valor indicando um quadrado livre (valor 0, por exemplo) ou com obstáculo. Escolha uma posição onde estará a cobra e marque com outro valor. Depois crie uma função que exiba o campo na tela, imprimindo caracteres correspondendo ao estado em cada posição. A seguir peça ao jogador para pressionar uma tecla, indicando a direção a seguir. Atualize a matriz e exiba os campos novamente e fique nesse loop... Acho que já dá para começar assim... :) -
(Resolvido) galera me ajude nesse algoritmo
pergunta respondeu ao luis galdino de Marcelo Utikawa da Fonseca em C, C++
Cara, você que fez este código? O que não funciona??? Rode ele e diga o resultado! -
Desenvolvimento de Jogos - [Duvidas]
pergunta respondeu ao Matheus Flauzino de Marcelo Utikawa da Fonseca em C, C++
Você pode usar algum toolkit como o gtk para desenhar a tela. Você pode carregar imagens que representem as partes da cobra e os objetos. Primeiro crie a imagem do campo que será o background. E vai desenhando as imagens na tela conforme a cobra vai se movimentando... -
Mais uma coisa: se o número tiver mais digitos, temos que remover os posteriores também. A divisão do código original tira apenas os dígitos anteriores. Segue a alteração para 6 dígitos: #include <stdio.h> int main(void) { float numero = 123456789; int digito; digito = ((int)(numero)/1000000)%10; printf("Sexto digito: %d\n", digito); return 0; }
-
Para saber o sexto dígito basta mudar a divisão... Veja que a divisão foi feita com o número 1 seguido por 8 zeros. Assim, removemos os 8 primeiros dígitos. :rolleyes:
-
Desculpe, fui fazer rápido e me confundi nos dois exemplos... Segue o código completo de um programa que retorna o nono dígito: #include <stdio.h> int main(void) { float numero = 123456789; int digito; digito = (int)(numero)/100000000; printf("Nono digito: %d\n", digito); return 0; }
-
isso, tem que declarar... Esqueci de avisar! :) int digito;
-
Ainda não entendi exatamente o que você precisa... Se quer pegar o nono dígito do número digitado, faça o seguinte: digito = numerousavel%100000000; printf("Digito: %d\n", digito); Já se você quiser saber quantos dígitos existem, pode fazer o seguinte: for(i=1; numerousavel>10; i++) numerousavel /= 10; printf("Numero possui %d digitos", i); Se quiser explico o código...
-
(Resolvido) Segmentation Fault: Onde?
pergunta respondeu ao GsXs de Marcelo Utikawa da Fonseca em C, C++
realmente era correto colocar o tipo da função mas o erro está sendo causado no while. a condição é que enquanto i for diferente de 1, ele fica no loop e incrementa o valor de i. O que acontece é que se você não inicializa o i com algo, ele pega qualquer coisa! Assim, se ele começar com 2, vai somando 1 sem parar e o array é estourado... Ontem deu sorte de não ter dado o erro... Apenas atribua zero a i que isso não irá mais ocorrer! Mas não entendi o motivo do loop e dos arrays... -
(Resolvido)Duvida de iniciante
pergunta respondeu ao malokas de Marcelo Utikawa da Fonseca em C, C++
Códigos realmente mudam de um SO para outro. por isso que existe, por exemplo, o C ANSI, que é o padrão suportado por todos os compiladores. Assim, se o seu código for feito seguindo o padrão ANSI irá compilar em qualquer SO porém podem ocorrer diferenças de funcionamento. Um dos motivos é no código que foi apresentado: a função system serve para executar um comando da mesma forma que você faria no console do sistema. No seu caso ele chama o programa pause, que irá aguardar o usuário pressionar uma tecla para continuar. Porém o linux não possui o programa pause e portanto não vai funcionar esta chamada. Porém o problema de compilação já tem outro motivo. O que acontece é que não foi incluído o header que define a função system, no caso o cstdlib. #include <cstdlib> E veja o link abaixo sobre este tipo de "vício": http://www.gidnetwork.com/b-61.html -
Eu trabalho com dispositivos embarcados e faço muitos programas para microcontroladores. Nessa área só é usado C puro por diversos motivos. Eu também trabalho com o kernel do linux e ele é totalmente em C puro, nada de C++. Ou seja: os dois ainda vão conviver por muito tempo! :-)