quarta-feira, 3 de agosto de 2016

Visual Studio não salva startup project e solution config.

Eu tive alguns problemas com o Visual Studio C++ solution, sempre esquece as configurações da solution (debug e release), e do projeto (startup project) quando é aberto.

Eu tentei deletar vários projetos.
Deletar na pasta da solution o arquivo .sdf.

Até que pesquisando na internet descobri o arquivo que salva essa configurações. Provavelmente ficou corrompido.

A configuração é armazenada em um arquivo .suo. Este arquivo fica escondido dentro do diretório da solution.
(.vs\solution_name\v14\.suo).

Eu apaguei este arquivo e reinicie o VS C++.

;)

sábado, 21 de novembro de 2015

Problema de compilação do Qt Creator no Mac OS.

Olá



Para aquelas pessoas que trabalham com máquinas Mac (Apple) e o Qt Creator, vai aqui uma dica.

Recentemente eu tive um problema ao atualizar meu Mac OS para a versão 10.11. Ao tentar compilar meu projetos antigos, tive o seguinte problema: error: Could not resolve SDK path for 'macosx10.9'

Ei aqui a solucão para vocês ;-)


1) Vá até o diretório ~/Qt/5.3/clang_64/mkspecs
2) Edite o arquivo qdevide.pri
3) Modifique a definicão antiga QMAKE_MAC_SDK = macosx10.9 para QMAKE_MAC_SDK = macosx10.11



Espero ter ajudado.


Abraços

segunda-feira, 23 de março de 2015

TCL/TK - Trabalhando com data.

Bom dia Galera!!



Segunda feira chegou e começa a semana. Semana passada foi uma correria danada e sofri pra trabalhar com data no TCL. Então vou postar aqui meu código para que vocês não precisem sofrer como eu.

Fui incumbido de gerar alguns relatórios na empresa, por período. Ai vocês já podem imaginar, trabalhar com data de inicio e fim.

Procurei vários sites que me dessem uma luz, que por uma sorte me fornecesse um código pronto pra minha necessidade ;-)  Quebrei a cara kkkk

Então segue algumas dicas sobre o que aprendi lendo materais:

- Pegando a data atual da máquina


[clock scan [clock format [clock seconds] -format %Y-%m-%d]]


Dica: o TCL trabalha com um número inteiro que representa a data, então a partir do comando acima, você pode fazer uma comparação de datas, exemplo:


set data_inicio [clock scan [clock format [clock seconds] -format %Y-%m-%d]]

if { [expr $data_inicio < [clock scan 20150303]] } {

    # faça algo se for verdadeiro

}




- Transformando o tipo de dados data do TCL para string


set a [clock scan [clock format [clock seconds] -format %Y-%m-%d]]

set data_formatada [clock format $a {%d/%m/%Y}]



- Incrementando a data


set a [clock scan [clock format [clock seconds] -format %Y-%m-%d]]

for {set i 0} {$i < 10} {incr i} {

     set a [clock scan {+1 days} -base $a]

}




Essas foram algumas dicas que descobri, assim que tiver mais dicas eu postarei aqui.



Grande abraço, Emanuel

quarta-feira, 10 de dezembro de 2014

TCL - Multiplas condições em um IF

Olá galera,


Recentemente um estagiário meu estava sofrendo com o alinhamento de várias condições em um IF. Este caso me lembrou que eu já passei por isso e portanto decidi colocar aqui para vocês para que não "sofram" como nós.


O seguinte bloco de código não funciona:

if {{$number == 1 && $name == "hello"} || {$number == 0&&$name == "yes"}} {
    #faça algo
}

O interpretador envia mensagem de erro: IS EXPECTED TO BE A BOOLEAN.

O motivo é que os { } e os ( ) não podem ser colocados em paralelo. Mas no caso dos ( ) eles são reconhecidos como array (ex. $ar(2) ), por tanto, interpretado como array de booleanos.

Utilizem o seguinte bloco de código:

if {(($number == 1)&&($name == "hello")) || (($number == 0)&&($name == "yes"))} {
    #faça algo
}


Até a próxima, Emanuel

sexta-feira, 28 de novembro de 2014

TCL/TK - Acesso ao sistema de arquivos

Tcl possui diversos comandos que permitem acessar o sistema de arquivos de um computador. Muitos desses comandos, possuem opções que só estam disponíveis em um determinado sistema operacional.
Para uma maior portabilidade de seu programa, é recomendável utilizar apenas as opções indepentes de sistema operacional.

ComandoDescrição
fila atimeRetorna o tempo em segundos, a partir 01/01/1970, desde o último acesso ao arquivo. 
file attributesRetorna ao define os atributos de um arquivo. As opções são diferentes para o UNIX, o Windows e o MacOS. 
file copyCopia um ou mais arquivos para outro. 
file deleteRemove um arquivo. 
file dirnameRetorna o caminho completo de um arquivo. 
file executableRetorna 1 se o arquivo for um programa executável pelo usuário, 0 caso contrário.
file existsRetorna 1 se o arquivo existir( e se o usuário puder ler o seu diretório ), 0 caso contrário. 
file extensionRetorna a extensão de um arquivo. 
file isdirectoryRetorna 1 se o arquivo for um diretório, 0 caso contrário. 
file isfileRetorna 1 se o arquivo for um arquivo regular, 0 caso contrário. 
file joinUne nome de arquivo e diretórios, usando o separador correto para o sistema operacional. 
file lstatO mesmo que file stat, mas usando a chamada lstat do kernel. 
file mkdirCria um ou mais diretórios. Pode criar uma árvore inteira. 
file mtimeRetorna o tempo em segundos, a partir 01/01/1970, desde a última modificação no arquivo. 
file nativenameRetorna o nome específico do arquivo para o sistema operacional corrente.
file ownedRetorna 1 se o arquivo pertencer ao usuário, 0 caso contrário. 
file pathtypeRetorna o tipo do caminho: absolute, relative ou volumerelative. 
file readableRetorna 1 se o arquivo puder ser lido pelo usuário, 0 caso contrário. 
file readlinkRetorna o valor do link sinbólico. 
file renameRenomeia um arquivo. 
file rootnameRetorna o nome do arquivo sem a extensão. 
file sizeRetorna o tamanho do arquivo. 
file splitRetorna o caminho de um arquivo em uma lista. Cada subdiretório como um elemento da lista. 
file statRetorna os resultados da chamada à função stat do kernel em uma lista, cujos elementos são: atime, ctime, dev, gid, ino, mode, mtime, nlink, size, type e uid. 
file tailRetorna o nome do arquivo, sem o caminho. 
file typeRetorna o tipo do arquivo: file, directory, characterSpecial, blockSpecial, fifo, link ou socket. 
file volumeRetorna a lista dos drivers locais no Windows, dos drivers locais e de rede no MacOS e apenas "/" no UNIX. 
file writableRetorna 1 se o usuário puder escrever no arquivo, 0 caso contrário. 


Exemplo 


No Windows, não utilize "\" para separar diretórios e nomes de arquivos, use "/", pois Tcl interpreta o caractere "\" como um caractere especial. Se desejar poderá usar "\\".

TCL/TK - Funções e procedimentos

Procedimento é uma subrotina ou porção de código, que é executado a partir de um nome que o referencia. Uma função é um procedimento que retorna um valor.
Para entender melhor o que é uma função, vejamos o seguinte exemplo: 
Desejamos calcular o quadrado de um número dado e imprimi-lo na tela: 
proc quadrado {numero} {
      return [expr $numero * $numero]
}
puts [quadrado 2]
Retornará 4 pois 2 vezes 2 é igual a 4.  

Criando procedimentos e funções

Criamos procedimentos e funções através do comando proc. A sintaxe de proc e a seguinte:
proc nome {[argumento1] [argumento2]... [argumentoN]} {
     [upvar nível variável_acima variável_local]
     [global [variavel1] [variavel2]... [variavelN]
     instruções... 
     [return [valor]]
}

Onde nome é o nome do procedimento ou função, argumento1, argumento2, argumentoN são argumentos ou valores opcionais passados ao procedimento ou função, variavel1, variavel2, variavelN são variaveis globais( ou seja variáveis vistas em todo o programa ), instruções são as instruções que serão executadas no procedimento ou função e valor é um valor que opcionalmente será retornado ao procedimento que chamou a função. O comando upvar será estudado mais adiante.

Argumentos

Argumentos são valores passados para a função ou procedimento. No caso do exemplo visto acima, do cálculo do quadrado de um número, número é o argumento passado à função quadrado. Argumentos podem ter valores default, ou padrão. Assim, caso nenhum valor seja passado para a função, um valor padrao será usado como argumento. Para definir um valor padrão para um argumento devemos colocar o nome do argumento e o valor padrão entre chaves {}, assim:
proc quadrado {{numero 0}} {
     return [expr $numero * $numero]
}

Caso existam vários argumentos, cada argumento que possuir um valor padrão deverá vir entre chaves, assim:
proc nome {{argumento1 valor1} {argumento2 valor2}... {argumentoN valorN}} { ... }
Em muitos casos é importante fornecer valores padrões para os argumentos de uma função. Isso evitará erros de tempo de execução. Assim, estude bem suas funções e procedimentos. 

Escopo das variáveis

Variáveis podem ser visíveis em todo o programa, ou somente em partes dele. A isso se dá o nome de escopo. Quando uma variável não pode ser vista em determinada parte do programa, se diz que ela está fora do escopo da função ou procedimento.  
De um modo geral, variáveis criadas no interior de uma função ou procedimento, serão visíveis somente no interior da função ou procedimento onde foi criada. Para tornar uma variável visível em todo o programa, usa-se o comando global. Exemplo:
global código, nome, e-mail
Torna as variáveis código, nome e e-mail disponíveis para todo o programa. 
Entretanto, para utilizar as variáveis acima dentro de uma outra função, você terá que repetir o mesmo comando acima dentro da função onde deseja utilizar as variáveis. 
Muitas vezes entretanto, desejamos utilizar uma variável criada em um nível acima da nossa função, e não uma variável global. Nestes casos podemos utilizar o comando upvar, para criar um ponteiro para a nossa variável um ou mais níveis acima. Exemplo: 
upvar 1 registro reg
Faz com que a variável reg referencie a variável registro que está na função chamadora( um nível acima ). Caso nível seja precedido pelo sinal #, nível será tratado como um valor absoluto. Assim #0 estará se referindo ao nível mais alto no programa. 

Retornando valores

É possivel retornar valores de funções através do comando return, como visto no exemplo de introdução desta aula. Contudo, isso não é obrigatório. 

Criando biblioteca de funções

Bibliotecas de funções são arquivos contendo declarações de diversas funções que queremos reaproveitar em nossos programas. Não há nenhum formato especial para arquivos de bibliotecas.  
Para carregar uma biblioteca utilizamos o comando source. A sintaxe de source é:
source arquivo.tcl
Carregará a biblioteca
O comando source também pode ser usado para carregar programas inteiros em Tcl. Ao carregar um arquivo, source compilará e executará os comandos no arquivo.

Criando pacotes

Uma forma elegante de distribuir bibliotecas é colocando-as em pacotes. Um pacote é criado colocando um comando package provide no início do arquivo. A sintaxe de packageprovide é: 
package provide nome versão
Onde nome é o nome do pacote( biblioteca ) que se está provendo e versão é o número da versão do pacote. 
Para carregar um pacote coloque no ínicio de seu programa:
package require nome versão 
Onde nome é o nome do pacote( biblioteca ) que se está solicitando e versão é o número da versão do pacote. 
Para instalar um pacote em seu computador, crie um diretório, dentro do diretório das bibliotecas do Tcl, com o nome do pacote seguido da versão. Em seguida entre no diretório e execute o comando: 
pkg_mkindex .
Isso criará um índice que Tcl utilizará para encontrar o pacote. Examine o diretório do Tcl em seu computador para entender melhor os nomes dos diretórios de pacotes. 
O diretório das bibliotecas do Tcl no Windows é: 
C:\Arquivos de Programas\Tcl\lib\ 
E no Linux, normalmente é: 
/usr/lib/

Namespaces

Namespaces são a nova forma de encapsular variáveis e funções em bibliotecas e programas em Tcl. Trata-se de um tema avançado e difícil de entender para o iniciante.

quinta-feira, 27 de novembro de 2014

TCL/TK - Adicionando um simbolo N vezes no fim da string.

Boa tarde,



Estava com essa dúvida outro dia no trabalho, pesquisei no manual da linguagem e achei a seguinte solução.

Segue exemplos do código:

puts novastr [format "|%-25s|" hello]

Saída: |hello                        |



set novastr [format "|%-*s|" $qtd $str]



Outras opções que um amigo me enviou:

set novastr $str[string repeat " " [expr {25 - [string length $str]}]]
e
for {set novastr $str} {[string length $novastr] < 25} {} {
    append novastr " "
}


Att, Emanuel Moraes