Ir ao conteúdo
  • Cadastre-se

arfneto

Membro Pleno
  • Posts

    6.252
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. @Kayorius Sem outros equipamentos acho que o melhor que pode fazer é limitar a 100mbps as conexões via cabo. Ou mesmo a 10 se achar um switch dos anos 90 que opere a 10 mbps.
  2. @wisekush ligue direto um computador ao outro e veja a velocidade. Veja se consegue um segundo cabo. Teste os mesmos computadores com os mesmos cabos. Alterne depois as portas do roteador. Anote tudo. Seja metódico (paranóico:) e logo vai isolar o problema.
  3. Esses comandos nada tem a ver com a conexão de rede e são n geral uma perda de tempo. Sua conexão de rede nada tem a ver com a internet. Seu computador nem está conectado com a internet. O que acontece é que existe a noção de gateway padrão e assim seu roteador, que é o gateway padrão da sua rede, recebe pacotes destinados a outras redes e encaminha. E mantem uma tabela com os endereços internos de quem enviou o que, e quando vem as respostas ele devolve para o endereço certo. Tem outros computadores na rede? Pode trocar os cabos? Pode usar o mesmo cabo e conectar direto com outro computador ai? Precisa isolar o problema, e seja o que for está na rede local. Nada tem a ver com a internet.
  4. Speed e duplex são negociados no momento da conexão. Esse parâmetro não existe para você digitar os valores que acha certos. Estão lá disponíveis para casos em que se precisa fixar MENOS que o que seria normalmente negociado pelo driver. Não precisa de cabos CAT6 para essas velocidades. Fica difícil imaginar que comandos digitou. Talvez você pudesse dizer. A que velocidade está conectando?
  5. Ainda no tópico #3 te disse que não pode escrever assim. Esse valor tam deve ser conhecido em tempo de compilação. Não pode ser um valor lido na hora em que o programa está rodando porque o compilador precisa reservar essa área ao gerar o código. Se precisa criar na hora deve alocar a memória necessária usando malloc() de stdlib.h. Existe uma extensão para C que admite isso, um troço chamado VLA, mas nunca foi adiante e não irá agora, depois de 50 anos. // 200, fixo Empresa cadastro[200]; // variavel, tam Empresa* cad = malloc(tam* sizeof(Empresa)); Assim é. Da minha lista de problemas comuns: não use comentários com acentos. Podem não sair na tela em algumas maquinas ou pode sair tudo errado na tela ou na eventual impressão. evite comentários óbvios como // FUNCAO P/ LIMPAR A TELA void limpar() { printf("\n\n\n"); system("clear"); printf("\n\n\n"); } Ainda sobre essa função, qual o propósito de escrever 3 linhas em branco, que ninguém vai ver, e depois limpar a tela? Veja esse comentário em seu programa: // INICIO DA MAIN int main(void) Acha que acrescentou algo dizer que ali é o ínicio da função? Sobre system: é apenas uma função que pega uma string, um texto, e tenta rodar usando o interpretador de comandos do sistema. É proibida em toda parte, escolas e empresas. Como te disse, não vai aprender nada com isso. E system foi escrita em C. O sistema foi escrito em C. E deve imaginar que tem uma função para limpar a tela, em C, para o seu sistema operacional. Sobre pause: é uma coisa simples: você roda um programa para fazer algo e terminar. Não para fazer algo e ficar esperando um infeliz ficar em frente a tela para teclar ENTER depois que o programa fizer o que se espera que ele faça. EXEMPLO: Você escreveu o programa soma.exe para rodar no windows. Você usa assim: C:\Clube do Hardware>soma 42 17 42 + 17 = 59 C:\Clube do Hardware>soma 1700 4200 1700 + 4200 = 5900 E está ok. Mas se você fizer como "recomendado" e usar um pause imagine o que vai acontecer: C:]Clube do Hardware>soma 3 4 3 + 4 = 7 Press any key to continue . . . C:\Clube do Hardware>soma 5 6 5 + 6 = 11 Press any key to continue . . . E você tem que digitar um ENTER. Ou chamar alguém pra ficar lá esperando. Mas imagine que você tenha uma lista de programas soma 2 3 soma 17 42 soma 2300 1 soma 0 0 Então você poderia por num arquivo e rodar todos de uma vez e esperar pelo resultado... basta digitar por exemplo . soma 2 3 & soma 17 42 & soma 2300 1 & soma 0 0 SEM o infeliz PAUSE: O sistema sabe que é pra rodar os programas um depois do outro e pronto C:\Clube do Hardware>soma 2 3 & soma 17 42 & soma 2300 1 & soma 0 0 2 + 3 = 5 17 + 42 = 59 2300 + 1 = 2301 0 + 0 = 0 Mas se fizer o recomendado.... C:\Clube do Hardware>soma 2 3 & soma 3 4 2 + 3 = 5 Press any key to continue . . . Genial., Tem que teclar ENTER para rodar a próxima soma. Tem que ter alguém lá em frente ao teclado. Tosco. Não se escrevem programas para isso. Sobre void: Retornar void é ingênuo. Veja sua função void cadastrarEmpresa(int tam, Empresa cadastro[])... O que se quer aqui? Simples: inserir uma empresa em um cadastro. Só que não é o que está escrito. Considere a alternativa int cadastrar(Empresa emp, Cadastro cad) { return 0; }; Você quer cadastrar uma empresa em um cadastro de empresas. Então você passa pra função uma empresa e um cadastro. E a função faz o serviço dela. Retorna 0 se deu certo, retorna -1, -2 ou qualquer coisa negativa para o caso de erro. Não acha mais esperto? Novidade não é. Sempre é feito assim. Sobre ler dados do teclado Entenda que seu programa tem um monte de funções e tem um monte de coisas pra testar. Não é nada esperto ficar digitando coisas a cada teste. Sua empresa tem 6 campos. Um deles é o endereço e pode ter mais de um por empresa. Se for testar o programa com 3 empresas vai ter que digitar 18 campos. Só que endereco tem 6 campos também. Se usar 2 enderecos por empresa para 5 empresas imagina quanto tempo vai demorar cada simples teste que for fazer? E você está aprendendo então é boa a chance do programa cancelar na sua cara logo depois de ficar 5 minutos inventando dados. sobre "NULL" NULL é um texto, um valor objetivo. NULL é o que se usa quando não tem nada no campo. Se você escrever Empresa cadastro[20] = {0}; por exemplo, o sistema vai colocar esse valor em cada lugar do vetor inteiro. Sobre constantes e inicialização typedef struct { char pais[80]; char estado[80]; char municipio[80]; char logradouro[80]; int numero; int cep; } Endereco; Pois é. Então pode usar Endereco teste = { .cep = 222, .estado = "SP", .logradouro = "Av. Antiga", .municipio = "Vila Nova", .numero = 42, .pais = "Terra Nova"}; E colocar valores na estrutura toda. Sobre um menu Imagine essa função: int menu1(); Ela mostra um menu e retorna o valor da opção que o cara escolheu. Não é conveniente???? Sobre fflush fflush só está definido para saída. Não está no padrão fflush da entrada como está fazendo. Isso não existe exceto em um ou outro compilador e não é certo que vá funcionar. Sobre o uso de arquivos Em C é trivial criar arquivos. Essa linguagem foi criada para ajudar a escrever um sistema, o Unix, que virou Linux, MacOS, Android e outros nessas décadas todas. No Unix tudo é arquivo então dá pra imaginar que é fácil usar arquivos em C. EXEMPLO int cria_arquivo(const char* nome, const char* texto) { FILE* arq = fopen(nome, "w"); if (arq == NULL) return -1; fprintf(arq, "arquivo: \"%s\"\n", nome); for (int i = 0; i < 5; i += 1) fprintf(arq,"%06d \"%20s\"\n", 1 + i, texto); fclose(arq); return 0; } Essa função trivial chamada assim cria_arquivo("teste.txt", "valor"); cria o arquivo teste.txt com isso dentro arquivo: "teste.txt" 000001 " valor" 000002 " valor" 000003 " valor" 000004 " valor" 000005 " valor" Nada mais Sobre o código postado Pouco corrigiu dos problemas que apontei. Uso incorreto de scanf, printf, fflush e tal. Sugiro ir refinando o programa conforme aprende. typedef struct { char pais[80]; char estado[80]; char municipio[80]; char logradouro[80]; int numero; int cep; } Endereco; typedef struct { int id; char nome[80]; char cnpj[80]; char proprietario[80]; int funcionarios; int qtd_endereco; Endereco endereco; } Empresa; Criou um campo qtd_endereco mas só tem lugar pra 1. Que diferença faz? E os outros? Pra que 80 bytes num cnpj? Porque cep é int? vai somar? Porque estado tem 80? Seu compilador não reclamou pelo tamanho da pilha porque declarou errado o vetor. A noção de container Todos esses programas de iniciantes giram em torno da noção de container, coleção, algum tipo de cadastro. Se usar isso desde o início sua vida vai ficar muito mais simples Escreva em torno dos dados Cade o cadastro? Porque não tem essa estrutura em seu programa? Acha que basta um vetor?? Não basta. Só dá muito mais trabalho se ficar só com o vetorzinho. Considere uma alternativa bobinha: typedef struct { unsigned tam; // tamanho unsigned lim; // limite Empresa emp[20]; } Cadastro; Não fica claro que o limite é 20 e que se colocar tam = 0 a estrutura fica marcada como vazia? Não é mais simples? E a mesma coisa não serviria para os endereços, já que seria um outro container, a mesma coisa? Algo assim não ajudaria: typedef struct { unsigned tam; // tamanho unsigned lim; // limite Endereco end[5]; } Enderecos; Sim, a mesma coisa. Como usar? Trivial: basta colocar isso em cada empresa typedef struct { int id; char nome[80]; char cnpj[15]; char proprietario[80]; int funcionarios; Enderecos end; } Empresa; E claro que não precisa mais da quantidade de endereços em Empresa porque a estrutura já tem seu contador DENTRO. Veja como pode ser simples: int limpar_cadastro(Cadastro* cad,unsigned tam) { if ( cad == NULL ) return -1; cad->lim = tam; cad->tam = 0; // vazio return 0; } O que importa é começar logo a testar o programa. Precisa de uma empresa? Um cadastro? Um endereco? Use C, use o computador. int cadastra(Empresa emp, Cadastro* cad) { if (cad == NULL) return -1; if (cad->tam >= cad->lim) return -2; // não cabe cad->emp[cad->tam] = emp; // copia a empresa cad->tam += 1; // conta essa return 0; } cadastrar uma empresa pode ser só isso. Se voltou zero está ok. Veja a saida de um exemplo Cadastro tem 4 [de 20] empresas Amazonia (CNPJ:123.456.78-45) Amazon (CNPJ:123.456.78-03) Google (CNPJ:123.456.78-02) Microsoft (CNPJ:123.456.78-04) Só digitando os dados. Sem entrada, sem pausa, sem esperar. Em 5 minutos estamos testando e já rodou da primeira vez #include <stdio.h> #include <stdlib.h> typedef struct { char pais[80]; char estado[3]; char municipio[80]; char logradouro[80]; int numero; char cep[10]; // 01234-012 } Endereco; typedef struct { unsigned tam; // tamanho unsigned lim; // limite Endereco end[5]; } Enderecos; typedef struct { int id; char nome[80]; char cnpj[15]; char proprietario[80]; int funcionarios; Enderecos end; } Empresa; typedef struct { unsigned tam; // tamanho unsigned lim; // limite Empresa emp[20]; // max 20 } Cadastro; int limpar_cadastro(Cadastro*); int cadastra(Empresa, Cadastro*); int lista(Cadastro*); int cria_arquivo(const char*, const char*); int main(void) { Endereco teste = { .cep = "123450678", .estado = "TN", .logradouro = "Rua Antiga", .municipio = "Vila Nova", .numero = 42, .pais = "Terra Nova"}; Empresa emp_1 = { .cnpj = "123.456.78-45", .nome = "Amazonia"}; int res = 0; Cadastro um; limpar_cadastro(&um, 20); // cadastra umas empresas res = cadastra(emp_1, &um); res = cadastra( (Empresa){ .cnpj = "123.456.78-03", .nome = "Amazon"}, &um); res = cadastra( (Empresa){ .cnpj = "123.456.78-02", .nome = "Google"}, &um); res = cadastra( (Empresa){ .cnpj = "123.456.78-04", .nome = "Microsoft"}, &um); // lista lista(&um); return 0; } // https://www.clubedohardware.com.br/forums/topic/1654426-programa-de-cadastro-de-empresas-em-c/#comment-8620688 int cadastra(Empresa emp, Cadastro* cad) { if (cad == NULL) return -1; if (cad->tam >= cad->lim) return -2; // não cabe cad->emp[cad->tam] = emp; // copia a empresa cad->tam += 1; // conta essa return 0; } int lista(Cadastro* cad) { printf( "Cadastro tem %u [de %u] empresas\n\n", cad->tam, cad->lim); for (int i = 0; i < cad->tam; i += 1) { printf( " %s (CNPJ:%s)\n", cad->emp[i].nome, cad->emp[i].cnpj); } printf("\n"); return 0; } int limpar_cadastro(Cadastro* cad, unsigned tam) { if (cad == NULL) return -1; cad->lim = tam; cad->tam = 0; // vazio return 0; } int cria_arquivo(const char* nome, const char* texto) { FILE* arq = fopen(nome, "w"); if (arq == NULL) return -1; fprintf(arq, "arquivo: \"%s\"\n", nome); for (int i = 0; i < 5; i += 1) fprintf(arq, "%06d \"%20s\"\n", 1 + i, texto); fclose(arq); return 0; } Agora pode inserir os enderecos e continuar testando, mas o que importa é entender como deve escrever em torno dos dados. E NUNCA escrever um programa interativo.
  6. Não tem sentido algum. Como eu expliquei, um array é isso: base e deslocamento como escrevi acima. A base é um endereço. Pode chamar de ponteiro, de Claudia, Jose Victor, endereço inicial, o que seja. Mas é um ponteiro. Não existe maneira mais fácil. E se existisse seria essa de array e por isso aprende antes. empresa[42] é a mesma coisa que *(empresa+42). Isso é C, desde os anos 70. E empresa é um ponteiro. Uma pena que alguém recomende isso... Nunca fiz um curso de C mas acho uma pena os caras terem coragem de recomendar isso. Imagine rodar o programa e ele ficar parado no fim.... Tosco. Imagine isso num script para rodar todos os programas dos alunos e o script parar no primeiro, no segundo e afinal em todos eles. Isso é uma bobagem e parte do princípio que programas são escritos para rodar em IDE e que os alunos não sabem que se o IDE não for medíocre tem uma opção para não fechar a janela ao final do teste. Programas não são escritos para rodar em IDE. Espero que ensinem isso. Entendeu os problemas que eu listei, @pedroroi ? Nada perguntou sobre isso.
  7. Não confunda rede wifi com rede local, com rede IP. Pode ter várias redes wifi e uma única rede IP. E em geral é o que quer em uma rede doméstica. Está considerando usar um único X20? Não tem muito sentido uma rede mesh--- malha --- de um único aparelho... Não, não é verdade. Talvez pudesse postar a origem de coisas que "leu". Ajudaria a outros. mesh não tem a ver com aumentar o alcance ou a cobertura, ao menos não diretamente. A ideia de mesh é prover transitividade transparente, de modo que um dispositivo móvel possa ser deslocado pela rede sem perder conexão. Só isso. E o alcance é menor e não maior. Por definição. A ideia é que aumentar a potência --- como se faz há décadas ---- gera mais e mais interferência. Então mesh acrescenta mais roteadores com menos alcance. E algoritmos e um canal de controle (backhaul). A soma desses --- algoritmos e dispositivos --- acompanha o deslocamento dentro da rede de um dispositivo e permite a transição sem cair a conexão. Isso é caro em termos de recursos, processamento, memória e dinheiro. Conforme aumenta o número de POD (os roteadores, rebatizados pelo marketing) e o total de clientes o tráfego do backhaul aumenta muito. Por essa razão procure comprar apenas POD que permitam o tráfego do canal de controle via ethernet (cabo). O X20 é assim. Posicione bem os aparelhos e não use um só. Posicione um roteador pela casa e meça a potência com celular, com algo como o WiFi analyzer e determine onde é melhor colocar as antenas. Não precisa de internet para isso. Use cabo onde for possível, em especial TV. É meio ingênuo ligar uma TV via wifi. NUNCA use portas WAN em roteadores que não estejam ligados diretamente ao provedor ou vai perder até metade da banda
  8. ainda tem muitos problemas em seu programa e vai ter um trabalho a mais se continuar escrevendo programas assim. E muito trabalho para testar. Sobre o Cadastro //STRUCT CADASTRO typedef struct{ //COLOCAR ID DA EMPRESA char nome_empresa[80]; char cnpj_empresa[80]; char proprietario_empresa[80]; int funcionarios_empresa; Endereco endereco; } Cadastro; Notou que esse não é o cadastro? É apenas UMA empresa. Esse é o cadastro: Cadastro empresa[tam]; E você chamou de empresa. Não faz sentido. E provavelmente estaria melhor sem repetir "empresa" pra todo lado na struct Cadastro... Note que em C tam deve ser conhecido em tempo de compilação. Não pode declarar isso se declarou int i, tam; a menos que dependa de extensões obscuras da linguagem, um trem chamado de VLA que não é padrão e depois de 50 anos de C não deve passar a ser parte da linguagem Mais algumas coisas que vou copiar de uma lista que tenho, por serem muito comuns: Não use system() para nada. Não estará fazendo nada. Não há praticamente nada que possa fazer com system() que não possa fazer em C ou C++. system() foi escrita em C e o sistema quase todo também. E em geral é proibido em empresas e escolas afinal: é um risco grande de segurança. E se tem algo que você não possa inicialmente fazer em C ou C++ talvez não deva mesmo fazer. main() deve ser a primeira função de seu programa. Se possível em um arquivo separado. Há muitas razões para isso, mas em especial vai gostar de começar a ler seus programas e os de outros a partir de main() E a partir do início do texto. Ao mesmo tempo. E ao usar protótipos fica trivial passar as declarações todas para um arquivo .h que é o mais prático afinal. evite retornar void de funções: em geral é um desperdício. E muitas vezes um erro. Use argumentos nas funções, e retorne algo delas. É mais esperto e expressivo. Use alguma ordem em suas funções, como a ordem alfabética por exemplo. Vai gostar disso quando seu programa tiver 50 funções ao invés de umas poucas. Muitos IDE mostram uma lista das funções, em geral na ordem em que foram declaradas, de modo que você pode clicar no nome e o editor vai direto para o código, mas se estiverem em ordem é claro que você só ganha. Não declare mais que uma variável por linha. Não acrescenta nada e só dificulta a leitura. Inicialize todas as variáveis. Nunca leia valores do teclado para alimentar seu programa antes dele estar rodando. Só vai te atrasar e não acrescenta absolutamente nada. Use constantes, use funções que retornam a estrutura preenchida. Leia de arquivos: é trivial em C. Ao terminar os testes aí sim incorpore a leitura. Use nomes significativos para as variáveis e fuja de coisas como aux, aux1 e aux2. E não use nomes de variáveis enormes porque em uma expressão fica muito difícil de ler. Se seu programa tem um menu, entenda que o menu() deve mostrar as opções e ler e retornar a opção. Um void menu() é um desperdício. scanf() foi escrita para ler entrada formatada. Não use para ler do teclado, que claramente não é entrada formatada. Só vai dar mais trabalho. Muito mais trabalho. Ao usar scanf() ou alguma função da família, como fscanf() entenda que ela retorna um valor. E teste. É ingênuo deixar o programa seguir sem testar. TESTE sempre. Exemplo: para 5 especificadores --- aquelas coisas com % na frente e que não tem um asterisco nem outro '%' --- como "%d %d %f %f %d" scanf() pode ler de 0 a 5 itens ou dar erro e retornar -1. Então teste o retorno que vai estar entre -1 e 5... não use fflush(): isso só está definido para fluxos de saída. Em alguns compiladores pode até funcionar, mas é um sinal de fez algo errado e não sabe como consumir os dados.Não existe "lixo de teclado": necessidades como de flush() na entrada indicam apenas que não entendeu bem o que está lendo e o que é a entrada via teclado, free form: o usuário pode digitar qualquer coisa e é o seu programa que tem que se virar O teclado tem ao menos 105 teclas de liberdade e o usuário pode digitar qualquer coisa em qualquer ordem. Nunca escreva um programa interativo. Não vai aprender nada. Não vai ganhar nada. Escreva e teste todas as funções. DEPOIS de tudo testado coloque a parte interativa. isso inclui claro o eventual menu. Um programa interativo é chato para testar. Durante o desenvolvimento ninguém quer interagir com o programa. Nunca escreva um programa interativo, mesmo que seja o objetivo final. evite ler do teclado a menos que seja o objetivo do problema. Ler de arquivos é muito mais simples, seguro e fácil de reproduzir. Não há razão para ficar parado em frente a tela minutos inventando nomes de campos e coisas assim: o efeito é que vai acabar não testando direito porque é difícil controlar e repetir testes. Não misture entrada de dados ou formatação com a apresentação dos dados ou a lógica do programa, Isso é um desastre para manutenção e desenvolvimento Um printf() de 6 linhas é muito, mas muito melhor que 6 printf() de 1 linha. E se só vai mostrar o texto puts() é ainda melhor e dezenas de vezes mais rápido que uma série de printf(). evite comentários óbvios como esse: Comente o que está fazendo, o porque das coisas. Sobre algumas das suas questões: Não existe "C sem ponteiros". Todo vetor é descrito como base e deslocamento. Se declarou Empresa[200] então Empresa é um ponteiro para o início do vetor. E o índice na hora de acessar vai dar o deslocamento a partir do tal início: Cadastro empresa[200]; é a mesma coisa que somar ao ponteiro empresa 42 vezes o tamanho da struct Cadastro e assim descobrir o endereço dessa particular empresa... O trivial é um campo na estrutura Empresa com o total de endereços. Na versão que postou tem o total de funcionários mas não tem nenhum. E pode ter vários endereços mas não tem o número e só tem lugar para um. Por outro lado: // STRUCT ENDERECO typedef struct { int qnt_endereco; char pais_endereco[80]; char estado_endereco[80]; char municipio_endereco[80]; char logradouro_endereco[80]; int numero_endereco; int cep_endereco; } Endereco; Pois é: qnt_endereco está na estrutura errada. E não precisa repetir _endereco toda hora. É muito pior assim. A struct é endereço e vai usar o prefixo. Fica muito ruim de ler e escrever: Endereco endereco; endereco.numero_endereco = 42; Acha mesmo que precisa repetir? E para que o comentário com o mesmo texto? // STRUCT ENDERECO typedef struct { } Endereco; Já dava para imaginar que o typedef era de uma struct endereco. Escreva em torno dos dados. O simples é passar o Cadastro para a função como argumento e retornar um status Está certo de que escrever "NULL" é o que precisa? Não seria mais simples usar NULL, a constante? E aí poderia zerar tudo em uma linha: Cadastro empresa[20] = {0}; Na declaração. Ou depois usando memset()
  9. Apenas reconectar no C6 que faz a conexão. Pode ser simples como alternar para endereço dinâmico salvar e alternar de volta para o PPPoE. Isso se não tiver um botão lá no sw dele para reconectar. No emulador não dá pra ver. E em geral muda de fato? Não é algo garantido. Muitas vezes passa semanas com o mesmo endereço. Não. Nada tem a ver com o cabo. É que em muitos casos em que se faz isso é porque o aparelho fica em um lugar miserável em termos de wifi, tipo na garagem na entrada em outro piso, ou DENTRO de um rack metálico e assim não adianta muito ligar o wifi certo? Isso porque no caso geral tem a aritmética e as leis da física. Veja o seu caso: o C6 trafega supostos 400/800 mbps mais ou menos, em 2.4/5 GHz.. Você tem 2 e eles não podem ficar em 3 lugares ao mesmo tempo. 5Ghz raramente passa duas paredes, digamos. E se o roteador da VIVO suportar algo similar isso quer dizer que ao desligar isso ficou com 33% menos de capacidade teórica do wifi a 5ghz (aritmética) e não pode colocar as antenas por exemplo em 3 lugares (física). O mesmo vale para 2.4Ghz. E claro que vai perder as portas ethernet. Se usar 2 C6 terá apenas 5. Se usar os 2 MAIS o VIVO terá 8, um aumento de 60% (mais aritmética). E tem claro a capacidade de comutação que vai cair também em um terço... Não há nada configurável lá exceto usuário e senha, até onde eu sei Pois é: esse é um dos problemas de usar bridge, caso use outros serviços tudo pode ficar bem complicado para um usuário doméstico ou mesmo um profissional. É preciso entender e redirecionar o tráfego das redes virtuais que esse infeliz usa pra VOIP e TV. E a operadora não vai dar suporte se mudar a operação para bridge.
  10. Parece uma maneira comum de configurar isso. Sem conhecer o site é difícil dizer que leva vantagem com essa configuração. Testou,nessas ocasiões em que tem a a tal queda de velocidade, apenas refazer a conexão pppoe? Mudar a porta pode ser irrelevante, apenas claro força a reconexão por parte do cliente PPoE. Acho que ao colocar em modo bridge (ponte) isso naturalmente desativa o wifi e não precisa desativar ou ativar nada no roteador da VIVO, que passa a ser uma simples ponte --- bridge --- com a LAN autenticando o cliente via PPPoE. Mudar o endereço IP não é relevante. Apontar os DNS para CloudFare ou Google também não vai induzir nenhum problema como o que tem. Mas note que em geral esses servidores vão ter latência muito maior do que servidores que estejam dentro da rede do provedor, ou da sua própria LAN. Em geral se mede isso usando algo como DNSBench, E a conclusão quase sempre é de que os servidores do provedor são bem mais rápidos, como os 187.250.115 187.250.215 ou 200.204.0.10 e 200.204.0.138 da sua operadora. Porque reinicia o roteador da VIVO? Alguma suspeita de problema? Rotina? Como disse, testou se apenas refazer a conexão PPPoE não é suficiente para restaurar a velocidade? Testou a performance da LAN durante essas aparentes quedas de velocidade com a internet? A LAN fica normal? Se está na rede certamente terá um (outro) endereço IP. Por simplicidade use um endereço na mesma rede e fora do intervalo do serviço DHCP. Usa um único servidor DHCP? Ainda sobre o modo bridge, não tem mesmo uso nem para o wifi em 5Ghz na sua LAN? wifi nessa frequência tem um alcance tão modesto que pode nem ser justo perder a performance e a cobertura desse aparelho. Está em um rack ou algo assim?
  11. @Ronaldo Moretto Há uma mínima diferença de latência, maior para o que estiver ligado a partir do switch. E uma óbvia realidade de que tudo o que passar para o switch vai ter que passar pelo cabo que o liga ao roteador. Se sua rede existir apenas para acessar a internet, com modesto meio gigabit pra dividir entre todos os dispositivos conectados a 1 GB então não fará diferença. Mas se tiver mais tráfego em sua rede local --- por exemplo um servidor de mídia tipo o Plex --- que acesse muito de uma ou outra estação e TV então é claro que deve deixar esses dispositivos do mesmo lado da rede, ou no switch ou no roteador, nunca um de cada lado
  12. arfneto

    C Fazer tabelas em C

    Bem, é um caso de opinião talvez. Não me parece minimalista. E não é genérica. E é difícil de ler com esses asteriscos todos. E eu não diria que é elegante. Coisa de forum isso de opinião Eu te mostrei a diferença e acho que você já sabia, mas veja de novo usando o que te mostrei acima, para fazer a mesma coisa: Dado32 um = {0}; um.byte0 = i2cr(12); um.byte1 = i2cr(13); um.byte2 = i2cr(14); um.byte3 = i2cr(15); Dado32 outro = { .byte0 = i2cr(12), .byte1 = i2cr(13), .byte2 = i2cr(14), .byte3 = i2cr(15)}; E pode usar sempre esse tipo Dado32 que dá pra imaginar o que é mesmo sem o comentário... A segunda opção permite inicializar um único byte se for preciso. typedef union { unsigned char* ponteiro; float dado; uint32_t int32bits; struct { unsigned char byte0; unsigned char byte1; unsigned char byte2; unsigned char byte3; }; } Dado32; Uma DWORD picadinha... É mais fácil imaginar que para mudar o byte 2 muda byte2, ou não? E pode ter um WORD e um BYTE como a microsoft usa... Direto de windows.h: typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; Mas considere sempre usar os tipos que estão em stdint.h porque é melhor para todo mundo: typedef signed char int8_t; typedef short int16_t; typedef int int32_t; typedef long long int64_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long long uint64_t; mesmo que programe sozinho sempre. Um dia vai ler um programa de alguém e vai gostar de ler nomes com os quais está acostumado.
  13. arfneto

    C Fazer tabelas em C

    Não dá pra dizer como funciona ou mesmo se funciona apenas vendo um pedaço de código. Mas são endereços consecutivos e são bytes então essa nem deve ser a mesma mais certinha de fazer isso. C tem os mesmos operadores de bit que assembler e pode fazer igualzinho e usar AND OR XOR e NOT, e ROTATE e SHIFT. E como te mostrei no programa anterior pode usar uma union e acessar os bytes diretamente, veja no exemplo multi.byte0 e multi.byte1. Veja esse programa com mais atenção ainda: (C para programadores assembler ) #include <stdint.h> #include <stdio.h> typedef union { unsigned char* ponteiro; uint32_t dado; struct { unsigned char byte0; unsigned char byte1; unsigned char byte2; unsigned char byte3; }; } Coisa32; int mostra(Coisa32*, const char*); int main(void) { unsigned char um = 0xF2; unsigned char outro = 0xF3; Coisa32 teste = {0}; Coisa32* p = &teste; // p aponta para teste... mostra(p, "zerado"); teste.dado = teste.dado | (int)(um) << 8; // byte 1 mostra(p, "F2 no byte 2"); teste.dado = teste.dado | (int)(outro) << 16; // byte 2 mostra(p, "F3 no byte 1" ); teste.byte3 = 0xF4; mostra(p, "F3 no byte 3"); teste.byte0 = 0xF1; mostra(p, "F1 no byte 0"); teste.dado = 1; mostra(p, "int = 1"); teste.dado = ~teste.dado; // not mostra(p, "inverte bit a bit"); // zera bits 0123 do byte3 teste.byte3 = teste.byte3 & 0xF0; mostra(p, "zera 4 bits no byte 3"); // coloca 8 no lugar teste.byte3 = 8; mostra(p,"coloca 8 no byte 3"); // coloca 01010101 no byte 3 teste.byte3 = 0b01010101; // binário mostra(p, "coloca 01010101 = 55"); // inverte o byte 3 0101 vira 1010 55 =? AA teste.byte3 = teste.byte3 ^ 0b11111111; // XOR mostra(p, "inverte o byte 3"); // gira pra direita 8 bits teste.dado >>= 8; mostra(p, "shift 8 bits para a direita"); // gira pra direita 8 bits teste.dado >>= 8; mostra(p, "shift 8 bits para a direita"); // gira pra direita 8 bits teste.dado >>= 8; mostra(p, "shift 8 bits para a direita"); // gira pra direita 8 bits teste.dado >>= 8; mostra(p, "shift 8 bits para a direita"); return 0; } int mostra(Coisa32* campo, const char* tit) { if (tit == NULL) printf( "%-20s\tvalor agora = %d\t[0x%08X]\n", " ", campo->dado, campo->dado); else printf( "%-20s\tvalor agora = %d\t[0x%08X]\n", tit, campo->dado, campo->dado); printf( "%20s\tbytes: 0x%X 0x%X 0x%X 0x%X\n\n", " ", campo->byte0, campo->byte1, campo->byte2, campo->byte3); return 0; }; Eis a saida zerado valor agora = 0 [0x00000000] bytes: 0x0 0x0 0x0 0x0 F2 no byte 2 valor agora = 61952 [0x0000F200] bytes: 0x0 0xF2 0x0 0x0 F3 no byte 1 valor agora = 15987200 [0x00F3F200] bytes: 0x0 0xF2 0xF3 0x0 F3 no byte 3 valor agora = -185339392 [0xF4F3F200] bytes: 0x0 0xF2 0xF3 0xF4 F1 no byte 0 valor agora = -185339151 [0xF4F3F2F1] bytes: 0xF1 0xF2 0xF3 0xF4 int = 1 valor agora = 1 [0x00000001] bytes: 0x1 0x0 0x0 0x0 inverte bit a bit valor agora = -2 [0xFFFFFFFE] bytes: 0xFE 0xFF 0xFF 0xFF zera 4 bits no byte 3 valor agora = -251658242 [0xF0FFFFFE] bytes: 0xFE 0xFF 0xFF 0xF0 coloca 8 no byte 3 valor agora = 150994942 [0x08FFFFFE] bytes: 0xFE 0xFF 0xFF 0x8 coloca 01010101 = 55 valor agora = 1442840574 [0x55FFFFFE] bytes: 0xFE 0xFF 0xFF 0x55 inverte o byte 3 valor agora = -1426063362 [0xAAFFFFFE] bytes: 0xFE 0xFF 0xFF 0xAA shift 8 bits para a direita valor agora = 11206655 [0x00AAFFFF] bytes: 0xFF 0xFF 0xAA 0x0 shift 8 bits para a direita valor agora = 43775 [0x0000AAFF] bytes: 0xFF 0xAA 0x0 0x0 shift 8 bits para a direita valor agora = 170 [0x000000AA] bytes: 0xAA 0x0 0x0 0x0 shift 8 bits para a direita valor agora = 0 [0x00000000] bytes: 0x0 0x0 0x0 0x0 Acho mesmo importante você entender isso. Veja quando tiver tempo. São operações comuns em C e os operadores são os mesmos do assembler. C foi escrita para escrever um sistema operacional (Unix) que era todo escrito em assembler em uma máquina com palavra de 18 bits Esse programa faz aquilo que mostrou acima, mas vai achar talvez mais legível. E mostra outras coisas. Se não entender algo pergunte, talvez abrindo um tópico com esse programa. O programa pode ajudar mais gente do que aqui enterrado nessa outra discussão se estiver separado
  14. Direto no navegador pode digitar 1000ft e ver a medida. 1 pé equivale a 30.48cm então a caixa de 1000 pés tem 304,8m e arredondam para 305m, como disse @Ricardov
  15. arfneto

    C Fazer tabelas em C

    ? union nada tem de sinistro. Apenas faz uma área de memória poder ser vista como várias coisas distintas, alternadamente. union é bem amiga de programadores em Assembler porque facilita o acesso a buffers e bit masks Veja essa union { // txt: tam vai ser definido pelos outros campos const char txt[]; unsigned int valor; // 4 bytes uint32_t valor4; // 4 bytes struct // anonima: não precisa de nome { unsigned char byte0; unsigned char byte1; unsigned char byte2; unsigned char byte3; }; } multi; Isso faz o que você queria. E mais. txt[] tem o mesmo endereço de valor. E de valor4. E pode acessar byte a byte. E então o tamanho de txt fica regulado pelo tamanho da maior coisa que tiver na union. No caso o int. Deixei um campo como uint32_t para lembrar que é bom usar esses tipos que já tem o tamanho no nome. Eles residem em stdint.h. EXEMPLO multi.byte0 = '0'; multi.byte1 = '1'; multi.byte2 = '2'; multi.byte3 = 0; Isso vai fazer com que txt tenha o valor "012". Conveniente... Um programa completo que usa os dois modos de que falei: #include <stdint.h> #include <stdio.h> int main(void) { union { // txt: tam vai ser definido pelos outros campos const char txt[]; unsigned int valor; // 4 bytes uint32_t valor4; // 4 bytes struct // anonima: não precisa de nome { unsigned char byte0; unsigned char byte1; unsigned char byte2; unsigned char byte3; }; } multi; multi.byte0 = '0'; multi.byte1 = '1'; multi.byte2 = '2'; multi.byte3 = 0; const char* addr = multi.txt; uint64_t addr_int = (uint64_t)addr; printf(" txt[] = \"%s\"\n", multi.txt); printf( " bytes: 0x%X 0x%X 0x%X 0x%X\n", multi.byte0, multi.byte1, multi.byte2, multi.byte3); multi.valor4 = 0x04030201; printf( " valor agora = %d = 0x%X\n", multi.valor4, multi.valor4); printf( " bytes: 0x%X 0x%X 0x%X 0x%X\n\n", multi.byte0, multi.byte1, multi.byte2, multi.byte3); printf( " endereco de 'txt' = 0x%X\n", (unsigned int)multi.txt); printf( " endereco de 'valor4'= 0x%X\n", (unsigned int)&multi.valor4); printf( " endereco de 'byte0'\t= 0x%X\n", (unsigned int)&multi.byte0); printf( " endereco de 'byte1'\t= 0x%X\n", (unsigned int)&multi.byte1); return 0; } Saida txt[] = "012" bytes: 0x30 0x31 0x32 0x0 valor agora = 67305985 = 0x4030201 bytes: 0x1 0x2 0x3 0x4 endereco de 'txt' = 0xAFFDC8 endereco de 'valor4'= 0xAFFDC8 endereco de 'byte0' = 0xAFFDC8 endereco de 'byte1' = 0xAFFDC9 Bem cômodo não é? Ainda acha sinistro? É muito conveniente. Note que se precisa disso por exemplo para montar um header que vai usar toda hora pode declarar como nome: typedef union { // txt: tam vai ser definido pelos outros campos const char txt[]; unsigned int valor; // 4 bytes uint32_t valor4; // 4 bytes struct // anonima: não precisa de nome { unsigned char byte0; unsigned char byte1; unsigned char byte2; unsigned char byte3; }; } Multi; E declarar vários Multi teste; Multi muitos[20]; E escrever por exemplo muitos[19].byte3 = 0x23; para acessar o ultimo byte da ultima uniao do array de 20.
  16. @Blacklynx não dá pra mudar o fato da ONU ser o gateway da rede sem comprar outro equipamento ou perder o resto da ONU. Não vai perder as portas ethernet?
  17. arfneto

    C Fazer tabelas em C

    E só um endereço. Não tem forma, use cast ou union então. Usa um crosscompiler? Como compila? Entendeu o que eu expliquei? leu o exemplo que escrevi? rodou?
  18. Acho que deve imaginar que onde tem mais exemplos disso é na documentação do sistema. Não olhou lá? Viu o material que tem em https://github.com/microsoft/Windows-classic-samples/tree/ac06e54a15e9a62443e400fffff190fb978ea586 ? Windows Classic Samples quer dizer isso mesmo. São exemplos de tudo. E no MSDN? Olhou? Esse é o portal de documentação do sistema que está usando. Não vai aprender muito com a API gráfica do Windows 32. Há muito não se escreve nada com isso. Nem a Microsoft recomenda. UWP é a plataforma recomendada, há mais de 10 anos. Viu na documentação sobre common controls, em português? Leu isso na documentação em português?: Conceitos básicos de design para aplicativos da Área de Trabalho Como descrito no PRIMEIRO post desse forum, viu como formatar seu código? Veja a diferença: #include <windows.h> #include <Conta Bancaria.c> /* This is where all the input to the window goes to */ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); /* The 'main' function of Win32 GUI programs: this is where execution starts */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; /* A properties struct of our window */ HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */ MSG msg; /* A temporary location for all messages */ /* zero out the struct and set the stuff we want to modify */ memset(&wc,0,sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; /* This is where we will send messages to */ wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */ wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "WindowClass"; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */ wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */ if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK); return 0; } hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Login Conta Bancaria",WS_VISIBLE|WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /* x */ CW_USEDEFAULT, /* y */ 640, /* width */ 480, /* height */ NULL,NULL,hInstance,NULL); if(hwnd == NULL) { MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK); return 0; } /* This is the heart of our program where all input is processed and sent to WndProc. Note that GetMessage blocks code flow until it receives something, so this loop will not produce unreasonably high CPU usage */ while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */ TranslateMessage(&msg); /* Translate key codes to chars if present */ DispatchMessage(&msg); /* Send it to WndProc */ } return msg.wParam; } #define ID_Login 1001 #define ID_Cadastrar 1002 HINSTANCE g_inst; HWND EditNum1,EditNum2,EditNum3,EditNum4,EditNum5,EditNum6,EditTotal,Login,Cadastrar; void DesenharObjectos(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { CreateWindowEx ( 0,"STATIC","Nome", WS_VISIBLE|WS_CHILD|WS_BORDER, 10, 80, 80, 25, hwnd,NULL,g_inst,NULL); CreateWindowEx ( 0,"STATIC", "Nome", WS_VISIBLE|WS_CHILD|WS_BORDER, 290, 80, 80, 25, hwnd, NULL, g_inst, NULL ); CreateWindowEx ( 0,"STATIC","E-mail", WS_VISIBLE|WS_CHILD|WS_BORDER, 10, 121, 80, 25, hwnd,NULL,g_inst,NULL); CreateWindowEx ( 0,"STATIC", "E-mail", WS_VISIBLE|WS_CHILD|WS_BORDER, 290, 121, 80, 25, hwnd, NULL, g_inst, NULL ); CreateWindowEx ( 0,"STATIC","Senha", WS_VISIBLE|WS_CHILD|WS_BORDER, 10, 161, 80, 25, hwnd,NULL,g_inst,NULL); CreateWindowEx ( 0,"STATIC", "Senha", WS_VISIBLE|WS_CHILD|WS_BORDER, 290, 161, 80, 25, hwnd, NULL, g_inst, NULL ); EditNum1 = CreateWindowEx ( WS_EX_CLIENTEDGE,"EDIT","a", WS_VISIBLE|WS_CHILD|WS_BORDER|ES_RIGHT , 90, 80, 200, 30, hwnd,NULL,g_inst,NULL); EditNum2 = CreateWindowEx ( WS_EX_CLIENTEDGE,"EDIT", "", WS_VISIBLE|WS_CHILD|WS_BORDER, 370, 80, 200, 30, hwnd, NULL, g_inst, NULL ); EditNum3 = CreateWindowEx ( WS_EX_CLIENTEDGE,"EDIT","", WS_VISIBLE|WS_CHILD|WS_BORDER|ES_RIGHT , 90, 120, 200, 30, hwnd,NULL,g_inst,NULL); EditNum4 = CreateWindowEx ( WS_EX_CLIENTEDGE,"EDIT", "", WS_VISIBLE|WS_CHILD|WS_BORDER, 370, 120, 200, 30, hwnd, NULL, g_inst, NULL ); EditNum5 = CreateWindowEx ( WS_EX_CLIENTEDGE,"EDIT","", WS_VISIBLE|WS_CHILD|WS_BORDER|ES_RIGHT , 90, 160, 200, 30, hwnd,NULL,g_inst,NULL); EditNum6 = CreateWindowEx ( WS_EX_CLIENTEDGE,"EDIT", "", WS_VISIBLE|WS_CHILD|WS_BORDER, 370, 160, 200, 30, hwnd, NULL, g_inst, NULL ); Login = CreateWindowEx ( 0, "BUTTON", "Login", WS_VISIBLE|WS_CHILD, 90, 220, 200, 30, hwnd,(HMENU)ID_Login, g_inst, NULL); Cadastrar = CreateWindowEx ( 0, "BUTTON", "Cadastrar", WS_VISIBLE|WS_CHILD, 370, 220, 200, 30, hwnd,(HMENU)ID_Cadastrar, g_inst, NULL); SendMessage((HWND) EditNum1,(UINT) WM_SETFONT,(WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) EditNum2,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) EditNum3,(UINT) WM_SETFONT,(WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) EditNum4,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) EditNum5,(UINT) WM_SETFONT,(WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) EditNum6,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) EditTotal,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) Login,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) Cadastrar,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); } char nome1[200] [50], email1[200] [50],senha1[200] [50], nome2[200] [50], email2[200] [50], senha2[200] [50]; int linha, i; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: DesenharObjectos(hwnd,message,wParam,lParam); break; case WM_COMMAND: if ((HIWORD(wParam) == BN_CLICKED)) { SendMessage((HWND)EditNum1,(UINT)EM_GETLINE,(WPARAM)1,(LPARAM) &nome1); SendMessage((HWND)EditNum2,(UINT)EM_GETLINE,(WPARAM)1,(LPARAM) &email1); SendMessage((HWND)EditNum3,(UINT)EM_GETLINE,(WPARAM)1,(LPARAM) &senha1); SendMessage((HWND)EditNum4,(UINT)EM_GETLINE,(WPARAM)1,(LPARAM) &nome2); SendMessage((HWND)EditNum5,(UINT)EM_GETLINE,(WPARAM)1,(LPARAM) &email2); SendMessage((HWND)EditNum6,(UINT)EM_GETLINE,(WPARAM)1,(LPARAM) &senha2); //valor1 = atof(s_valor1); //valor2 = atof(s_valor2); switch (LOWORD(wParam)) { case ID_Login: for(i=0;i<200;i++){ if(nome1[i]==nome2){ if(email1[i]==email2){ if(senha1[i]==senha2){ Conta Bancaria(); } } } } break; case ID_Cadastrar: FILE *farq; do{ farq = fopen("arqtexto.txt","a"); fprintf(farq, "%s \n", &nome1[linha]); fprintf(farq, "%s \n", &email1[linha]); fprintf(farq, "%d \n", &senha1[linha]); fclose(farq); linha++; }while(op==1); break; } //ftoa(total,s_total,2); SendMessage((HWND) EditTotal, (UINT) WM_SETTEXT, (WPARAM) 0, (LPARAM) &s_total); } break; /* Upon destruction, tell the main thread to stop */ case WM_DESTROY: { PostQuitMessage(0); break; } /* Todas as outras mensagens (muitas delas) são processadas usando procedimentos padrão */ default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } > < #include <windows.h> #include <math.h> #include "resource.h" void reverse(char* str, int len) { int i = 0, j = len - 1, temp; while (i < j) { temp = str[i]; str[i] = str[j]; str[j] = temp; i++; j--; } } // Converte um determinado inteiro x em string str []. // d é o número de dígitos exigidos na saída. // Se d for mais do que o número de dígitos em x, // então 0s são adicionados no início. int intToStr(int x, char str[], int d) { int i = 0; while (x) { str[i++] = (x % 10) + '0'; x = x / 10; } // Se o número de dígitos necessários for maior, então // adicione 0s no início while (i < d) str[i++] = '0'; reverse(str, i); str[i] = '\0'; return i; } // Converte um número de ponto flutuante / duplo em uma string. void ftoa(float n, char* res, int afterpoint) { // Extrair parte inteira int ipart = (int)n; // Extrair parte flutuante float fpart = n - (float)ipart; // converter parte inteira em string int i = intToStr(ipart, res, 0); // verifique a opção de exibição após o ponto if (afterpoint != 0) { res[i] = '.'; // add dot // Obtenha o valor da parte da fração até o nº fornecido. // de pontos após o ponto. O terceiro parâmetro // é necessário para lidar com casos como 233,007 fpart = fpart * pow(10, afterpoint); intToStr((int)fpart, res + i + 1, afterpoint); } } /*Este é o lugar onde todas as entradas para a janela vão para */ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); /* A função 'principal' dos programas GUI Win32: é aqui que a execução começa */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { WNDCLASSEX wc; /* Uma estrutura de propriedades da nossa janela*/ HWND hwnd; /*Um 'HANDLE', daí o H, ou um ponteiro para nossa janela*/ MSG msg; /* A temporary location for all messages */ /* zero out the struct and set the stuff we want to modify */ wc.hInstance = hInstance; wc.lpszClassName = "WindowClass"; wc.lpfnWndProc = WndProc; /* This is where we will send messages to */ wc.style = CS_DBLCLKS; wc.cbSize = sizeof (WNDCLASSEX); wc.hIcon = LoadIcon(hInstance, IDI_ICON); /* Load a standard icon */ wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */ wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszMenuName= NULL; wc.cbClsExtra = 0; wc.cbWndExtra = 0; /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */ wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK); return 0; } hwnd = CreateWindowEx(0,"WindowClass","Conta Bancaria",WS_OVERLAPPEDWINDOW, 350, /* x */ 350, /* y */ 640, /* width */ 480, /* height */ HWND_DESKTOP,NULL,hInstance,NULL); ShowWindow (hwnd, nCmdShow); /* Este é o coração do nosso programa onde todas as entradas são processadas e enviado para WndProc. Observe que GetMessage bloqueia o fluxo de código até receber algo, então este loop não produzirá um uso de CPU excessivamente alto */ while(GetMessage(&msg, NULL, 0, 0)) { /* If no error is received... */ TranslateMessage(&msg); /* Translate key codes to chars if present */ DispatchMessage(&msg); /* Send it to WndProc */ } return msg.wParam; } #define ID_Depositar 1001 #define ID_Sacar 1002 HINSTANCE g_inst; HWND EditNum1,EditNum2,EditTotal,Depositar,Sacar; void DesenharObjectos(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { EditNum1 = CreateWindowEx ( WS_EX_CLIENTEDGE,"EDIT","", WS_VISIBLE|WS_CHILD|WS_BORDER|ES_RIGHT , 20, 120, 200, 30, hwnd,NULL,g_inst,NULL); EditNum2 = CreateWindowEx ( WS_EX_CLIENTEDGE,"EDIT", "", WS_VISIBLE|WS_CHILD|WS_BORDER, 260, 120, 200, 30, hwnd, NULL, g_inst, NULL ); EditTotal = CreateWindowEx ( WS_EX_CLIENTEDGE,"EDIT", "", WS_VISIBLE|WS_CHILD|WS_BORDER, 400, 20, 200, 30, hwnd, NULL, g_inst, NULL ); Depositar = CreateWindowEx ( 0, "BUTTON", "Depositar", WS_VISIBLE|WS_CHILD, 20, 160, 200, 30, hwnd,(HMENU)ID_Depositar, g_inst, NULL); Sacar = CreateWindowEx ( 0, "BUTTON", "Sacar", WS_VISIBLE|WS_CHILD, 260, 160, 200, 30, hwnd,(HMENU)ID_Sacar, g_inst, NULL); SendMessage((HWND) EditNum1,(UINT) WM_SETFONT,(WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) EditNum2,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) EditTotal,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) Depositar,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); SendMessage((HWND) Sacar,(UINT) WM_SETFONT, (WPARAM) 0,(LPARAM) lParam); } char s_valor1[20] = "0", s_valor2[20] = "0", s_total[20] = "0"; float valor1, valor2, total, novoDeposito, novoSacar; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: DesenharObjectos(hwnd,message,wParam,lParam); break; case WM_COMMAND: if ((HIWORD(wParam) == BN_CLICKED)) { SendMessage((HWND)EditNum1,(UINT)EM_GETLINE,(WPARAM)1,(LPARAM) &s_valor1); SendMessage((HWND)EditNum2,(UINT)EM_GETLINE,(WPARAM)1,(LPARAM) &s_valor2); valor1 = atof(s_valor1); valor2 = atof(s_valor2); switch (LOWORD(wParam)) { case ID_Depositar: if(valor1>0){ MessageBox (NULL,"Parabens Deposito efetuado com sucesso \n voce acabou de Depositar", "Resultado", MB_OK); novoDeposito = total; novoDeposito = total + valor1; total = novoDeposito; SendMessage((HWND)EditNum1,(UINT)WM_SETTEXT,(WPARAM)1,(LPARAM) ""); }else{ MessageBox (NULL, "Erro Digite um valor", "Resultado", MB_OK); } break; case ID_Sacar: if(valor2<=total){ MessageBox (NULL,"Parabens Saque efetuado com sucesso \n voce acabou de Sacar", "Resultado", MB_OK); novoSacar = total; novoSacar = total - valor2; total = novoSacar; SendMessage((HWND)EditNum2,(UINT)WM_SETTEXT,(WPARAM)1,(LPARAM) ""); }else if(valor2>total){ MessageBox (NULL, "Saldo insuficiente", "Resultado", MB_OK); SendMessage((HWND)EditNum2,(UINT)WM_SETTEXT,(WPARAM)1,(LPARAM) ""); }else{ MessageBox (NULL, "Erro", "Resultado", MB_OK); } break; } ftoa(total,s_total,2); SendMessage((HWND) EditTotal, (UINT) WM_SETTEXT, (WPARAM) 0, (LPARAM) &s_total); } break; /* Upon destruction, tell the main thread to stop */ case WM_DESTROY: { PostQuitMessage(0); break; } /* Todas as outras mensagens (muitas delas) são processadas usando procedimentos padrão */ default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
  19. arfneto

    C Fazer tabelas em C

    Porque não consegue criar um tópico??? Não entendi a ideia aqui... txt é o que? const unsigned char* Acho que devia declarar assim, porque essa é a realidade: está declarando um nome, txt, e associando a um tipo. É óbvio que se txt é const unsigned char* então *txt é char. Isso é C. Mas não é o que está declarando. Prefira sempre const unsigned char* txt = {"12345678abcdefgh"}; // esta declarando txt e não *txt Agora a segunda linha: declara t como unsigned char. E tenta inicializar com &txt. O operador '&' extrai o endereço. Então &txt é um endereço, o endereço da string. E aí tenta atribuir a um char e acha estranho o compilador reclamar? É outro tipo. unsigned char tem um byte. Um endereço tem 4 ou 8 dependendo da plataforma. Na real declarou t como unsigned int aqui e não char. Então dependendo da plataforma os dois tem 4 bytes. Bem confuso. EXEMPLO considere o arquivo outro.c: // so isso unsigned char* const dados = {"valor externo"}; e o arquivo v1.c #include <memory.h> #include <stdio.h> #include <stdlib.h> #include <string.h> extern char* const dados; int main(void) { const char txt[] = {"12345678abcdefgh"}; char buffer[80]; const char* outro = (const char*)&buffer; unsigned int t = (unsigned int)&txt; printf("End 't' (local) = 0x%X\n", t); char* p = (char*)t; printf( "primeiro byte de txt usando o ponteiro salvo no " "int: \"%c\"\n", *p); p = dados; printf("End 'p' (externo) = 0x%p\n", p); printf( "usando o ponteiro para a area externa: " "\"%s\"\n", p); // outro = p; // cancela o programa: outro eh const //*(p + 1) = '%'; // cancela o programa: p eh const p = (char*) outro; // assim esta ok strcpy(buffer, txt); *(p + 1) = '%'; // outro não eh const printf("outro: \"%s\"\n", p); return 0; } E o resultado, em 32 bits: End 't' (local) = 0x8FFB04 primeiro byte de txt usando o ponteiro salvo no int: "1" End 'p' (externo) = 0x00947B34 usando o ponteiro para a area externa: "valor externo" outro: "1%345678abcdefgh" E veja se ajuda a entender o mecanismo disso... CRIE UM TÓPICO. Esse tipo de exemplo é importante, eu acho.
  20. Esse ajuste não existe para você marcar quanto acha que deve ser a velocidade. Existe apenas para casos em que se precisa definir MENOS do que a velocidade normal, por alguma necessidade específica, como testar um driver 10mbps que está escrevendo, e conectando em uma placa 1000 do outro lado. Você marcar lá quanto acha que deve ser a velocidade seria como marcar uma nota de 2 reais como 75 e tentar passar adiante com esse valor... Não vai rolar. Não é verdade. Vai depender de qual pino falhar. Se 1 único pino entre 1 2 3 ou 6 falhar não terá qualquer conexão. Dos outros 4, podem falhar 1 ou todos e vai conectar em até 100 mbps dependendo do que tenha do outro lado do fio. A velocidade da conexão e o status do duplex vai ficar limitada pelo maior valor possível entre os equipamentos e a mídia de conexão. Se a porta do roteador onde está conectado o PC é gigabit o cabo é compatível, Cat5E( ou mesmo Cat5 para curtas distâncias) as oito vias estão conectadas os terminais tem mesmo 8 vias a placa de rede gigabit Então deve se conectar a essa velocidade. Confira tudo. Comece pelo modelo da placa de rede: qual é?
  21. ? O encaminhamento de portas existe para o que entra pela porta WAN. A porta WAN não deve estar em uso em nenhum roteador exceto a ONU então... não há o que encaminhar.
  22. O que importa não é só a quantidade de equipamentos mas a cobertura. Como eu disse, não dá pra colocar um rádio em dois lugares, E assim, em especial a 5GHz não é esperto desligar o wifi que você já tem na ONU. Raramente wifi a 5ghz passa com qualidade mais de uma parede... Sobre o duplo NAT se tem é porque ligou errado. Não deve nunca usar a porta WAN em roteadores que não o que está ligado de fato à WAN. A menos que possa desabilitar NAT no primeiro roteador e ligar apenas roteadores nesse nível, mas aí provavelmente saberia porque precisa disso e como fazer. Nos últimos meses postei muitos roteiros, desenhos, roteiros e argumentos de como ligar muitos roteadores ao mesmo tempo em redes domésticas ou de pequenas empresas. E parei de repetir. Tenho uma lista de alguns tópicos e pode ver lá e perguntar aqui sobre qualquer dúvida... Veja Alguns números https://www.clubedohardware.com.br/forums/topic/1605208-como-criar-uma-rede-pública-isolado-com-um-segundo-roteador/#comment-8429612 Outro caso https://www.clubedohardware.com.br/forums/topic/1606750-configurando-roteadores-d-link-dir-842-e-apple/#comment-8434558 detalhes aqui https://www.clubedohardware.com.br/forums/topic/1613345-abrir-porta-com-modem-que-distribui-faixa-de-ip-diferente-para-o-roteador/#comment-8460463 exemplo https://www.clubedohardware.com.br/forums/topic/1625440-velocidade-duplex-pode-causar-quedas-de-internet/#comment-8506640 resumo Nunca conecte roteadores secundários via porta WAN. Isso cria outras redes IP e segmenta o tráfego. A primeira rede não vê as outras. As outras veêm a primeira apenas porque nela é que está o gateway padrão dos roteadores. Fora isso quase nada funciona mais direito. Incorre em múltiplo NAT e pode perder metade da banda nas redes que não a primeira só por causa disso. Nada vai funcionar direito com dispositivos que não estejam na mesma rede IP. Isso inclui espelhamento de tela de celulares, compartilhamento de arquivos, impressoras wifi, lâmpadas acessórios smart e outras coisas. Encaminhamento de portas tem que ser repetido em TODAS as redes secundárias. Broadcast de rede não passa pelos roteadores e assim coisas como Wake-on-LAN não vão funcionar. Desconexão temporárias por alguns segundos acontecem quase sempre devido aos intervalos de lease de DHCP. Acesso remoto é um pesadelo.
  23. Então esse mínimo de recursos está disponível e pago. Se você acha que não deve ou não precisa usar deve considerar o que está perdendo: metade das portas ethernet, uns 40% do wifi, um pouco de redundância, em especial no DHCP...
  24. @Silvia Cassini apenas 4 usuários e esse tipo de aplicativo é um volume de tráfego que deveria ser facilmente atendido por qualquer "plano bom de acesso", algo em torno 200 mbps já deveria ser suficiente. Pode ter algo mal instalado, equipamentos deficientes, erros de instalação de algo, ou tudo isso. É difícil dizer algo além disso sem saber que equipamentos são e como estão ligados. Videos no youtube no geral podem gastar poucos megabits. Um vídeo Full HD no NetFlix pode gastar entre 3 e 6. Um vídeo a 4K não vai além de uns 20/25, isso se tiver muita ação. Uma ligação via voip não vai além de uns 70 megabits. Um DVR de 16 câmeras comuns tem tráfego na casa de 70/80 mbits. Uma chamada via teams não vai passar de 2 mbps, isso se for em 720P. Apenas para assisir uma conferência via zoom algo em torno de 0,6 mbps...
  25. Modo bridge é só isso: bridge, uma ponte. Sua unidade ótica passa a ser apenas um conversor de mídia: recebe a conexão com o provedor via fibra e converte para uma única saída RJ45 em ethernet. Todo o resto fica desabilitado por definição. Não há nada que precise fazer. Acho que mesmo o protocolo de gerenciamento não pode alterar isso, exceto talvez desabilitar o acesso via protocolo de gerenciamento. A menos que seu provedor tenha criado um novo conceito do que é modo bridge, Note que em muitos casos não é esperto fazer isso (usar modo bridge) para um equipamento doméstico. Entenda: uma questão aritmética: a ONU tem um mínimo de recursos Em termos de wifi imagine que ela tenha típicos 1200mbps, tipo 400 mbps em 2.4ghz e 800 mbps em 5ghz. Ao colocar em modo bridge só vai perder isso e deixar todo o tráfego para seu roteador que tem pouco mais de capacidade, 600/1300 mbps para um total de 1900mbps. Ao usar modo bridge você simplesmente perde 39% da capacidade de tráfego de wifi. E claro que aumenta a carga de processamento no seu roteador. E sua ONU inclui um servidor DHCP. uma questão física: não dá pra colocar seu roteador em dois lugares ao mesmo tempo. Isso quer dizer que a cobertura de wifi pode ser muito, mas muito pior mesmo. E em 5Ghz --- que é de longe a melhor opção --- o alcance raramente passa de duas paredes: a sala ao lado ou a próxima... Se usar dois AP em 5GHz, e você já tem dois, pode cobrir muito mais da casa. Se tem uma casa comprida por exemplo, num clássico terreno de 12mx36m faça um desenho e pense nisso: um roteador na frente e um no fundo pode dar cobertura total. Seu único roteador nem no meio da casa vai oferecer 5Ghz na casa toda. outra questão física: essa ONU tem 4 portas ethernet. Como seu roteador. Isso quer dizer que você pode usar 4 portas com a ONU em modo normal. Ou só 3 com o seu ASUS. Ou 6 se mantiver os dois funcionando. Apenas o dobro. outra questão física: ao usar ethernet nos dois pode usar cabos de rede muito mais curtos e passar menos cabos pelos dutos: uma instalação que pode ficar impossível vira trivial. Coisas como levar um cabo para um computador e uma TV perto de cada roteador podem ser um pesadelo se usar um só... Na verdade nem vai poder porque só tem 3 portas ethernet outra questão aritmética: usando servidores DHCP na ONU e no roteador é claro que vai menor latência no DHCP porque vai dividir o processamento entre os dois e assim a tendência é que a latência do serviço DHCP como um todo seja, claro, muito menor e ele conecte mais rápido qualquer dispositivo à rede. E se a ONU parar a rede local continua funcionando, então você tem redundância na rede. Faça as contas...

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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!