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. Para complementar a resposta do rocco, segue abaixo um programinha que vai te exibir o valore retornado pela tecla pressionada. Pressionando X o programa termina.

    Observe que em alguns casos (teclas especiais) serão retornados mais de 1 caracter para cada vez que a tecla for pressionada!

    #include <stdio.h>
    
    int main(void)
    {
       char ch = 0;
       do {
          ch = getchar();
          printf("%03d - %c\n", ch, ch);
       } while(ch != 'X');
    
       return 0;
    }

  2. Essa dúvida já foi respondida. Se você fizesse uma pesquisa, além de não duplicar perguntas no fórum, já teria a resposta ao invés de esperar alguém responder!

    Você precisa usar alguma função exec: execl, execve, etc...

    Exemplo:

    execl("notepad.exe", "arquivo.txt", NULL);

  3. Isso pode acontecer mesmo, depende de o que a dll usa. Se ela usar algo que só foi criado a partir do windows 7, realmente só vai rodar dele em diante.

    É o mesmo para o windows 8, que vai passar a ter novos aplicativos chamados (temporariamente) Metro. Se você fizer um aplicativo Metro, só vai rodar no windows 8!

    Sobre o seu problema especificamente: que dll é essa? O que ela faz?

    Passe mais informações pois o site que você passou nem abriu nada aqui, ficou uma página em branco...

  4. Parece algum problema para executar o gedit. Se você rodar o programa no console direto, não funciona mesmo, depende de algumas configurações. Se rodar em um terminal gráfico deveria rodar!

    Onde você está rodando o programa?

    Se você tentar rodar o gedit direto, sem ser pelo programa, funciona???

    Abraços,

    Marcelo Utikawa da Fonseca

  5. Com relação às suas dúvidas:

    Os parâmetros passados para uma função devem ser exatamente como os parâmetros declarados.

    Assim, uma função declarada como:

    int soma(int a, int b);
    Não pode ser chamada com:
    soma("txt1", "txt2"):
    Desta forma, quando você chama a função paralelo, deve passar a ela um parâmetro que ela aceite. Ela é declarada como:
    int paralelo (int num, char executable[255]);
    No seu código main você declarou:
    char * commandi[255];
    Veja que o tipo de variável que você criou é diferente da que a função recebe. Este é o primeiro problema. Agora você deve estar imaginando: "mas compilou aqui!". Realmente compilou mas por uma coincidência: quando você chamou a função paralelo, o parâmetro passado para ela não foi commandi mas sim commandi[255]. Isso quer dizer que você passou para a função o elemento de número 256 (os índices em linguagem C iniciam de zero). E o que é o elemento 256? É um char* pois essa variável foi declarada como um vetor de char*. Assim, como char* é compatível com o parâmetro recebido pela função (char[255]), então compila e roda, mas não funciona. Este é o segundo problema. O correto seria criara função como abaixo:
    int paralelo (int num, char *executable[255])
    E chamar a função da seguinte forma:
    paralelo(k,commandi);
    Quanto a execl: nessa função você passa o programa que será chamado seguido dos parâmetros:
    execl("notepad.exe", "arquivo.txt", NULL);

    Veja que o último parâmetro deve sempre ser nulo para indicar o fim da lista de parâmetros.

    No seu programa eu não sei como você precisa chamar a função.

    Cada fileN é um programa (como notepad.exe) que deve ser executado ou um arquivo para ser passado como parâmetro a algum programa (como arquivo.txt)?

    A sua resposta já te diz como usar a execl... :)

  6. Ok, parece que está tudo certo.

    Uma coisa que pode estar dando problema é que na linha de cima você cria o arquivo sem passar o caminho. Na linha de baixo existe o caminho completo. Pode ser que o arquivo esteja sendo gerado em um caminho diferente!

    Pode ser também que seja necessário passar o caminho para o gedit. Rode na linha de comando:

    which gedit

    E use o caminho exibido no lugar de apenas gedit.

    Antes do return -1 você pode colocar um printf também. Se o gedit foi chamado com sucesso, não pode executar aquela linha.

    Abraços,

    Marcelo

  7. Bom dia! De nada! :)

    O que não pegou? Não compilou? Ou não funcionou?

    Mande o erro para que se possa entender exatamente o problema...

    Sobre o uso de pipes: você diz que está usando pipes no seu programa? Ou está usando na linhade comando como "cat arquivo.txt | seuprograma" ?

    No exemplo eu chamei o gedit passando como parâmetro arquivo.txt.

    Abraços,

    Marcelo

  8. Você quer abrir o .txt pelo seu programa ou chamar realmente o gedit ou outro editor?

    Se for a segunda opção, pode usar a função execve:

    if(!fork()) { // novo processo
          execve("gedit", "arquivo.txt", NULL);
          return -1;
       }

    No código acima é criado um novo processo e então chamado o execve.

    A função execve não retorna se conseguir executar o programa passado como parâmetro. Por isso é que deve ser criado um novo processo pois assim o programa principal pode continuar funcionando normalmente.

    Abraços,

    Marcelo

  9. Olá!

    O seu problema está no for. Quando você tira a linha do atoi, k passa a valer zero e assim não entra no for e não gera o erro.

    Os caracteres estranhos quando não tem o atoi é porque a variável comandi não recebeu valor algum e portanto tem apenas lixo...

    O erro em si é porque no for você usa a variável cont mas no comandi você usa i. A variável i não tem valor algum, o que não significa zero.

    Em C, uma variável que não recebeu valor algum (não inicializada) possui qualquer valor. Assim você está acessando um valor além das dez posições reservadas ou até mesmo uma posição anterior no caso de i ter um valor negativo.

    Para resolver o seu problema basta substituir i por cont no índice de comandi e no argv dentro do strdup.

    Mais uma coisa: argc contém o número de parâmetros passados na linha de comando. Assim não precisa do parâmetro numérico na linha de comando, basta usar argc para saber o número de argumentos recebidos.

    Qualquer dúvida avise!

    Abraços,

    Marcelo

  10. O problema é que você está executando o programa diretamente. Assim é aberta a tela do prompt, exibida a mensagem e então o programa termina.

    Nesse momento a janela é fechada e então é difícil de ver o resultado. Por isso a recomendação de se colocar o getch().

    O seu livro não diz nada pois o programa não precisa do getch() para funcionar. Esse é apenas um artifício para fazer o programa aguardar algo ser digitado no teclado e, portanto, fazer com que o programa não termine, mantendo a janela aberta.

    Se você abrir um prompt de comando e executar o seu programa verá que mesmo sem o getch ele funcionará perfeitamente.

    Agora uma observação final: getch não faz parte do padrão da linguagem e portanto o seu código não vai funcionar em outros sistemas (como o Linux).

    O ideal é usar a função getchar() pois ela fará o mesmo e é padrão da linguagem, sendo definida em stdio.h:

    #include <stdio.h>
    main()
    {
    printf("Hello World");
    getchar();
    }

  11. O problema é a forma que está implementada a função. Mesmo que houvesse uma thread, o loop principal não teria resposta da thread enquanto o tiro não terminasse.

    O ideal nesse caso é fazer um código que não bloqueie. Por exemplo, para a função tiro, uma solução seria alterar a função de:

    void tiro(int p,int y)
    {
        for(y=24;y>=1;y --)
        {
            gotoxy(p,y); printf("|");
            delay(10);
            gotoxy(p,y); printf(" ");
            nave(p_r,p_m,p_n);
            inimigo(p_i,p_v,p_b);
            if(p_r==p_i || p_r==p_v || p_r==p_b)
            {
                if(y==1)
                    vi=vi-10;
            }
        }
        gotoxy(p,y); printf(" ");
    }
    para:
    int tiro(int p)
    {
        static int y = 0;
    
        if(!y) y = 24;
    
        gotoxy(p,y); printf("|");
        delay(10);
        gotoxy(p,y); printf(" ");
        nave(p_r,p_m,p_n);
        inimigo(p_i,p_v,p_b);
        if(p_r==p_i || p_r==p_v || p_r==p_b)
        {
            if(y==1)
                vi=vi-10;
        }
    
        if(!--y)
            gotoxy(p,y); printf(" ");
    
        return y;
    }

    Nesse código não existe o for. Você terá que chamar a função tiro do seu loop. Ela retorna o valor atual de y para você saber se já terminou ou não e assim parar de chamar a função de tiro. E não fica travado na função.

    Esse é apenas um exemplo de alterção de lógica para não travar. Tem muitas outras coisas que podiam ser feitas e alguns problemas a resolver como o caso de haver mais de um tiro, por exemplo.

    Mas te dá uma idéia de por onde comçear! :)

  12. Olá!

    Existem alguns problemas com o seu código.

    1) em C/C++, você deve acessar os itens de um vetor com o índice partindo de zero e não 1. Esse era o problema do Segmentation Fault.

    2) No seu primeiro loop (leitura do arquivo) você sempre lê 10 linhas. Mas o arquivo tem apenas 5! Isso faz você inserir vários elementos inválidos no vetor res. O correto é identificar o final e parar a leitura, salvando o número de linhas lidas.

    3) A ordenação bolha é feita no próprio vetor, não exige um vetor adicional. Assim, o vetor vet não é necessário.

    Eu corrigi o seu código. Veja abaixo a resposta:

    #include <stdio.h>
    
    int main(){
        int i,j, final = 0, linhas, trocou;
        int temp,temp2;
        int res[25][2];
        
        FILE * data;
        data = fopen("res.csv","r");
    
        for(i=0;i<25 && !final;i++){
            for(j=0;j<2;j++){
                if(fscanf(data,"%d",&res[i][j]) != 1) {
                    final = 1;
                    break;
                }
            }
        }
        fclose(data);
    
        linhas = i-1;
        do {
            trocou = 0;
            for(i=0;i<linhas-1;i++){
                if(res[i+1][1] < res[i][1]){
                    trocou = 1;
                    temp =res[i][0];
                    temp2=res[i][1];
                    res[i  ][0] = res[i+1][0];
                    res[i  ][1] = res[i+1][1];
                    res[i+1][0] = temp;
                    res[i+1][1] = temp2;
                }
            }
        } while(trocou);
    
        for(i=0;i<linhas;i++){
            printf("%d %d\n", res[i][0], res[i][1]);
        }
    
        return 0;
    }

    Se quiser que eu expllique o código, avise!

  13. Não tenho nada... Apenas a idéia! :)

    Eu já pensei em como seria o formato do arquivo e algumas outras coisas... Mas tudo precisa ser feitodo zero mesmo!

    A única base em si poderia ser algum algoritmo para identificar os padrões nos arquivos.

    Eu criei o projeto no github. Procure por utikawa/pba

    Abraços,

    Marcelo Utikawa da Fonseca

  14. Verifique o retorno, provavelmente ele já vai te ajudar bastante para descobrir o problema!

    E não há problema em ser operado por um usuário leigo. Ele só vai precisar aceitar o pedido de elevação, não precisará fazer nada.

    Eu não entendi sobre o script. Você diz em fazer em alguma outra linguagem? Um .bat???

    O que você está tentando fazer exatamente?

  15. Se precisar de ajuda, eu posso ajudar em tudo que eu tiver o conhecimento.

    Ótimo! Vou usar este tópico para dar detalhes de como está a idéia e querendo ajudar é só falar!

    Nunca usei, mas já ouvi falar e não vejo problema. Será feito em C ou C++?

    Por mim pode ser qualquer um deles. Não planejei nada ainda, só lancei a idéia para saber as opiniões, se alguém via algum problema que eu não houvesse imaginado.

    Vou criar o projeto no github então. Lá poderemos discutir sobre como será feito.

    A minha idéia é usar o Eclipse como IDE padrão pois é a em que eu trabalho. A vantagem de todos usarem a mesma IDE é poder compartilhar configurações do projeto, simplificando para que outras pessoas possam trabalhar no código pois o projeto já estaria no github, não apenas o código.

    Como das outras vezes, aberto a críticas e sugestões! :)

  16. O programa pode não dar erro mas a função que cria a chave pode ter retornado o erro. Verifique o retorno da função para ver se não está ocorrendo algum erro ao registrar a chave.

    Outra coisa: você rodou o programa como administrador? Se rodou como usuário normal vocÊ não terá permissão para criar a chave.

    Dê uma olhada na documentação da função também! Deve ajudar: http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx

  17. Threads são criadas para dividir tarefas maiores. Por exemplo: se no jogo existirem 100 naves, você não vai ter 100 threads...

    Imagine um algoritmo que execute uma lógica demorada. Nesse caso vale a pena ter threads pois assim você distribui o algoritmo para rodar em vários processadores, executando a ação mais rapidamente. Mesmo em um processador multi-core, se seu programa exigir 100% de carga de cpu, apenas 1 dos processadores ficará em 100% e os outros ociosos se você não usar threads.

    Outro exemplo: um programa que comunica em rede, serial, etc... Ele depende de resposta de computadores remotos para continuar e, durante esse período, seu programa deixaria de responder. Assim cria-se uma thread que é a responsável pela comunicação. Ela é quem vai ficar travada esperando a resposta enquanto seu programa pode continuar funcionando.

    O que exatamente você pretende fazer?

  18. O problema de ser simplificado é que o uso de threads não é algo assim tão trivial...

    Você também pode criar um outro processo usando o fork() e comunicar entre os processos por um pipe, por exemplo.

    Execute esse teste (em Linux):

    #include <stdio.h>
    #include <unistd.h>
    
    int main(void)
    {
       if(fork()) {
          printf("Eu sou o pai!\n");
       } else {
          printf("Eu sou o filho!\n");
       }
    
       return 0;
    }

    Nesse exemplo, um novo processo é criado a partir da "cópia" do processo atual, duplicando-o.

    A função fork() cria um novo processo. A partir de então o código será executado pelos dois processos em paralelo.

    A função retorna 0 se estiver executando o processo filho e o ID do processo criado se executando no processo pai.

    Pode parecer um pouco confuso no começo mas depois você acostuma! :)

×
×
  • Criar Novo...