-
Posts
6.526 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que arfneto postou
-
Como saber se um PC irá conseguir se conectar com Wi-Fi Wireless?
arfneto respondeu ao tópico de EnzoMarinho em Redes e Internet
Não estou dizendo para trocar a placa-mãe. Apens compre uma placa de rede wifi, tipo PCI, e coloque lá dentro. É mais simples que colocar um adaptador numa porta USB. E a performance é melhor Algo simples. Tem PCI e PCI-x -
Se está funcionando está bem. Mas você tem que declarar algo dessa classe para poder usar, e não é isso que você quer, já que o que procura é só usar os dois métodos da classe, que não dependem de nada da classe em si. Ela não tem estado, digamos. É só uma biblioteca de funções. Em C++ (como eu disse, tinha me esquecido que o tópico era C++) bastaria algo assim struct libCPF { static int calculaDV(const char* numero); static bool DV_ok(const char* numero); }; e main() em C++ ficaria int main(int argc, char** argv) { const char* numero = "111222333"; int n = libCPF::calculaDV(numero); printf("DV calculados para '%s'= %d\n", numero, n); // agora poe o DV e testa com a outra rotina char numero_com_dv[12]; memcpy(numero_com_dv, numero, 9); numero_com_dv[9] = n / 10 + '0'; numero_com_dv[10] = n % 10 + '0'; numero_com_dv[11] = 0; printf("numero com DV: '%s'\n", numero_com_dv); if (libCPF::DV_ok(numero_com_dv)) printf("DV ok para '%s'\n", numero_com_dv); else printf("Erro com o DV calculado para '%s'\n", numero_com_dv); }; // main Sim, bastou acrescentar o prefixo da classe libCPF:: em C++ em relação ao programa em C como vê acima Eis o programa todo em C++ #include <iostream> using namespace std; struct libCPF { static int calculaDV(const char* numero); static bool DV_ok(const char* numero); }; int main(int argc, char** argv) { const char* numero = "111222333"; int n = libCPF::calculaDV(numero); printf("DV calculados para '%s'= %d\n", numero, n); // agora poe o DV e testa com a outra rotina char numero_com_dv[12]; memcpy(numero_com_dv, numero, 9); numero_com_dv[9] = n / 10 + '0'; numero_com_dv[10] = n % 10 + '0'; numero_com_dv[11] = 0; printf("numero com DV: '%s'\n", numero_com_dv); if (libCPF::DV_ok(numero_com_dv)) printf("DV ok para '%s'\n", numero_com_dv); else printf("Erro com o DV calculado para '%s'\n", numero_com_dv); }; // main int libCPF::calculaDV(const char* numero) { // aqui vão os digitos 1 a 1 para calcular os DV int digito[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int soma = 0; int i = 0; for (i = 0; i < 9; i += 1) digito[i] = numero[i] - '0'; // o primeiro digito verificador, modulo 11 dos 9 soma = 0; for (i = 0; i < 9; i = i + 1) soma = soma + digito[i] * (10 - i); // 10..2 // essa e a conta que da nome ao processo soma = soma % 11; if (soma > 1) digito[9] = 11 - soma; else digito[9] = 0; // o segundo DV, modulo 11 dos 10 soma = 0; for (i = 0; i < 10; i = i + 1) soma = soma + digito[i] * (11 - i); // 11..2 // essa e a conta que da nome ao processo soma = soma % 11; if (soma > 1) digito[10] = 11 - soma; else digito[10] = 0; //printf("\nDV calculados: %d %d\n", digito[9], digito[10]); return digito[9] * 10 + digito[10]; }; // libCPF::calculaDV() bool libCPF::DV_ok(const char* numero) { if (strlen(numero) < 11) return 0; char cpf[10]; memcpy(cpf, numero, 9); cpf[9] = 0; int dv = (numero[9] - '0') * 10 + numero[10] - '0'; int calculado = calculaDV(cpf); return (dv == calculado); }; // libCPF::DV_ok() Claro, há muitas maneiras de fazer isso e essa pode nem ser muito boa em C, C++ ou java ... Mas calcula os DV e mostra a mecânica da coisa.
-
Ainda a título de sugestão e ligeiramente off-topic: Essas linguagens são muito parecidas, C++ e java. Muito mesmo. Tanto que em muitos casos você pode recortar e colar trechos de código e só alterar alguma coisa entre java e C++. Algumas definições de classe por exemplo, métodos virtuais, classes abstratas, override, se mudam identificadores, e ainda assim fica parecido. E isso não é ruim. Vou te mostrar um exemplo relacionado a esse caso para você considerar. Imagine que você queira ter duas funções: uma que você passa o CPF com 9 dígitos e ela te devolve os DV: calculaDV() outra que recebe o CPF com 11 e ela calcula o dígito e verifica se certo, talvez respondendo com true ou false: DV_ok() Em java public static int calculaDV(String numero); // recebe 9 e devolve os DV de 00 a 99 public static boolean DV_ok(String numero); // recebe 11 e diz se os DV estão certos Em C++ int calculaDV(const char* numero); // recebe 9 e devolve os DV de 00 a 99 int DV_ok(const char* numero); // recebe 11 e diz se os DV estão certos Pois é: até os comentários são iguais. Agora veja os programas lado a lado. Sim, eu copiei de um pro outro e alterei umas linhas apenas... calculaDV() DV_ok() Até main() é igual para um teste bem besta. O MESMO teste: E o resultado, claro. Entendeu a razão de usar static em java? Não se usa uma instância nesse caso. Fica mais chato e menos útil. Em C++ é igualzinho. Eu escrevi em C por engano, mas compila em C++. Depois eu posto como seria em C++ mas já adianto que é igual a java
-
Ethernet parando de funcionar todos os dias
arfneto respondeu ao tópico de Leandroazc em Redes e Internet
Não deve ter nada errado com sua placa de rede ou as configurações do modem, mesmo porque não está mexendo nisso. Trata-se apenas da configuração de TCP/IP na sua máquina. Exclua essa placa de rede no gerenciador de dispositivos. O windows vai reinstalar logo em seguida. Se o sistema está vendo um outro gateway fora de sua rede local é porque deixou algo configurado errado na OUTRA placa. Redefina as configurações de rede para a placa wifi. E não rode mais --- repito --- não rode mais o diagnóstico de rede do Windows. -
Ethernet parando de funcionar todos os dias
arfneto respondeu ao tópico de Leandroazc em Redes e Internet
Eu disse que era só para saber. Você não tem controle sobre isso e não pode usar esse endereço na rede interna. Quem tem acesso a ele é o modem. É um endereço de sída do seu modem e não da sua rede. E pode mudar a qualquer momento, dependendo da topologia da rede da VIVO. Não mexa nisso. Seu gateway padrão é o endereço do roteador na LAN. 192.168.15.1 E esse não é o seu problema. Escreva mais sobre o que acontece para ver se tem dá alguma ideia do problema. A concessão do DHCP pode ser renovada a qualquer momento e não seguiria qualquer horário. E é o mesmo para qualquer dispositivo ethernet, seja wifi ou não. Basta que tenha um endereço MAC e envie pacotes pedindo endereço IP pela rede ethernet. Ethernet. Não IP. -
É a mesma coisa que em sua casa se a rede for similar. Se a rede tiver mais camadas pode ser um inferno. Mas se tiver um modem na entrada como roteador e o servidor estiver ligado direto nessa rede, basta ir lá nas configurações do roteador do escritório e configurar o redirecionamento, port forwarding, do tráfego dessa porta para o endereço onde está o servidor. A prudência manda em geral inventar outra porta, alta, tipo 32033, sei lá. E configurar o seu micro para usar tal porta para o banco de dados. E lá na empresa redirecionar o tráfego entrando nessa porta para a porta do banco de dados no endereço IP em que ele está. Assim tem um pouco mais de proteção do que expondo o tráfego direto para a porta conhecida do banco de dados. E não contar pra ninguém
-
Ethernet parando de funcionar todos os dias
arfneto respondeu ao tópico de Leandroazc em Redes e Internet
Numa rede doméstica o gateway padrão é o modem: Tudo que não for para a rede local vai para o modem e daí para o gateway padrão dele e assim por diante... Assim o gateway padrão é o endereço LAN do modem, 192.168.15.1. Só por curiosidade o gateway padrão do seu modem, configurado pela operadora, está em status | internet | detalhes. Com essas faixa você pode usar os endereços de .2 a .9 e de .201 ate .254 para sua rede local, sem medo de conflito com os endereços servidos pelo DHCP. -
C Bom. To com dificuldade em compilar esse programa.
arfneto respondeu ao tópico de Ace Flamel em C/C#/C++
Em especial quando está aprendendo e antes de seu programa estar pronto, mostre os valores lidos... Por outro lado, scanf() não foi feita para ler valores do teclado e então aparecem problemas com o que ainda tinha para ser lido ou a rotina pegando caracteres de outras linhas ou passando reto pela leitura. Um inferno. Uma maneira de fazer com que ela consuma tudo que tem na linha é usar algo como '%*c' no final da máscara de scanf(). Assim a rotina lê e despreza um caracter, que se espera que seja o '\n' o tal ENTER. O '%c' lê uma letra, mas o '*'faz com que a tal letra seja desprezada, e assim você não precisa declarar uma variável que nem vai usar... Algo assim scanf("%f %f%*c", &A, &B); Uma maneira mais comprida e mais legível seria usar um loop int ch = 0; do { ch = getc(stdin); } while ((ch != '\n') && (ch!= EOF)); quando usar scanf() entenda que ela retorna um valor e USE isso. É melhor para você. Nem sempre o usuário digita as coisas como você esperava. Ou scanf() lê como você imaginava... Assim funcionaria por exemplo #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<conio.h> int main() { float A, B, resultado; char C; printf("\nDigite os Operandos\n"); int n = scanf("%f %f%*c", &A, &B); printf("\nLidos %d valores. Operandos: %6.2f %6.2f\n", n, A, B); printf("\nDigite o operador:\n"); C = getchar(); printf("\nOperador: '%c'\n", C); switch (C) { case '+': resultado = A + B; break; case '-': resultado = A - B; break; case '*': resultado = A * B; break; case '/': if (B > 0) resultado = A / B; break; default: printf("\nOperador inválido\n"); break; }; // switch() printf("O resultado da operação é:%.2lf", resultado); return 0; }; // main() Mas veja o que sai em meu computador Digite os Operandos 1.23 3.256 Lidos 2 valores. Operandos: 1.23 3.26 Digite o operador: - Operador: '-' O resultado da operaþÒo Ú:-2.03 Porque? scanf() está lendo 2 valores então se você usa essa rotina o usuário pode teclar 300 ENTER antes ou durante a entrada dos dois valores. E veja que ao final saiu meio confuso: Então mais um palpite: não use acentos. Não serve para nada. Só dá problema. E cuidado com o cara usar vírgula ou ponto nos valores float para o ponto decimal. Esse é outro inferno... -
Na rede de sua empresa alguém tem que preparar isso, dirigindo o tráfego que entra direcionado a porta do banco de dados para o endereço do servidor. Não depende de seu micro
-
Como saber se um PC irá conseguir se conectar com Wi-Fi Wireless?
arfneto respondeu ao tópico de EnzoMarinho em Redes e Internet
Porque não comprar uma placa de rede wifi e colocar dentro dele? -
[off-topic] Olá Não seria mais útil se a classe fosse static de todo modo? Não parece ter razão para declarar uma instância da classe só para fazer sempre o mesmo cálculo. E mais de 120 linhas e 5 métodos para calcular isso talvez seja muito
-
Ethernet parando de funcionar todos os dias
arfneto respondeu ao tópico de Leandroazc em Redes e Internet
Que significa "tira o IP?" Seu problema não é a duração da concessão do endereço. Lease Time é o nome disso. Não há diferença entre fixar o endereço IP via cabo ou wifi. Depois que o PC está na rede ethernet, seja via cabo ou wifi, do ldo do TCP o proceso é idêntico. Esses endereços 169.254.xxx.yyy indicam apenas que seu servidor DHCP não respondeu em tempo. Em geral 1 minuto. E assim sua placa de rede não teve endereço atribuído. Se o problema foi só so serviço DHCP você pode testar apenas colocando um endereço fixo para sua placa de rede. Antes verifique no modem o endereço LAN dele, que deve ser o seu endereço de gateway lá no IPCONFIG /ALL. Em redes domésticas é sempre assim. E a faixa de endereços que está usando para o serviço DHCP. Pode ter digitado algo por engano e deixado apenas 1 endereço disponível já vi acontecer. Use algo tipo de 192.168.0.20 a 192.168.0.254 e aí saberá que pode usar todos os outros para micros com endereço fixo, os de .2 a .19. E fixe o gateway para o endereço do roteador. -
Compartilhamento de internet wifi -> notebook -> cabo -> pc
arfneto respondeu ao tópico de Soraa em Redes e Internet
As placas de rede não tem essa noção de internet. Apenas tráfego de pacotes. A resposta simples é que não tem como fazer isso em Windows. A performance dessa rede como está usando vai depender da capacidade de seu notebook e da placa de rede dele. E do sistema que ele roda. Espero que seja uma versão recente de Windows, porque a performance de rede melhorou muito. No entanto o laptop vai estar rodando um software de compartilhamento e um troço chamado NAT e processando todo o tráfego que vai para a próxima rede, onde só terá o PC. E o PC claro só vai ter acesso a rede e portanto a internet se o notebook estiver ligado. Não pode simplesmente ligar esse cabo do PC no modem? E mais ainda, ligar outro cabo do notebook até o modem? Tudo vai rodar mais rápido. -
eu postei isso meses atras, como parte de um exemplo. Deve dar para pesquisar aqui direto no conteúdo do forum adicionado 0 minutos depois Seu código parece muito complicado Não precisa adicionado 12 minutos depois De uma olhada nesse, que faz a conta certa #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "string.h" int main(int artgc, char** argv) { int valor1, valor2, valor3, valor4; // os numeros char d1, d2, d3; // os delimitadores int n; int soma, i; // para calculo dos DV 123.456.789-09 OK printf("Entre com o CPF no formato 012.345.678-90 e Tecle ENTER ao terminar\n"); printf("\nCPF: "); n = scanf( "%3d%c%3d%c%3d%c%2d", &valor1, &d1, &valor2, &d2, &valor3, &d3, &valor4 ); // o que leu? printf("\nscanf() leu %d itens\n", n); // os valores printf("scanf() valor1 = %03d\n", valor1); printf("scanf() valor2 = %03d\n", valor2); printf("scanf() valor3 = %03d\n", valor3); printf("scanf() valor4 = %02d\n", valor4); // os delimitadores printf("scanf() delimitador 1 = [%c]\n", d1); printf("scanf() delimitador 2 = [%c]\n", d2); printf("scanf() delimitador 3 = [%c]\n", d3); // mostra os valores afinal printf("\nCPF lido %03d.%03d.%03d-%02d\n", valor1, valor2, valor3, valor4); // aqui vão os digitos 1 a 1 para calcular os DV int digito[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; digito[0] = valor1 / 100; digito[1] = (valor1 % 100) / 10; digito[2] = valor1 % 10; digito[3] = valor2 / 100; digito[4] = (valor2 % 100) / 10; digito[5] = valor2 % 10; digito[6] = valor3 / 100; digito[7] = (valor3 % 100) / 10; digito[8] = valor3 % 10; digito[ 9] = valor4 / 10; digito[10] = valor4 % 10; printf("Digito a Digito: "); for (i = 0; i < 11; i = i + 1) { printf("%d ", digito[i]); } printf("\n"); /////////////////////////////////////////////////////////// DV 1 // o primeiro digito verificador, modulo 11 dos 9 soma = 0; for (i = 0; i < 9; i = i + 1) soma = soma + digito[i] * (10-i); // 10..2 // essa e a conta que da nome ao processo soma = soma % 11; if (soma > 1) digito[9] = 11 - soma; else digito[9] = 0; /////////////////////////////////////////////////////////// DV 2 // o segundo DV, modulo 11 dos 10 soma = 0; for (i = 0; i < 10; i = i + 1) soma = soma + digito[i] * (11 - i); // 11..2 // essa e a conta que da nome ao processo soma = soma % 11; if (soma > 1) digito[10] = 11 - soma; else digito[10] = 0; printf("\nDV calculados: %d %d\n", digito[9], digito[10]); // compara os digitos int dv1ok = digito[9] == (valor4 / 10); int dv2ok = digito[10] == (valor4 % 10); if (dv1ok && dv2ok) { printf("CPF valido\n"); } else { if (!dv1ok) printf("DV1 'devia ser %d. Lido %d\n", digito[9], (valor4 / 10)); if (!dv2ok) printf("DV2 'devia ser %d. Lido %d\n", digito[10], (valor4 % 10)); printf("CPF INVALIDO\n"); }; // if } // main Isso era um exemplo para o uso de scanf() não para calcular os DV. Então tem muitos comentários e muitos passos a mais... Mas calcula os dois DV adicionado 32 minutos depois int cpf_dv(const char* numero) { // aqui vão os digitos 1 a 1 para calcular os DV int digito[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int soma = 0; int i = 0; for (i = 0; i < 9; i += 1) digito[i] = numero[i] - '0'; // o primeiro digito verificador, modulo 11 dos 9 soma = 0; for (i = 0; i < 9; i = i + 1) soma = soma + digito[i] * (10 - i); // 10..2 // essa e a conta que da nome ao processo soma = soma % 11; if (soma > 1) digito[9] = 11 - soma; else digito[9] = 0; // o segundo DV, modulo 11 dos 10 soma = 0; for (i = 0; i < 10; i = i + 1) soma = soma + digito[i] * (11 - i); // 11..2 // essa e a conta que da nome ao processo soma = soma % 11; if (soma > 1) digito[10] = 11 - soma; else digito[10] = 0; //printf("\nDV calculados: %d %d\n", digito[9], digito[10]); return digito[9] * 10 + digito[10]; }; Essa função é aquele código, sem o lance de scanf(): você passa o valor ela retorna o dígito. Nada mais.
-
Olá! Seu programa não está bom ainda O maior problema: está usando uma máscara %s para ler o que imagina ser um único char... char menu; scanf("%s", &menu); %s é a especificação para ler uma string e pode ler mais de um char e vai acabar cancelando seu programa mesmo se entrar com 'S' na primeira vez porque vai corromper a memória ao estourar a capacidade do char menu... Sobre scanf() é uma rotina difícil para essas coisas de ler dados do teclado Ela foi escrita para ler entrada formatada. Scan Formatted Input é a origem do nome. Instrua o usuário sobre os formatos de entrada. O formato dos campos. Código é numérico, quantos dígitos? Preço é float, O título pode ter espaços, Não use acentos. Coisas assim. Como o cara que está digitando vai adivinhar como vai escrever? Repita os campos que já leu, para ajudar quem está digitando e ajudar você mesmo a testar isso. scanf() retorna um valor. Use. É melhor para você. Não entendo porque ninguém ensina isso. Não vejo um único programa aqui usando isso. Leia o que tiver sobrado entre cada leitura via scanf() usando uma máscara de acordo ou um loop com getchar() até achar um '\n' o tal newline. Não teste seu programa com dados de entrada. Não é espero. Demora um eternidade. Qual a necessidade de, tendo um computador rodando seu programa, ficar parado em frente ao teclado para digitar dados? Se você sabe usar funções porque escreveu só uma onde sequer precisava? Perde muito tempo... Veja esse trecho por exemplo: struct livro { char titulo[30]; char autor[30]; char genero[30]; int codigo; double preco; }; typedef struct livro Livro; int inclui_livro(Livro l, Livro col[]); int lista_livros(Livro col[], int total); int busca_autor(char aut[], Livro col[], int total); int busca_titulo(char tit[], Livro col[], int total); float calcula_media(Livro col[], int total); int mostra_titulos(Livro col[], int total); Se você declarar assim não precisa ler nada para testar o programa. Isso é muito importante. Muito tempo se perde. Em geral não se usa nomes de variáveis em protótipos. Coloquei algo só para te ajudar a entender. A diferença aqui é que não precisa do menu para testar o programa. Menus e scanf() são um atraso enorme. Coloque isso depois. typedef é só uma maneira de não ter que ficar repetindo struct livro toda hora porque é muito chato. E usar a primeira letra em maiúscula é só um costume meu. Você sabe usar ponteiros? Exemplo Só para você ver uma outra maneira: eu começaria o programa por esse aqui que já mostra isso na primeira execução: Titulo Livro 1234 000 Autor Autor ABC 000 Codigo 41 Preco 17.34 Titulo Livro 1234 001 Autor Autor ABC 001 Codigo 6500 Preco 119.24 Titulo Livro 1234 002 Autor Autor ABC 002 Codigo 1478 Preco 108.62 Titulo Livro 1234 003 Autor Autor ABC 003 Codigo 4464 Preco 5.45 Titulo Livro 1234 004 Autor Autor ABC 004 Codigo 3281 Preco 27.61 Titulo Livro 1234 005 Autor Autor ABC 005 Codigo 491 Preco 145.42 Esse programa #define _CRT_SECURE_NO_WARNINGS #include <locale.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> struct livro { char titulo[30]; char autor[30]; char genero[30]; int codigo; double preco; }; typedef struct livro Livro; //int inclui_livro(Livro); //int lista_livros(Livro col[], int total); //int busca_autor(char aut[], Livro col[], int total); //int busca_titulo(char tit[], Livro col[], int total); //float calcula_media(Livro col[], int total); Livro fabrica(); int mostra_titulo(Livro); int main() { for( int i = 0; i<6; i+=1) mostra_titulo(fabrica()); return 0; }; // main() // a cada vez retorna um livro, arrumadinho para testar Livro fabrica() { static int n = 0; Livro l; sprintf(l.titulo, "Livro 1234 %03d", n); sprintf(l.autor, "Autor ABC %03d", n); sprintf(l.genero, "Genero DEF %03d", n); l.codigo = rand() % 10000; l.preco = (double)(rand() % 150) + (rand() % 100 / 100.0); n = n + 1; return l; }; // fabrica() // mostra as informações referentes a um titulo int mostra_titulo(Livro l) { printf("\n"); printf("%10s %-20s\n", "Titulo", l.titulo); printf("%10s %-20s\n", "Autor", l.autor); printf("%10s %6d\n", "Codigo", l.codigo); printf("%10s %6.2f\n", "Preco", l.preco); return 0; } Em 10 minutos você começa a testar. Sem ler do teclado porque só atrasa. Sobre a leitura tem vários tópicos recentes aqui sobre como usar --- ou não usar --- scanf(). Alguns eu escrevi, outros não. Não vou repetir tudo agora. Você pode pesquisar direto no forum por essas coisas. Depois você escreve as rotinas que estão em comentário lá em cima Depois você coloca o menu. Postei um programa completo com menu para um tópico sobre uma playlist na semana passada. Pode servir como exemplo. Com as funções e o menu você termina os testes, apaga a função fábrica() e entrega o trabalho. Ou recebe o cheque. Escreva de novo com a evolução de seu programa
-
Está errado. Se não tirou aquilo tire. Esta comparando o endereço da variável com 3 e não a variável...
-
if (jog1 >= 1 && jog1 <= 3 && jog2 >= 1 && &jog2 <= 3) { tem um & a mais no final...
-
C++ passar um vetor como parâmetro pra minha thread
arfneto respondeu ao tópico de Korean Sabino em C/C#/C++
Isso não está claro? (1) o argumento está errado (2) não precisa do & (3) int** não é int[][] (4) nLinha e nColuna tem que ser constantes. Onde está obscuro isso? E isso lado a lado? Não deu pra ver que o argumento fornecido não corresponde à declaração? Por outro lado, fiquei curioso com sua intenção nesse programa. Declarar um único thread e chamar join() em seguida quer dizer o seguinte: seu programa vai parar. E a execução do thread continua. E aí quando ele acabar seu programa continua. Isso é join(). Então não vai fazer nada exceto transferir a execução para a função matriz() e depois continuar em seu programa. Será que você não pretendia usar start()? Acho que você quer algo bem prontinho né? Esse resultado Linhas: 2 Colunas: 5 Matriz em main() 0 1 2 3 4 5 6 7 8 9 Hello from Matriz[2x5] 0 1 2 3 4 5 6 7 8 9 Corresponde ao programa abaixo. Essa é a maneira comum de passar isso #include <iomanip> #include <iostream> #include <stdio.h> #include <thread> using namespace std; void Matriz(int*,unsigned const, unsigned const); int main() { int nLinha = 2; int nColuna = 4; std::cout << "Linhas: "; std::cin >> nLinha; std::cout << "Colunas: "; std::cin >> nColuna; int* a = new int[nLinha * nColuna * sizeof(int)]; // colocando valores conhecidos na matriz int ix = 0; for (auto i = 0; i < nLinha; i += 1) { for (auto j = 0; j < nColuna; j += 1) { ix = i * nColuna + j; *(a + ix) = ix; }; // for }; // for // mostra aqui cout << "\nMatriz em main()" << endl; for (auto i = 0; i < nLinha; i += 1) { for (auto j = 0; j < nColuna; j += 1) { cout << setw(4) << *(a+ i*nColuna + j) << " "; }; // for cout << endl; }; // for std::thread pri(Matriz, a, nLinha, nColuna); pri.join(); delete [] a; } void Matriz(int* m, unsigned const l, unsigned const c) { cout << "\nHello from Matriz[" << l << "x" << c << "]" << endl; // mostra la for (auto i = 0; i < l; i += 1) { for (auto j = 0; j < c; j += 1) { cout << setw(4) << *(m + i * c + j) << " "; }; // for cout << endl; }; // for return; } Veja se ficou mais claro agora e volte a escrever com a versão atual de seu código. -
Como usar D-Link DIR615 como repetidor numa segunda rede wifi
arfneto respondeu ao tópico de PedraX em Redes e Internet
Isso nada tem a ver com DHCP. Você pode ter isso ativo até nos 3 mas como sequer tem a senha do primeiro sugiro nem tentar. Isso é útil em casos mais específicos e é preciso ter planejamento, necessidade e experiência com isso. Apenas deixe o DHCP ativo no modem da net. Para medir o sinal basta o sinal do telefone. Ou pode usar um aplicativo como o wifi analyzer para o android. É bem simples e informativo. Ou o OpenSignal, para Android. Não uso iPhone então não sei opinar sobre esses. Na sua configuração não estará usando os roteadores DIR615 como tal. Apenas o switch de 4 portas e o ponto de acesso wifi embutido em cada um deles. Um dispositivo ao se conectar ao wifi por um deles entra na rede ethernet. Ao entrar na rede ethernet ele vai procurar um endereço IP. O modem da net dá esse endereço e o endereço de gateway para acessar a internet e a vida segue. Todas as outras funções de controle da rede IP serão executadas pelo modem da NET. É o simples. -
Como usar D-Link DIR615 como repetidor numa segunda rede wifi
arfneto respondeu ao tópico de PedraX em Redes e Internet
Como te expliquei, o aparelho que estava em 192.168.0.1 você só não conseguiu configurar antes porque o endereço de fábrica dele é o do modem da NET e você não pensou em desligar o modem da NET antes de fazer isso, o que teria sido uma boa ideia. Eu disse para usar .252 e .253 por uma razão, mas está bem como fez. E agora pode mudar a qualquer momento. (1) Qualquer antena interfere com outra. Mas não deve ser problema. Ajudar não vai. Eu talvez deva deixar de perguntar, já que você nunca respondeu, mas vou só recomendar mais uma vez: se puder ligue os dois roteadores via cabo diretamente ao modem da NET. (2) Se o modem da NET estiver por exemplo em um gabinete metálico e o sinal estiver fraco, apenas desligue as antenas dele e use o outro. Ligue um de cada vez e compare o sinal. Use apenas o que tiver sinal mais forte e/ou cobertura mais ampla. (3) repetidor é uma última hipótese: um repetidor lá onde o sinal começa a ficar fraco vai repetir o sinal fraco e em geral a performance é ruim. Use um cabo. Até 100m do roteador principal ou mesmo do secundário. -
C++ Como fazer programas GUI com interface profissional em C++?
arfneto respondeu ao tópico de sandrofabres em C/C#/C++
Olá "Programas gráficos" como você descreve são aplicações para desktop e não programas gráficos no âmbito geral. Fosse esse o caso e eu diria que programas gráficos extraordinários vem sendo --- e vão continuar sendo por um tempo ao que parece --- escritos em C++ . E apenas em C++. São os games para desktop. Games para Android também recorrem a C++ quando a performance é crítica. E as aplicações Desktop? Há muito a Microsoft deixou de estimular o desenvolvimento dessas coisas em C++, e um "profissional do C++" hoje dificilmente tem trabalho nessa área e então a resposta deles deve ser: "para meu uso eu usaria" tal mecanismo, dependendo da vontade e da experiência de cada um, e aí estariamos no campo praticamente religioso. Há muitas possibilidades, além da óbvia API do Windows. As escolhas mais comuns seriam a julgar pelo que se vê, GTK+, Qt e WxWidgets, em ordem alfabética. No mundo corporativo a maior possibilidade seria Qt. Não precisa de régua nem cálculos e tal. Mas é uma plataforma imensa e complexa. No entanto é privada, tem licenças, suporte, dono e alguém para processar. O mundo corporativo busca essas coisas ao invés de open-source muitas vezes, por política corporativa mesmo: Qt tem um lado open source mas um profissional dificilmente usaria nessa modalidade. Uma licença anual para um único desenvolvedor custa em torno de 5.500 dólares e é um valor razoável para esse tipo de produto. Por outro lado, se usar open source você não tem direito às ferramentas mais legais. E se vender o produto tem que incluir uma série de coisas, entre elas o código fonte... Isso é open source afinal. Diga isso ao seu diretor e já era. Um exemplo importante sobre esse produtos e C++: todo ano acontece a CPPCON, a conferência mais importante de C++ do mundo. E todo ano alguém apresenta algo sobre Qt. Há um mercado grande no entanto em interfaces para dispositivos, tipo GPS, avionics, barcos, carros --- centrais multimídia são um grande mercado para o Qt --- e instrumentos de medicina, no entanto. Tem trabalho para quem conhece Qt e software embarcado. E porque não tem um "Designer visual"no Visual Studio? Isso é assunto para uma conversa de bar, depois de uma certa quantia de álcool. E no vale do silício. Não trabalho para a Microsoft, mas o que já ouvi do pessoal de lá, ao vivo, em blogs, em conferências e tal, é que não há mercado para isso. Nunca um grande cliente pediu isso. E a Microsoft atende os grandes clientes Eis as prováveis razões, algumas das quais ouvi deles também: A API está sempre disponível para quem precisa, em C ou C++ é um passeio porque afinal a própria API foi escrita basicamente em C. C++ é uma linguagem enorme e complexa, com uma curva de aprendizado íngreme. Uma p%a ladeira diriam alguns. Templates, construtores, destrutores, lambdas, overload isso override aquilo, o di$%o. Isso afasta o tipo de desenvolvedor que escreve interfaces para desktop. Eles diriam algo como você disse Por outro lado, se você tentar passar essa sua classificação para um desses "profissionais de C++" ou de C eles vão olhar bem para você e talvez digam algo obsceno antes de ir andando. Os controles do Windows ficam aqui nesses dois arquivos basicamente Até onde eu sei foram escritos em C e existem desde os anos 90. Outro ponto é que hoje em dia nas grandes empresas as interfaces são escritas por outras equipes. Tem os artistas, designers, publicitários, os caras de branding, até os advogados. Então muitas vezes o programador já recebe a especificação pronta. O tal modelo MVC. Sabe o que é XAML? Já tem mais de 10 anos e é uma maneira de descrever UI usando... XML. Texto. Esse é o caminho sugerido. E seguido por muitos. Nas empresas pequenas não se desenvolve nada há tempos. O fato é que esses outros profissionais, designers por exemplo, não tem em geral formação para compreender os mecanismos de C++ e estarão bem melhor com .Net e VB ou C#. Coisas mais simles e visuais com drag & drop e aquele botãozinho align que alinha os componentes pelo fundo, pelo topo, pelos lados, super fofo. Ou java e algo como o Scene Builder. Mesmo o Delphi ou o C++ Builder da Embarcadero com o form Designer e a biblioteca VCL (que são esse mesmos controles eu acho) já seriam muito. Forçados a isso eles talvez pudessem também E tentariam talvez um retiro espiritual Aplicações gráficas para desktop usam umas poucas classes e propriedades. Uns poucos eventos, uns parâmetros de posição, uns aceleradores de teclado, uma sequência de posições --- tab order -- e nada mais. Os form designers são bem parecidos. Não tenho tempo agora de juntar muitos mas é a mesma coisa. Veja as imagens abaixo. Qt Creator GluON Scene Builder (java) .Net no Visual Studio E a tal performance? Pois é: em interfaces de usuário isso não tem a menor importância. O usuário está arrastando botões com um mouse, apertando teclas, coisas absolutamente lerdas. Em geral se deixa uma thread monitorando isso e ela tem pouco trabalho enquanto outras cuidam do resto da aplicação. O tal MVC. Quando o tempo de resposta é importante, como no caso de novo dos games, aí se usa C++ mas não se usa esse tipo de controle. Até poderia por diversão. Arrastar um botão na tela usando DirectX a 250 quadros por segundo usando sua placa gráfica de 20 bilhões de transistors e mais de 100 teraflops seria claro possível. Entende onde eu quero chegar? É outro mundo. Se você precisa responder a um request em milésimos de segundo, como em aplicações de trading por exemplo, não há dúvida que vai usar C++. Se você não souber contrata alguém que sabe. Vale a pena. E o futuro disso? Hoje essas interfaces estão sumindo e os desenvolvedores tem que fazer o outro caminho. A computação está voltando ao que era no final dos anos 80. Os servidores e serviços estão se mudando numa velocidade absurda para serviços como Microsoft Azure, Google Cloud e o AWS da Amazon. E os serviços estão indo para plataformas serverless como amazon lambda e coisas como http://www.pubnub.com. E a interface com essas plataformas é via console para administração --- de onde se justifica o enorme investimento nessas áreas nos últimos anos --- e via um servidor web para produção. Então desenvolvedores estão sendo contratados para trocar essas interfaces locais de programas por interfaces web. -
se quer ler um ENTER ou ler e desprezar tudo que tem até um enter o comum é usa um loop como essa função void flush() { int ch = 0; do { ch = getc(stdin); } while ((ch != '\n') && (ch != EOF)); }; // flush()
-
Repetidor wifi com roteador via cabo pegando o ip do roteador principal
arfneto respondeu ao tópico de Lauro Cesar em Redes e Internet
Não pode colocar os dois aparelhos na mesa do seu computador e resolver tudo de uma vez? Tem muitas maneiras de fazer isso mas essa é a mais simples. Um cabo de rede curtinho. Põe os dois na mesa liga um por vez, acerta a configuração e depois leva pro local definitivo. Repito: tem muitas maneiras de fazer isso e depende muito de sua experiência e necessidade. Pensando apenas na maneira mais simples de conectar e estender a rede vou te explicar de novo a mesma. Seu desenho está bom. Mas não respondeu a minha pergunta: pode ou não pode ligar os dois dir-615 direto ao modem via cabo? Seria muito conveniente. De volta aos DIR-615 Espero que tenha colocado algo para identificar os dois, tipo uma etiqueta colorida. Do manual do aparelho Isso quer dizer que de fábrica ele vem configurado para o mesmo endereço de rede que o modem da NET está usando, o mais comum de todos. Eis uma maneira simples de conectar os 3 sem stress: Antes de tudo: desligue o cabo do modem da NET. Você já sabe o mínimo necessário sobre ele e vamos ficar com o mínimo, já que você não tem a senha. Roteador A em 192.168.100.1 Ligue o roteador B via cabo ao seu micro. Ele deve te dar um endereço qualquer na rede 192.168.100.0. Se não der é porque você desativou o DHCP nele. Nesse caso configure sua placa de rede para endereç IP fixo e use 192.168.100.10 por exemplo e conecte. Abra a configuração dele e mude o endereço dele --- LAN --- para 192.168.0.252 por exemplo. E confirme. Ele vai reiniciar e você deve perder a conexão com ele porque mudou o endereço. Desconecte o cabo de rede por alguns segundos e ligue de novo: vai receber um endereço nessa rede dessa vez. Volte na configuração do roteador e desabilite o servidor DHCP. Salve. Se foi preciso reconfigurar sua placa de rede volte tudo ao automatico. Desligue esse roteador que já está ok. Roteador B em endereço desconhecido Ligue o roteador ao seu micro e veja se recebeu um endereço. Se recebeu esse é o endereço que deverá acessar para programr o cara. Como o endereço de fábrica dele é o mesmo do modem da NET talvez seja só por isso que não conseguia acessar. Se não conseguiu volte ele para a configuração de fábrica e ligue de novo ao micro Vai encontrar o roteador em 192.168.0.1 ou no endereço do gateway que recebeu ao se conectar. Abra a configuração dele e mude o endereço LAN dele para 192.168.0.253. Salve. Se perdeu a conexão faça a mesma coisa de antes: desligue e religue o cabo de rede. Vai receber um endereço novo. Abra a configuração do roteador e desabilite o servidor DHCP. Ligue os dois roteadores ao modem da NET ou ligue um por um se não puder ligar os dois ao mesmo tempo. Roteador A 192.168.0.252 Roteador B 192.168.0.253 Modem da Net 192.168.0.1 Então estão todos na mesma rede e poderá acessar de seus micros pelo navegador a qualquer momento. A partir daí configure o wifi em cada um deles. Eu não costumo usar a mesma rede e senha porque quando se faz isso fica difícil pra ***** identificar problemas. E de todo modo os aparelhos memorizam as senhas mesmo. E ao mudar de antena com um aparelho em transito geralmente as conexões caem, mesmo que as redes tenham o mesmo nome... Mas faça como preferir. A escolha dos endereços foi arbitrária, já que você não tem a senha do modem. É só isso. -
Como usar D-Link DIR615 como repetidor numa segunda rede wifi
arfneto respondeu ao tópico de PedraX em Redes e Internet
Sim. Com ou sem DHCP. -
Repetidor wifi com roteador via cabo pegando o ip do roteador principal
arfneto respondeu ao tópico de Lauro Cesar em Redes e Internet
É normal. A senha do modem não está na etiqueta no fundo dele? Seria bem bom ter essa senha. MAs pode fazer sem isso. Abra um outro tópico e me avise . Estas conversas estão misturadas, 2 ou 3 do passado e essas de agora. Muito chato de acompanhar. Seria muito conveniente você ligar os dois roteadores via cabo ao modem da NET direto. Eles não tem performance para ficar assim em série. Qual a rede do modem da net? a que está em uso. Isso aparece em qualquer micro rodando ipconfig/all
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais