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!
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
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!
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!
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. ;)
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é!
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!
#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!
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!
Assinar:
Postagens (Atom)
