Ir para conteúdo
Fórum Script Brasil

Wicker Man

Membros
  • Total de itens

    268
  • Registro em

  • Última visita

Tudo que Wicker Man postou

  1. Opa! No loop do servidor, observe a seguinte linha: t->tempo[ ++t->inic ] = recv( listenfd, cmd, bufsize, 0 ); O membro "tempo" da estrutura "t" é inteiro, e nessa linha você tenta igualá-lo a uma string. Se a string "cmd" for um número, use a função "atoi" para converter essa atring para um inteiro: t->tempo[ ++t->inic ] = atoi( recv( listenfd, cmd, bufsize, 0 ) ); Observe também que "t->inic" não tem um valor inicial. Sendo assim, corre o risco de o valor armazenado nele ultrapasse os limites do array. Até mais!
  2. Wicker Man

    Criar Diretórios

    Opa! Faça a seguinte inclusão: #include <cstdio> Até mais!
  3. Opa! Para que essas funções funcionem no Dev, você deve carregar a lib correspondente. No menu, vá em Projeto->Opções do Projeto; clique na aba "Parâmetros" e escreva na caixinha de texto "Linker" a seguinte linha: -lodbc32 Finalmente, clique em "Ok". Até mais!
  4. Wicker Man

    Criar Diretórios

    Opa! Fiz isso no primeiro código: sprintf( caminho, "%s\\%s", dir, arq ); // Mescla o nome do arquivo com o do diretório // para formar o caminho completo do arquivo // e joga o resultado em "caminho" A função "sprintf" é como uma "printf", só que ela imprime em uma string. Analise a linha de comando e os comentários acima que você entenderá. Até mais!
  5. Wicker Man

    Criar Diretórios

    Opa! Para criar um diretório, inclua "dirent.h" e use a função "mkdir": int mkdir( const char *dir ); onde "dir" é o nome do diretório. Para modificar arquivos dentro do diretório, pode fazer o seguinte: FILE *f; char dir[ 20 ], caminho[ 40 ], arq[ 20 ]; scanf( "%s", arq ); // Lê o nome do arquivo scanf( "%s", dir ); // Lê o nome do diretório sprintf( caminho, "%s\\%s", dir, arq ); // Mescla o nome do arquivo com o do diretório // para formar o caminho completo do arquivo // e joga o resultado em "caminho" f = fopen( caminho, "r" ); if ( f == NULL ) printf( "CAMINHO INCORRETO." ); else { // Aqui você modifica o arquivo fclose( f ); // Quando não precisar mais do arquivo } Até mais!
  6. Wicker Man

    Protocolos

    Opa! Você deve usar sockets e, quanto à escolha dos protocolos, essa parte será feita em especificações de funções e argumentos enquanto estiver programando. Se está usando Windows, a API a ser utilizada é a WinSock, e você pode encontrar informações em http://tangentsoft.net/wskfaq/ e http://msdn.microsoft.com/library/. Até mais!
  7. Opa! Inicialmente você deve declarar as seguintes variáveis: HDBC hdbc; // Handle da conexão HENV henv; // Handle do ambiente ODBC HSTMT stmt; // Handle do comando SQL Agora você deve alocar memória para esses handles: SQLAllocEnv( &henv ); SQLAllocConnect( henv, &hdbc ); Para conectar usa-se a função "SQLConnect", da seguinte forma: SQLConnect( hdbc, db_name, SQL_NTS, user_id, SQL_NTS, pass, SQL_NTS ); As variáveis "db_name", "user_id" e "pass" são do tipo "unsigned char *", e representam, respectivamente, o nome do banco de dados, o ID do usuário e a senha. Para executar comandos SQL, pode-se usar a função "SQLExecDirect" (depois de alocar memória para o handle "stmt". SQLAllocStmt( hdbc, &hstmt ); SQLExecDirect( hstmt, cmd, SQL_NTS ); A variável "cmd" é o comando SQL a ser executado e é do tipo "unsigned char *". Para liberar a memória alocada e desconectar faz-se: SQLFreeStmt( hstmt, SQL_DROP ); SQLDisconnect( hdbc ); // Desconectar SQLFreeConnect( hdbc ); // Aqui é liberada a memória alocada para "hdbc" SQLFreeEnv( henv ); Até mais!
  8. Wicker Man

    Mais Uma Duvida Em C++

    Opa! Use a função "getch()", definida na biblioteca "conio.h". O caractere digitado é retornado. Por exemplo: ... char c; c = getch(); if ( c == 's' ) cout << "Sim" << endl; else if ( c == 'n' ) cout << "não" << endl; else cout << "Caractere inválido." << endl; ... Até mais!
  9. Opa! Para usar sockets no windows é preciso usar a API WinSock. Você deve: 1. Incluir, no lugar de #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> isso: #include <winsock2.h> 2. Faça a seguinte declaração: WSAData info; 3. No início do código, logo depois da declaração das variáveis, coloque: WSAStartup( MAKEWORD( 2, 0 ), &info ); Essa é a rotina de inicialização da API WinSock 2 (esse "MAKEWORD( 2, 0 )" indica a versão). Na variável "info" ficarão armazenadas informações sobre a biblioteca inicializada. 4. No final do código você deve adicionar a linha WSACleanup(); para liberar os recursos alocados para essa API. 5. No menu do Dev, vá em Projeto->Opções de Projeto. Na aba "Parâmetros", clique em "Adicionar", vá ao diretório no qual está instalado o Dev, acesse a pasta "lib" e dê um duplo clique no arquivo "libws2_32.a". Clique em OK e pronto. Até mais!
  10. Opa! Use o método "clear" como mostrado abaixo para desativar o indicador de fim de arquivo do objeto "inCliente". inCliente.clear() Até mais!
  11. Opa! Veja se estes links são úteis: http://www.coding-zone.co.uk/cpp/articles/...ccessodbc.shtml http://www.dei.isep.ipp.pt/~alex/publico/a...0Cpp%20ODBC.pdf Até mais!
  12. Wicker Man

    Programa Do Cpf

    Opa! Um código baseado nos valores decimais correspondentes aos caracteres na tabela ASCII. Os correspondentes em decimal dos caracteres numéricos (números de 0 a 9) na tabela vão de 48 a 57. Sendo assim, temos o código: bool isNumber( char cpf[] ) { for ( int i = 0; i < 11; i++ ) { if ( cpf[ i ] >= 48 && cpf[ i ] <= 57 ) return true; else return false; } } Algumas observações: 1 - No laço "for" pode-se usar a função "strlen", contida na biblioteca "string.h", para achar o comprimento da sua string e substituir o 11 que eu coloquei, pois coloquei 11 porque é o número de dígitos do CPF, mas você pode querer usar em string numéricas de outros comprimentos. 2 - Você pode se basear no código acima e na tabela ASCII para testar também se a sring é completamente formada por letras, sabendo que, nessa tabela, letras maiúsculas são diferentes das minúsculas. Até mais!
  13. Wicker Man

    Me Ajudem!

    Opa! "info" é um ponteiro? Se não for, o uso do operador "delete" está incorreto. Além disso, no "if", você tenta comparar diretamente dois objetos da estrutura "elemento_lista" ("v" e "info"), quando você deveria comparar membro a membro esses objetos (a menos que sobrecarregue o operador "=="). Por exemplo, digamos que a estrutura "elemento_lista" contenha dois membros inteiros: "x" e "y". Para comparar "v" e "info" baseando-se no seu código (e considerando que "info" seja um ponteiro): ... if ( local[ aux ].info->x == v.x && local[ aux ].info->y == v.y ) ... Até mais!
  14. Wicker Man

    Me Ajudem!

    Opa! Na hora de comparar os objetos do tipo "lat_long" (no while) deve-se comparar membro a membro: void eliminar( no **pri, elemento_lista *v ) { no *s, *ant; s = *pri; while( s->link != NULL && s->info.lat != v->lat && s->info.lon != v->lon ) { ant = s; s = s->link; } if ( s == *pri ) *pri = s->link; else ant->link = s->link; delete s; } Até mais!
  15. Wicker Man

    C++ Ficheiros

    Opa! Aí, dê uma olhada nisso. Se precisar de mais informações, dê uma vasculhada no Google. Até mais!
  16. Opa! Olha só, uma API é um conjunto de funções e métodos que permitem que os programadores usem funcionalidades específicas. No caso que você citou, estamos tratando da declaração de uma função da API Win32. Essa função representa a função "main" de um programa que utiliza a API Win32. Para ler mais sobre, visite este site. Até mais!
  17. Opa! Olha só, o ponteiro "p" deve ser um ponteiro para um ponteiro, visto que você precisa alocar um array bidimensional. Sendo assim, a declaração e a alocação deverão ficar assim: int **p, linhas = 5, // linhas do array bidimensional colunas = 11; // colunas do array bidimensional int i; // Aloca um array de ponteiros: p = ( int ** )malloc( linhas * sizeof( int * ) ); if ( !p ) { printf( "A memoria não pode ser alocada." ); return 1; } // O código a seguir percorre o // array de ponteiros alocando // memória para eles: for ( i = 0; i < colunas; i++ ) { p[ i ] = ( int * )malloc( colunas * sizeof( int ) ); if( !p[ i ] ) { printf( "A memoria não pode ser alocada." ); return 1; } } Está faltando também fechar a chave aberta da função "main". Até mais!
  18. GABARITOS Os gabaritos permitem que você, escrevendo uma só vez uma função ou classe, declarar várias funções (ou classes) sobrecarregadas. Por exemplo, você pode escrever uma função que retorne um tipo de dados X. Na hora de chamar a função, você especifica que tipo é X. Pode ser int, double, char, etc., ou seja, você tem um monte de funções sobrecarregadas escrevendo o seu código apenas uma vez. Vamos começar pelas funções gabarito (funções que utilizam gabaritos). Pra definir uma função gabarito, você começa a definição com a definição do tipo gabarito, da seguinte forma: template< class X > Colocando a linha acima antes da definição de uma função você está qualificando a função como uma função gabarito. A partir daí você pode declarar variáveis do tipo X dentro da função (inclusive, como já foi dito, retornar dados do tipo X). Observe: template< class X > X funcao( X var ) { cout << var << endl; return var; } Ao chamar a função ela irá se adequar ao tipo que você passar para ela como argumento. Por exemplo: #include <iostream> using namespace std; template< class X > X funcao( X var ); int main() { int x1 = 3, y1; double x2 = 3.141592, y2; char x3 = ‘D’, y3; y1 = funcao( x1 ); y2 = funcao( x2 ); y2 = funcao( x2 ); cout << “y1: “ << y1 << endl << “y2: “ << y2 << endl << “y3: “ << y3 << endl; return 0; } template< class X > X funcao( X var ) { cout << var << endl; return var; } Agora partamos ao estudo de gabaritos de classe. Da mesma forma dos gabaritos de funções, você pode criar classes de forma mais genérica. A definição de classes gabarito se dá de maneira análoga à de funções gabarito: adicionando a linha template< class X > antes da definição. Uma particularidade é que também se deve adicionar essa linha antes da definição dos métodos dessa classe. #ifndef ARRAY_H #define ARRAY_H template< class X > class Array { public: Array( int = 10 ); ~Array(); void print() const; X *get() const; private: X *array; int tamanho; }; #endif template< class X > Array< X >::Array( int n ) { tamanho = ( n > 0 ? n : 10 ); array = new X[ tamanho ]; } template< class X > Array< X >::~Array() { delete [] array; } template< class X > void Array< X >::print() const { for ( int i = 0; i < tamanho; i++ ) cout << array[ i ] << “ “; } template< class X > X *Array< T >::get() const { return array; } Bem, analisemos o código acima. Primeiro notemos que o constructor é declaredo com um valor default, ou seja, se, na instanciação de um objeto da classe Array, nenhum valor for passado para o construtor de Array, o valor default será passado. Observe o const nas funções “print” e “get”. Ele diz que essa função não irá modificar o objeto ao qual ela pertence, e, caso isso aconteça, um erro será apontado. De fato, nem “print” nem “get” em nenhum momento modificam o objeto. Agora vejamos um ponto essencial para a nossa discussão. Conforme já foi dito, usando gabarito de classes é como se você criasse um grande número de classes escrevendo o código uma só vez. Na hora de definirmos um método de uma classe, informamos a classe à qual ele pertence (ou seja, o seu escopo) e depois, usando o operador “::” (resolução de escopo), apontamos qual método queremos definir. Então, sendo que se definiu a classe de maneira genérica, seus métodos também devem ser definidos assim. Dessa forma, na hora de indicarmos a classe contendedora do método, usamos o nome da classe seguido de “< X >” (usamos “X” para esse caso, mas pode-se colocar qualquer nome pra definir o tipo genérico). Observe atentamente a definição dos métodos da classe Array para entender melhor. A instanciação de um objeto de uma classe gabarito também tem um ponto especial. Na hora de instanciar, deve-se indicar o tipo formador da classe entre os sinais “<” e “>”. Por exemplo, se quiséssemos instanciar um Array de inteiros, faríamos: Array< int > a; A mesma regra para os outros tipos de dados. A linha acima geraria um objeto Array de inteiros de tamanho 10 (uma vez que não foi passado nenhum valor para o construtor). Agora vamos cirar um Array de números reais de tamanho 100: Array< double > d( 100 ); Então eu vou parar por aqui. Qualquer eventual erro e/ou dúvida, comentem. Até mais!
  19. Wicker Man

    Árvore B+

    Opa! Aí, dá uma olhada nesse link. Até mais!
  20. Wicker Man

    #include Recursivo

    Opa! Olha só, a classe conta não deveria ter um objeto pessoa (uma conta não tem uma pessoa; a pessoa é que tem a conta). Até mais.
  21. Opa! Você coloca um loop "for" com uma variável controladora que variará de 1 até precisão determinada, incrementando-a de 2 em 2. Assim: for ( int i = 1; i <= precision; i += 2 ) No código acima, a variável "i" é a supradita variável controladora e "precision" é a precisão do cálculo. A variável "i" será também os expoentes de "x" e os valores dos quais serão calculados os fatoriais nos denominadores. A partir daqui você usa (dentro do loop) uma variável pré-declarada e inicializada com 0 - e do tipo "double" - e vai somando as parcelas calculadas a essa variável. Seria conveniente também escrever uma função que calcule o fatorial. Espero ter sido claro. Até mais!
  22. Wicker Man

    Começando Em C++

    Opa! Observe o código seguinte: #ifndef VEICULO_H #define VEICULO_H // É recomendável usar o nome da classe // como o nome do arquivo. #include <iostream> using namespace std; // Essa linha é necessária para // usar o espaço de nomes std, // onde estão definidos "cin", // "cout", "endl", etc. class Veiculo { public: // Você declarou o construtor // mas não o definiu. // O construtor é um método // que sempre é executado // ao se criar um objeto // da classe em questão. Veiculo() { cout << "Objeto criado." << endl; } // A declaração das strings estavam erradas: // ao invés de "char[] carro", é "char carro[]". void detalhes(char carro[], char marca[], double preço) { // "cout" trabalha com o operador "<<". // E observe abaixo como imprimir uma variável cout << "Carro {\nNome:" << carro; cout << "Carro {\nMarca:" << marca; cout << "Carro {\nPreço:" << preço; } }; #endif // VEICULO_H Dê uma olhadinha neste site, e dê uma lida com mais atenção no link que eu já te passei pra você entender melhor as coisas valeu? Mais uma coisinha: se cadastra aí, cara! É rapidinho... Até mais!
  23. Wicker Man

    Começando Em C++

    Opa! Você pode começar dando uma olhadinha aqui. A partir daí é só postar mais espacificamente qual é a sua dúvida. Até mais!
  24. Wicker Man

    Começando Em C++

    Cara, receio que esse código seja de C# e não de C++, por isso a montanha de erros.
  25. Wicker Man

    Streams De E/s

    Nesse programa você está usando um arquivo de acesso seqüencial, ou seja, você acessa os dados seqüencialmente, de acordo com a ordem na qual eles foram colocados lá. Sendo assim, você gastaria muito desempenho na tarefa de procurar um registro nesse arquivo (principalmente se esse arquivo for composto por um número muito grande de registros). Então é recomendável usar arquivos de acesso aleatório, com os quais é possível "pular" para um determinado registro diretamente através do método "seekp" ou do "seekg". E os métodos usar para escrever no arquivo e ler do arquivo são, respectivamente, "write" e "read". Dê uma garimpada em uns tutos da net sobre isso, e poste mais dúvidas quando for o caso. Até mais!
×
×
  • Criar Novo...