Mostrando postagens com marcador C. Mostrar todas as postagens
Mostrando postagens com marcador C. Mostrar todas as postagens

quarta-feira, 21 de março de 2012

Dicas de Programação: Como instanciar uma variável dentro de uma função em C?

Não sei se isso ajuda muita gente... Mas, para instanciar uma variável em uma função de C, pode-se fazer assim:

#include <stdio.h>
#include <stdlib.h>
//Tipo "registro": estrutura que possui uma variavel id do tipo inteiro
typedef struct registro
{
int id;
} registro;

//Função que recebe um ponteiro de um ponteiro da estrutura "registro"
void iniciarRegistro(registro** reg)
{
       //Aloco memória para a estrutura "registro"
      *reg = (registro*) malloc(sizeof(registro));
      //Seto o id como 10
      (*reg)->id = 10;
}

//Função principal
int main(int num_args, char** arg)
{
     //Objeto r do tipo "registro", sem instância (NULL)
      registro* r = NULL;
     //Chamo a função para instanciar r (passo r como paramêtro)
      iniciarRegistro(&r);
     //Escrevo o valor na tela (10)
      printf("Registro ID: %d\n", r->id);
     //Libero memória
      free(r);
     //Termino a aplicações com status OK
      return 0;
}

E não é que funciona mesmo? :P

Até mais!

segunda-feira, 29 de agosto de 2011

Dicas de Programação: Lendo um arquivo-texto em C

Sei lá, estou realmente sem assunto...
Para ler um arquivo-texto em C, basta abrir o arquivo para leitura com o comando fopen:

//Abre o arquivo para leitura
FILE* arq = fopen("<nome_do_arquivo>","r");

Para pegar linha por linha, basta utilizar o comando fgets:
//Enquanto não chegar no fim do arquivo
while(!feof(arq)) {
char linha[256];
//Lê uma linha do arquivo
fgets(linha, 255, arq);
//Imprime a linha no prompt
printf("%s\n", linha);
}

Ai, é só fechar o arquivo (senão, ele fica preso e não poderá ser aberto de novo...).
//Fecha o arquivo
fclose(arq);

Acho que é isso...

Até mais!

sexta-feira, 29 de julho de 2011

Dicas de Programação: Argumentos variaveis em C/C++

Primeiramente, precisamos saber o que são argumentos variaveis...
Argumentos variaveis são instruções que podem receber 1 ou mais parâmetros, não contendo um número definido destes.
Um exemplo clássico é o método printf do stdio.h:

int a = 10;
char* b = "dez";
printf("%d %s", a, b);

Para criar uma função assim, primeiramente é necessário incluir a biblioteca stdarg.h:

#include <stdarg.h>

Depois, podemos criar a função com o último parâmetro definido com 3 pontos (...):

void printNumber(int a, ...) {
}

Para percorrer os parâmetros passados (onde a quantidade não esta definida), devemos usar o tipo va_list e as funções va_start, va_arg e va_end:

void printNumber(int a, ...) {
va_list args;
int i = a;
va_start(args, a);
while (i) {
printf("%d ", i);
i = va_arg(args, int);
}
va_end(args);
}

Agora, é só chamar assim:

int main(int num_args, char** args) {
printNumber(1,2,3,4,5,6,7,8,9,10, NULL);
return 0;
}

Obs.: Como se utiliza a função printf é necessário incluir a biblioteca stdio.h

Até mais!

quarta-feira, 27 de julho de 2011

Dev C++ - IDE livre de C++ para MS-Windows

Pessoal, desculpe por não postar nada nestes últimos dias... É que estava ocupado com alguns problemas de saúde, nada para se preocupar, mas precisava realmente me cuidar...

Agora, voltamos a programação normal. :)

Muita gente reclama das IDEs disponiveis para C/C++... O Visual Studio custa caro e é pesado, o Eclipse C/C++ é pesado e precisa da JVM para rodar... Procurando o aí, encontrei uma IDE free e leve chamada Dev C++.


Ele já vem com o compilador GCC/G++ e o depurador GDB integrados.

Não é uma maravilha, mas quebra um galho para quem não tem dinheiro para comprar outras ferramentas (o que é o meu caso...). :)

Para saber mais e baixa-lo, utilize o link abaixo:
http://www.bloodshed.net/devcpp.html

Até o próximo post. ;)

quarta-feira, 11 de maio de 2011

Dicas de Programação: Como verificar se um valor é infinito ou NaN em C?

Então, como eu posso verificar se um float possui um valor válido (sem ele ser infinito ou NaN)?

Simples, usando as funções isnan e isinf da biblioteca math:

#include <math.h>
#include <stdio.h>

int main(int num_args, char* args[])
{
float a = 0.0/0.0;
if (isnan(a))
{
printf("a=NaN\n");
}
a = 1.0/0.0;
if (isinf(a))
{
printf("a=Infinite\n");
}
a = 3.0/1.0;
printf("a=%f\n",a);
return 0;
}

Vi que alguém procurou isso no meu blog, por isso resolvi escrever. :)
Espero que ajude...

Até!

terça-feira, 26 de abril de 2011

Dicas de Programação: A instrução fork em C (Linux)

No Linux, a instrução fork cria um novo processo dentro de sua aplicação:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int num_args, char** args) {
int pid = fork();
int numero = 10;
if (pid < 0) {
printf("Erro ao criar processo.");
exit(-1);
} else if (pid == 0) {
while (numero > 0) {
sleep(5);
numero--;
printf("Processo 1 - Executando: %d\n", numero);
}
exit(0);
} else if (pid > 0) {
while (numero > 0) {
sleep(3);
numero--;
printf("Processo 2 - Executando: %d\n", numero);
}
exit(0);
}
return 0;
}

Ou seja, isso não é uma thread que é executado em um mesmo processo, e sim, dois processos separados. Se você for no console e ver os processos (comando "ps aux"), verá que aparece duas vezes o nome de seu programa na listagem.

Legal! :)

Até mais!

quarta-feira, 23 de março de 2011

Dicas de Programação: Entendendo posicionamento de memória em C/C++

Isso foi uma dúvida de um colega meu sobre alocação de memória em C/C++:

Vamos ver a seguinte instrução:

#include <stdio.h>
#include <malloc.h>

int main(int num_args, char** args) {
//Aloco na memória, um inteiro
int* inteiro = (int*)(malloc(sizeof(int)));
//Veja qual endereço de memória, ele alocou (Ex.: 4074488)
printf("%d\n", inteiro);
//Adiciona mais um no endereço, teoricamente vai para 4074489
inteiro++;
//Exibo o endereço (4074492 (???))
printf("%d\n", inteiro);
//Libero memória
free(inteiro);
//Espero um <enter> :P
getchar();
//Finalizo a função
return 0;
}

A dúvida: Por que diabos quando eu somo um em ponteiro, ele vai para um outro número nada a ver?

Não é bem assim...
Quando eu somo +1, ele vai para o próximo endereço que é alocavel para um inteiro, ou seja, se o tamanho do inteiro é 4 bytes (em gcc, eu acho que é...), então se tenho o endereço 4074488, se eu somar +1, ele vai para 4074492, 4 bytes a mais, por causa que o que ele tem que alocar é um inteiro.

Se eu utilizar um char em vez de inteiro no código:

#include <stdio.h>
#include <malloc.h>

int main(int num_args, char** args) {
char* b = (char*)(malloc(sizeof(char)));
printf("%d\n", b);
b++;
printf("%d\n", b);
free(b);
getchar();
return 0;
}

Agora vai "aparecer corretamente", pois o char em gcc é um byte (eu acho...), então se tenho 4074488 se somo +1 no endereço, ele vai para 4074489 :)

Até mais!