Ir para conteúdo
Fórum Script Brasil

Marcelo Utikawa da Fonseca

Membros
  • Total de itens

    297
  • Registro em

  • Última visita

Posts postados por Marcelo Utikawa da Fonseca

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

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

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

  4. 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);

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

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

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

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

  9. 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! :)

  10. 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;
    }

  11. 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... :)

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

  13. 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;
    }

  14. 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;
    }

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

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

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

  18. 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! :-)

×
×
  • Criar Novo...