-
Posts
6.526 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que arfneto postou
-
Nenhuma Para ficar coerente pode declarar int menor_ate_aqui = ?; // e depois if ( num < menor_ate_aqui ) menor_ate_aqui = num; // e no final printf( "maior numero: %d\n", maior_ate_aqui ); Espero que tenha pensado nisso, mas para o menor ou você na primeira leitura salva o num como menor ou começa por um valor arbitrariamente grande, certo? C tem esse cabeçalho "limits.h" que você pode incluir em seu programa junto com os outros include e aí pode usar várias constantes limite, como INT_MAX que é o maior int possível... Se você começar com zero já vai ser o menor, certo? afinal é assim que termina seu programa Use
-
C Printf atribuindo "p" ao início da frase.
arfneto respondeu ao tópico de Leonardo Rocha De Araujo em C/C#/C++
Entendo. eu falava mais especificamente, no contexto dessa discussao: corrupção de memória gravando além da área alocada, como no caso de "rogue pointers" Você pode escrever apps para android em C++ e rodar no sistema nativo, Linux. Bem, muitos acham o contrário. Em especial em sistemas Linux embarcados. E vou explicar porque: inicializar blocos de memória alocados é um serviço do sistema e não da linguagem. Como mostrei antes a documentação descarta isso na linguagem explicitamente. Isso só é feito por segurança, para evitar a injeção de código malicioso durante a alocação de memória. E só acontece se o bloco alocado vier do pool do sistema. Se vier de um recurso liberado pelo processo mas ainda não retornado ao sistema a memória fica como estava. Então você tem que se precaver de qualquer modo. Na verdade nem sei onde esse mecanismo estaria descrito. Nunca me preocupei porque não é 100% confiável. E só se aplica à alocação inicial. Não vai reaproveitar ciclos de memória porque você não pode contar com isso 100%. E não vai aproveitar ciclos de execução pelo mesmo motivo. E ainda vai gastar mais ciclos porque esse serviço não pode ser desabilitado de jeito nenhum. E em muitos casos essa segurança é menos interessante. Ironicamente o caso mais clássico é o do seu exemplo, o de sistemas linux embarcados, onde a oportunidade de injeção de código praticamente não existe e os ciclos gastos com esse serviço podem ser importantes, como em sistemas de "tempo real". Pense nisso. Sistemas embarcados Windows não tem esse problema porque usam uma tecnologia diferente --- DEP data execution protection --- que muitas vezes é assistida por hardware. E é controlável. Não sou especialista nessas coisas, claro. E está um pouco fora do tópico -
O algoritmo já está aí. Quais os tipos de x0 x1 e x2? E f() é definida como?
-
Seu programa encerra quando vem num = 0 Então lá no início declare int maior_ate_aqui = 0; depois de ler cada novo número teste if ( num > maior_ate_aqui ) maior_ate_aqui = num; No final, depois de vir num = 0, você mostra o maior printf( "maior numero: %d\n", maior_ate_aqui ); Assim mesmo que o usuário digite zero já para o primeiro vai funcionar.
-
Qual a diferença entre inserir e ler? Seu programa le um único número. O limite. E mostra os números de um até o limite. Se quer saber o maior valor digitado apenas declare um outro int int maior_ate_aqui = 0; e mantenha atualizado: a cada vez que ler um novo número se for maior que esse você copia o valor para esse. Ao final, quando o usuário teclar zero vai sair do loop e você mostra esse número, que será o maior.
-
C Printf atribuindo "p" ao início da frase.
arfneto respondeu ao tópico de Leonardo Rocha De Araujo em C/C#/C++
Entendo. Mas veja que isso --- um segment fault por exemplo --- em um programa de produção é o melhor que pode acontecer nesses casos. Rodar "perfeitamente" aí sim é o diabo, porque pode corromper memória em algum lugar e dar um erro nada a ver, e só às vezes. Isso foi um dos maiores argumentos para a criação dessas linguagens gerenciadas, com garbage colletor, sem alocação e tal, tipo java e C# e parentes. Tanto faz linux --- que era UNIX --- ou Windows. Ou MACOS que é linux, ou Android que é linux Apenas considere que em algumas situações o Linux inicializa tudo com zero. Sim, zero, exatamente o que faltou na sua string de destino. E vai te dar a falsa impressão de que está tudo ok. Isso nada tem a ver com C ou C++. O standard diz o contrário: você não pode contar com nada a respeito do valor original de variáveis não inicializadas. veja esse saída de um programa que usa a sua função StrCpy() e começa com as strings vazias, e que independe da plataforma: ***** inicio origem(0):[] destino(0): [] ***** muda origem origem(5): [teste] destino(0): [] ***** usa StrCpy para copiar origem(5): [teste] destino(5): [teste] ***** muda origem de novo origem(3): [fim] destino(5): [teste] ***** usa StrCpy para copiar de novo origem(3): [fim] destino(5): [fimte] E o programa #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "string.h" void StrCpy(char*, const char*); int main(int argc, char** argv) { char origem[200]; char* po = origem; char destino[200]; char* pd = destino; printf("***** inicio\n"); memset(origem, 0, 200); // zera origem memset(destino, 0, 200); // e destino printf("origem(%d):[%s]\ndestino(%d): [%s]\n\n", strlen(origem), origem, strlen(destino), destino ); printf("***** muda origem\n"); po = strcpy(po, "teste"); destino[0] = 0; printf("origem(%d): [%s]\ndestino(%d): [%s]\n\n", strlen(origem), origem, strlen(destino), destino ); printf("***** usa StrCpy para copiar\n"); StrCpy(pd, po); printf("origem(%d): [%s]\ndestino(%d): [%s]\n\n", strlen(origem), origem, strlen(destino), destino ); printf("***** muda origem de novo\n"); po = strcpy(po, "fim"); printf("origem(%d): [%s]\ndestino(%d): [%s]\n\n", strlen(origem), origem, strlen(destino), destino ); printf("***** usa StrCpy para copiar de novo\n"); StrCpy(pd, po); printf("origem(%d): [%s]\ndestino(%d): [%s]\n\n", strlen(origem), origem, strlen(destino), destino ); return 0; } // main() void StrCpy(char* str1, const char* str2) { unsigned short cont; for (cont = 0; str2[cont]; cont++) str1[cont] = str2[cont]; }; // StrCpy() Roda "perfeitamente". Sem crash, mas a string de destino era pra ser "fim"e ficou com "fimte". Inofensivo? Nem tanto. E se fosse um checksum ou código de autenticação? Isso porque a segunda string a ser copiada era menor que a primeira. Se fosse maior seria a loteria: se não tiver um null antes do final da área alocada inicialmente --- esses 200 bytes no exemplo --- você vai ter um crash assim que tentar acessar fora dessa região. . . E depois de uma série de operações de cópia não da pra saber o que tem lá, certo? adicionado 6 minutos depois Em tempo, direto do manual -
O caminho mais comum seria, ao invés de mostrar na tela, gravar os tais divisores de cada número em vetores separados e depois comparar um por um. Já vão estar ordenados mesmo, por consequência do mecanismo de divisão. Sabe declarar vetores e coisas assim? Conhece outras linguagens de programação pra gente poder comparar? Ou essa é a primeira?
-
C++ como passar esse programa que está em C++ para a linguagem em C
arfneto respondeu ao tópico de Isabelle Duarte em C/C#/C++
Apenas mude a extensão do arquivo de cpp para c e continue testando. Que compilador está usando? -
C Printf atribuindo "p" ao início da frase.
arfneto respondeu ao tópico de Leonardo Rocha De Araujo em C/C#/C++
O provável porque disso acontecer: mostrar ao aluno como funciona a declaração de strings em C e o uso de vetores e índices. Escrever v2 = strcpy(v2,v1); // nao ensina nada... É como o cara que diz pra você que para limpar a tela em C no Windows você escreve system("cls"); // isso nao e um programa. Apenas uma intermediacao Aqui você usa system() e passa um comando do sistema, como em strcpy() você passa os endereços de origem e destino e a função que alguém escreveu copia os valores e retorna o endereço de destino. Seu programa não "fez" isso de fato. É como alguém que te diz o caminho para um endereço fazendo uma cara de intelectual e explicando como usar o app Waze e entrar com o endereço... E aparentemente vai ser legal você escrever esse programa porque parece que você não conhece a mecânica dessas coisas ainda... scanf("%[^\n]s", v1); // nao funciona assim você pode escrever "%s" ou "%[^\n]". O primeiro caso lê uma string mas vai parar no primeiro whitespace: espaço, tab ou newline. O segundo caso lê qualquer coisa exceto um enter. O 's' perdido ao final tem um significado importante em scanf() e é uma espécie de marcador obrigatório. Não vou explicar muito porquenão tem a ver com o problema aqui. Pergunte de novo se qiser os detalhes. Em resumo esse 's' perdido exigiria que o próximo caracter na entrada fosse exatamente um 's'. E se não for a rotina retorna, sem mexer no resto do que tem pra ler. É muito útil em certos casos, mas nunca no final da máscara, e é um lado mais obscuro e raro de scanf(). Se ficou curioso escreva de novo e de mostro um uso disso. Provavelmente você quer a segunda opção para poder ler uma linha com espaços. E scanf() retorna um int com o número de campos lidos. LEIA o retorno de scanf() SEMPRE Mas se ele digitar algo o programa vai colocar o que o usuário digitou em char v1[100]; uma letra depois da outra. Sugiro usar nomes mais indicativos, como origem e destino. E o sistema vai colocar um terminador, o código 0, o tal null , logo em seguida. Isso vai marcar o final da string e elas são por isso ditas null-terminated O vetor é acessado pelo nome e índice, então se o cara digitou só um 'a'' você vai ter v[0] = 'a'; v[1] = 0; // se o cara digitou so um 'a' . Se o usuário não digitou nada e só teclou ENTER mesmo assim você vai ter uma alteração e v[0] = 0; se o cara digitou enter direto indicando que a string está vazia. Então para copiar basta você copiar tudo de v1 para v2 até encontrar uma posição de v1 com valor zero. Como mesmo que a string esteja vazia você precisa copiar o tal terminador, provavelmente um while() não seja a solução mais simples. Em um loop onde você executa ao menos uma vez um do() é mais esperto. char original[100]; char destino[100]; int i; // ... i = 0; do { destino[i] = original[i]; i = i + 1; } while(original[i] != 0); Mesmo que original esteja vazio você precisa copiar o terminador 0 ou seu programa vai cancelar assim que tentar acessar destino. C não inicializa as variáveis por definição e mesmo que fosse o caso não seria esperto contar com isso: ia funcionar só na primeira vez... @KXSY é preciso copiar o terminador ao final, o \0. O código que postou não faz isso. Veja o trecho abaixo... void StrCpy(char *str1, char *str2) { unsigned short cont; for(cont=0; str2[cont]; cont++) str1[cont]=str2[cont]; } Não vai funcionar. Ao usar str2[cont] como condição no for vai sair ao encontar o null e não vai copiar o próprio e essencial null. Quando a string de origem estiver vazia a de destino vai por exemplo ficar intocada. Talvez fosse melhor usar, como na documentação oficial, nomes significativos como origem, destino ou como nos manuais source e destination para um exemplo num forum de iniciantes. E usar str2[cont] como condição de saída do for implica entender TRÊS coisas ao menos: Em C o último byte da string é sempre zero. O for em C encerra quando o segundo comando avaliar como falso. Nesse caso str2[cont]. Isso seria o mesmo que escrever (str2[cont] == 0) que seria mais legível. Em C zero é falso e não zero é verdadeiro então str2[cont] igual a zero é o que força a saída do loop, e isso acontece então no final da string de origem. Talvez então num forum para iniciantes não seja indicado escrever um código assim, envolvendo essas "sutilezas". E ironicamente não está funcionando exatamente nessa linha. Não me leve a mal por levantar essas aspectos adicionado 18 minutos depois De todo modo, em relação ao resultado estranho na saída, já sabe que a máscara de scanf() está errada. Esse comando while(aux[v1, v2] != '\0') { ... } também -
Entendeu que mesmo assim está errado e frágil, certo? Não perguntou nada. Não, não resuma assim. Não acho sequer que seja um bom caminho para quem está aprendendo. Me dei ao trabalho de até mostrar um programa de teste e discutir o problema, sem mostrar uma suposta solução, claro. Mas como parece que @MATEUS GOMES85 (o autor do tópico) considerou como solução simplesmente trocar o especificador de formato --- que estava errado --- e claramente @Luís Roberto C. da Silva também viu como solução, vou explicar de novo com mais algum detalhe porque isso é mesmo um senso comum. E está errado. Sempre vale a pena ler a documentação, ou não se vai muito longe com essas coisas. Hoje em dia pra programar tem que ler muito Scanf() é uma rotina genial, mas foi escrita para tratar entrada formatada. Está no nome por exemplo: scan formatted Input(). Para ler dados em forma tabular por exemplo, onde cada linha era um "registro" e cada "registro" tinha um certo número de "campos". Essa é a nomenclatura até hoje: tabelas, registros, campos --- tables, records, fields. Pense pro exemplo em arquivos csv e vai entender do que estou falando. scanf() é perfeita para ler arquivos CSV. Ler dados do teclado não é assim algo formatado. Não dá pra imaginar o que o usuário vai digitar. E para usar scanf() --- ou qualquer outra rotina --- você tem que se defender. EXEMPLO Usando a máscara "%f" que você usou O caso da boa esperança: o cara teclou tudo direitinho Um caso menos feliz: Ao rodar esse programa, se o usuário digitar 1.2 3.4 5 logo na primeira linha e enter scanf() vai aceitar os 3 valores e imprimir tudo torto na tela e passar reto pelos outros scanf() sem dar tempo de ler. Zoando toda a tela Outro caso menos feliz: Se o cara teclar um monte de enter e depois um monte de letras e enter o programa vai terminar com a leitura de 0.0 para os 3 valores. E a tela cheia de lixo. scanf() retornou 0 nas 3 vezes, mas seu programa não leu... Um programa de correção automática claro vai pegar isso como erro. Um instrutor sério também. Provavelmente seria o primeiro teste que ele faria: só teclar uma linha em branco e um monte de m$%da. E seu programa já era. E sua nota. Eu não sou seu instrutor nem seu programa corretor mas fica a mensagem. Então Entenda que scanf() retorna um valor por uma razão. Essas rotinas foram escritas inicialmente por programadores lendários como Ken Thompson e D. Ritchie. os caras que escreveram entre outras coisas o Unix e a linguagem C. Use o valor e teste pra ver se leu de fato algo. Eles tinham razão. Entenda que scanf() consome dados até ficar satisfeita com os %isso e %aquilo. e se sobrar alguma coisa ela pode guardar pra usar depois e isso quer dizer alimentar próximos scanf() de um modo que você não tinha imaginado... E seu programa não vai funcionar como você queira... Tem milhões que queixas nos foruns e milhões de programas que cancelam assim. Queixas como "meu programa dá certo mas se eu digitar um espaço..." Eu postei aqui neste forum um exemplo para ler um CPF com scanf() e calcular os DV. Dá para pesquisar no forum pelo conteúdo. E outro com um uso de scanf() para ler entrada formatada de uma tabela de código morse. Podem servir como exemplos adicionais. Uma máscara um pouco mais segura "%f%*[^\n]%1c": Aqui você tem 3 '%' então vai ler 3 campos e a princípio scanf() deveria retornar... 3 Campo 1: "%f" --- o óbvio, vai ler um número, aceitando um ponto decimal e um eventual sinal no início. Campo 2: "%*[^\n]" Esse um pouco mais enjoado. O significado: [abcd] indica que é pra aceitar apenas essas letras: a b c d. Um '^' no início nega tudo e aí quer dizer que o campo aceita qualquer coisa EXCETO essas letras, e assim [ ^abcd] indica que o campo aceita qualquer coisa exceto a b c d. '\n' é o código do enter, 10. Isso quer dizer que [\n] aceita apenas enter. E assim [^\n] aceita qualquer coisa menos o enter. E o asterisco? o asterisco diz que é pra PULAR esse campo. Ou seja e assim o programa se defende de entradas como "1.23 lixo lixo lixo" Campo 3: "%1c": Esse campo lê um único caracter, mas como o campo anterior terminou em um ENTER é claro que esse aqui vai ler um ENTER e podreia ser desprezado também. Então com essa máscara você faz com que scanf() gaste uma linha inteira que começa por um número. E leia o número. E consuma o resto E você espera que scanf() retorne 1 ou 2. Pode retornar um na última linha por causa do fim de arquivo. Se retornar 0 você sabe que algo saiu errado e pode tenatr ler de novo... Sim, são 3 campos mas como tem um '*' no especificador do segundo ele vai ser lido e descartado. De um modo geral se você quer ler um único campo por linha pode escrever "%i%*[^\n]%*1c" e assim scanf() vai agir de acordo e ler seu int e descartar o resto da linha, ou retornar 0.
-
Rede sem acesso a internet, porém a internet está funcionando
arfneto respondeu ao tópico de Daniel Gomes de Lima em Redes e Internet
Então: O Chrome por exemplo sempre funciona O spotify dá erro O Windows reporta não ter acesso a intenet Não tem acesso a 1.1.1.1 Se o chrome por exemplo roda, você poderia testar o webplayer do spotify rodando no chrome em spotify.com? Se o chrome roda então você tem acesso a DNS Se o chrome roda você deveria ter acesso a 1.1.1.1 através de um por exemplo. Como nessa imagem poste o resultado de um ipconfig/all Seu micro tem uma única placa de rede? como está conectado? -
Rede sem acesso a internet, porém a internet está funcionando
arfneto respondeu ao tópico de Daniel Gomes de Lima em Redes e Internet
Não entendi o que quer dizer com isso. O que está funcionando corretamente? a rede local? Tem outros micros na rede? Isso é intermitente? Há muitas variáveis. Usa DHCP? Quando diz que não tem acesso acessa endereços IP fora de sua rede, como 1.1.1.1 ? -
Repetidor wifi com roteador via cabo pegando o ip do roteador principal
arfneto respondeu ao tópico de Wilker Zamboni em Redes e Internet
@roblox_gamer Negativo o que? você simplesmente repetiu o que eu expliquei, mas disse que não concorda? Um repetidor wi-fi --- ou um roteador wifi operando no modo repetidor --- é só isso: repetidor. De wifi. Leia o que você listou: Varredura de rede wireless? é isso. Só isso. Wireless. Wifi. SSID? Canal? Wireless. Só isso. O DHCP não precisa ser fornecido pelo roteador. Nada tem a ver com wifi ou repetidor. Apenas o repetidor não tem essa função, porque ele é só um repetidor de wi-fi. O servidor DHCP pode rodar em qualquer micro da rede. Não precisa rodar em um roteador. O repetidor wi-fi apenas capta clientes wifi. Uma vez conectados à rede ethernet --- aqueles números, 802-11a/b/g/n/a/c/az você sabe --- eles vão enviar pacotes pela rede IP --- são chamados pacotes DHCPDISCOVER --- procurando um servidor DHCP. E o primeiro servidor que responder vai conectar o cliente a uma rede, dessa vez IP, e fornecer endereço ip e máscara de rede. E o endereço de gateway, através do qual o cliente conectado ao repetidor vai acessar redes externas e a internet. Para você entender melhor, coisas que NÃO são copiadas incluem: tabelas de roteamento NAT regras de Firewall regras de entrada, como encaminhamento de portas regras de Qos controle de acesso, lista negra e branca de clientes se for o caso, configuração do servidor DHCP -
Não acho que tenha problemas na compilação do código. Está ok. Mas deve ter recebido uns warnings no momento da compilação. Ou deveria, já que scanf() retorna um int e você não está tratando, como nunca vejo ninguém tratando nos programas que leio nesse forum... E %d é para ler um int e você declarou os 3 campos como float // declaração de scanf() int scanf ( const char * format, ... ); Pois é. Veja o seu comando: scanf("%d\n",&a); Que pretendia com esse "\n" por exemplo? Não é assim que essa função funciona. scanf() é uma função ativa, no sentido em que ela consome entrada. Você precisa consumir o resto da linha. E "%d" é o argumento para ler um int e você declarou a como float... Tem um livro de referência? Um manual ou algo assim? E scanf() consome a entrada de acordo com a máscara. A máscara é o primeiro campo, "%d\n" no seu caso, e não está certo. veja essa saída do programa que vou te mostrar: Digite o maior lado do trapezio: 1.2 scanf() retornou 2. Maior lado A=1.200000, delimitador=10 Digite o menor lado do trapezio: 2.3 scanf() retornou 2. Menor lado B=2.300000, delimitador=10 Digite a altura do trapezio: 3.4 scanf() retornou 2. Altura H=3.400000, delimitador=10 Até funciona mas é frágil ainda. Mas já vai ajudar você a entender a mecânica eu acho Qual a máscara nesse caso? A diferença é que assim vai ler algo a mais depois do número. Se o usuário for legal e teclar só o valor, tipo 1.23 vai estar OK. Note o valor de delim = 10 que é o código do "\n". Se ele não for e dependendo do que ele digitar vai cancelar seu programa... Eis o programa #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" int main() { float a, b, c; char delim; const char* mascara = "%f%c"; int n; printf("\nDigite o maior lado do trapezio: "); n = scanf(mascara, &a, &delim); printf("scanf() retornou %d. Maior lado A=%f, delimitador=%d\n", n, a, delim); printf("\nDigite o menor lado do trapezio: "); n = scanf(mascara, &b, &delim); printf("scanf() retornou %d. Menor lado B=%f, delimitador=%d\n", n, b, delim); printf("\nDigite a altura do trapezio: "); n = scanf(mascara, &c, &delim); printf("scanf() retornou %d. Altura H=%f, delimitador=%d\n", n, c, delim); return 0; } // main()
-
Repetidor wifi com roteador via cabo pegando o ip do roteador principal
arfneto respondeu ao tópico de Wilker Zamboni em Redes e Internet
Não, não vai. Apenas SSID e senha da rede wifi No entanto, como eu expliquei, na prática ele precisa de um endereço na rede e fora do escopo do servidor ou servidores DHCP, para poder ser acessado pelos micros da rede para gerenciamento. As portas LAN desses equipamentos são um switch. Apenas isso. E como tal podem cascateados --- cascading --- e é só isso. É função normal de um switch fazer isso. Eles são "responsáveis" apenas pela comutação --- switching --- de pacotes. As funções desses roteadores atuam entre a porta WAN e LAN e são muitos serviços, não só o serviço de DHCP. Com o uso apenas das portas LAN eles se tornam switches de 4 portas. A bem da verdade você pode rodar o servidor DHCP em um micro da rede, bem como o NAT para se conectar a internet, e ter apenas switches na rede, mas nesses casos usaria algo com mais portas, 16, 25, 48, algo assim. -
Repetidor wifi com roteador via cabo pegando o ip do roteador principal
arfneto respondeu ao tópico de Wilker Zamboni em Redes e Internet
Pode, mas nem sempre é conveniente. É um exemplo. Só que o que eu disse está claro aí: NESSE caso. Porque você precisa acessar o segundo roteador e ele não vai ter DHCP habilitado. Confirme se entendeu. No uso normal nessa configuração apenas o primeiro roteador vai fornecer endereços IP, mas não para os eventuais roteadores adicionais, que vão usar endereços IP DENTRO da rede do primeiro mas FORA da faixa de endereços do servidor DHCP. Isso porque assim você pode acessar qualquer um deles diretamente na rede e não só o primeiro. Não há nada de especial em usar mais servidores DHCP na mesma rede e é conveniente em muitos casos. Apenas não era o caso do tópico aqui adicionado 7 minutos depois 1- Sim. qualquer servidor DHCP na rede poderá responder em um certo tempo. Como só terá um será esse um o cara. Em geral, devido à simplicidade extrema desses roteadores "modernos", deve rodar o servidor DHCP no roteador que tem acesso a internet via porta WAN. Isso porque a maioria desses infelizes não tem mais opção de digitar o IP do gateway padrão e assumem que é o do próprio servidor DHCP. 2- Sim, desse modo sim. 3- Não, não significa. Redes TCP/IP são isso: Um endereço IP e uma máscara de rede. E um gateway padrão. WiFi é outra coisa: via ethernet ou wifi depois de conectado o equipamento vai buscar um servidor DHCP para associar ao seu endereço MAC e ingressar na rede IP -
C++ Problema com o Prompt no codeblock 17.12
arfneto respondeu ao tópico de Max Robert Marinho em C/C#/C++
Dei uma olhada no programa aqui na hora do Provavelmente está havendo corrupção de memória. Não pude ir muito longe com o programa porque meu compilador sequer aceita essas construções, e não posso mudar de ambiente agora. Depois lembrei de que tem uma máquina aqui com esse ambiente, code::Blocks 17:12 (ultima versão, de 2017) e até rodei seu programa. Vou te mostrar o resultado a seguir Antes, uns palpites Seu programa é práticamente um programa C. Não parece haver razão para compilar em C++. C é mais rápido, C++ tem vantagens. Escrever C em C++ não soma nada, só fica potencialmente mais lento Construções como essa do trecho abaixo são complicadas. Não vejo isso nunca em programas de produção. Use malloc()/free() ou new()/delete para laocar memória do jeito oficial. Por alguma razão isso nunca chegou ao padrão da linguagem, certo? Só vejo isso em programas de estudantes. Fuja disso. fscanf(arq1, "%d", &barras); fscanf(arq1, "%d", &ramos); fscanf(arq1, "%d", &subst); fscanf(arq1, "%f", &v_init_real); v_init_imag = 0.0; fscanf(arq1, "%f", &v_base); fscanf(arq1, "%f", &p_base); fscanf(arq1, "%f", &lim); //Solução corrente, cada solução vizinha por iteração, melhor solução encontrada na vizinhança struct Node N[ramos], N_aux[ramos], N_best[ramos], N_worst[ramos], N_top[ramos]; Para ficar bem claro, estou falando dessa construção: fscanf(arq1, "%d", &ramos); struct Node N[ramos]; Isso não existe na prática. Não está no padrão. Não se vê isso em programas de produção. Em C Use malloc()/free() e fuja do realloc() Em C++ use new()/delete/delete[] Entenda também que toda a família scanf() retorna um int por um motivo e se acostume a testar isso, porque é melhor pra você. E não é má ideia também mostrar na saída de imediato todos os valores lidos. sancf() trabalha com ponteiros e se você errar em algo pode zoar seu programa inteiro e levar a comportamentos bizarros... Mudei seu programa aqui if( argc < 2) return -1; op = atoi(argv[1]); switch(op) { case 1: printf("\n***** op 1 - Formato de Porcentagem.\n"); break; case 2: printf("\n***** 2 - Formato Comumgem.\n"); break; default: return -2; // so aceita 1 ou 2 }; // switch() // while((op!=1)&&(op!=2)){ // system("cls"); // printf("\nEscolha a forma de tratamento para a Impedancia Base - Z_base."); // printf("\n1 - Formato de Porcentagem."); // printf("\n2 - Formato comum."); // printf("\n\nDigite sua opcao: "); // scanf("%d",&op); // } Para que? Troquei aquele while() chato para poder testar na linha de comando e gravar a saida. É muito chato ter que limpar a tela e mostrar um menu só para ler duas opções. Lembre do que te falei ontem e veja essa tela. E eu não posso ficar mostrando a tela pra ninguém... Se seu programa for C14.exe você pode rodar C14 1 ou C14 2 e ter o mesmo resultado... Mas aí você pode rodar assim como te expliquei, simples, na janela do terminal, e ter a saída gravada em out1.txt e out2.txt para as duas opções. E não perder tempo. Eis o out1.txt por exemplo Pressione qualquer tecla para continuar. . . Pressione qualquer tecla para continuar. . . ***** op 1 - Formato de Porcentagem. GRASP solucao 1. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 GRASP solucao 2. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 GRASP solucao 3. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 GRASP solucao 4. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 GRASP solucao 5. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 GRASP solucao 6. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 GRASP solucao 7. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 GRASP solucao 8. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 GRASP solucao 9. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 GRASP solucao 10. Ramos fechados: (6) (7) (15) Media FC: 5086.876953 Tempo de execucao da Solução Inicial: 3 ms<14<4<2<1>><3<7>>><9<8<5>>><13<11<10>><12<6>>>> Solucao Inicial !!! Ramos Desligados: (6) (7) (15) Perdas Ativas da Sol. Inicial: 466.126855 Perdas Reativas da Sol. Inicial: 544.899469 Media de fluxo de carga da solucao inicial: 5086.876803 Perdas Ativas antes de piorar a solucao: 466.126855 Perdas Reativas antes de piorar a solucao: 544.899469 Break: 1 --- Media de fluxo: 5086.876803 Ramos desligados: (6) (7) (15) Piorando a solucao. Break: 1 --- Pior Perda Ativa: 483.868923 Break: 1 --- Perda Reativa: 563.196931 Break: 1 --- Media de fluxo: 5043.224159 Ramos desligados: (6) (13) (15) ENTROU NO BREAK em bt_cont = 3 Tempo de execucao da BT - Procedimento 1: 1 ms Tempo de execucao da BT - Procedimento 2: 8 ms Tempo de execucao da BT: 9 ms Perdas Ativas da Sol. Final: 466.126855 Perdas Reativas da Sol. Final: 544.899469 Break: 3 --- Media de fluxo: 5086.876803 Ramos deligados: (6) (7) (15) Partindo para PR!!!!!! Total de solucoes geradas no PR_1: 0! Tempo de execucao do PR: 1 ms Tempo de execucao TOTAL: 3149 ms Perdas Ativas da Sol. Final: 466.126855 Perdas Reativas da Sol. Final: 544.899469 Ramos Desligados: (6) (7) (15) programas interativos são um porre, em especial em programas de cálculo. Não faz sentido ficar esperando um enter ou uma opção numa simulação que pode levar minutos ou horas ou dias.... Pense nisso. Conclusão Não sei o que dizer além disso. Em meu modesto computador de teste rodou. Os resultados para as opções 1 e 2 estão aqui para ver ou para baixar em sua máquina. -
C++ Problema com o Prompt no codeblock 17.12
arfneto respondeu ao tópico de Max Robert Marinho em C/C#/C++
Então nada tem a ver om o IDE, certo? Ou com a janela de prompt. "Tudo isso" seria apenas digitar o nome do programa e teclar ENTER ao invés de abrir o tal IDE, carregar o programa e compilar de novo para gerar o executável de novo e então rodar o programa? talvez possa postar um desses programas pra gente ver -
Há tempos que não escrevo esas coisas, mas é quase o mesmo em Windows e UNIX/Linux eu acho. Ou era ao menos Os headers estão em <sys/socket.h> e <netinet/in.h> eu acho. O resumo do que você quer é mandar um pacote tipo ECHO. Não foi você que escreveu esse programa, certo? Aqui em seu programa pICMPHeader->bType = 8; pICMPHeader->bCode = 0; é onde define o que vai fazer. Basicamente você cria uma estrutura socket e preenche definindo para o pacote o protocolo ICM, o tipo 8 --- ECHO --- e deixa o codigo como 0. Coloca o endereço do destinatário e envia. Se o destino estiver configurado para responder a esses pacotes ele devolve igualzinho, um... eco.
-
C++ Problema com o Prompt no codeblock 17.12
arfneto respondeu ao tópico de Max Robert Marinho em C/C#/C++
Não precisa. Apenas faça o que eu disse: se o IDe está dando problemas apenas use control-f9 e gere o novo programa e rode no terminal Se precisa mudar as técnicas e não os dados talvez fosse mais produtivo ter um programa para cada técnica já pronto, lendo os dados do disco e gravando o resultado e os tempos em arquivo e assim comparando depois. De todo modo, para programas como os seus provavelmente o Terminal do Windows é só uma tela, só que mais funções e muito mais rápido e compatível. Se o seu programa fosse dd.exe na pasta por exemplo M:\Public\SW você iria no terminal e M: cd \public\sw .\dd Só isso. Exemplo adicionado 4 minutos depois O codeblocks é só um IDE. Ele vai usar o compilador para gerar um arquivo executável a partir do seu programa. Só isso. Aí você pode pegar esse programa, gravar em um pen-drive e rodar em qualquer outro lugar por exemplo. Eu nada disse sobre configurar o codeblocks. Se o seu programa de fato mudou devido ao modo que escolheu para construir seu sistema de comparações, apenas abra o programa no editor, use control-f9 para gerar novo exe. abra o terminal em outra janela e rode seu programa EXE. Depois que conseguir seu resultado alguém pode te ajudar a restaurar o codeblocks com mais tempo -
C++ Problema com o Prompt no codeblock 17.12
arfneto respondeu ao tópico de Max Robert Marinho em C/C#/C++
Então... Os dados não são o programa. se o programa é o mesmo na pasta de saída está o executável, criado na última vez em que você rodou Build, Run ou Build And Run no IDE. Não precisa do IDE ou do compilador para rodar o mesmo programa. Apenas rode o programa Eu tinha me prometido nunca fazer isso mas um dia desses instalei esse ambiente em meu computador. Usei uma única vez porque tinha ficado curioso com algo de que não me lembro, e a experiência não foi nada boa. Nunca mais usei. Mas vi agora que é a mesma versão e o mesmo sistema e tal. E então posso ver aqui também. Se mudou algo no programa ou se os dados estão dentro do programa... basta usar control-F9 e ele vai gerar um novo prgrama executável pra você. Na mesma pasta onde está o cpp. E você pode rodar isso em qualquer janela do Windows. Basta digitar o nome do programa e teclar ENTER. Como está usando Windows 10 e o compilador gcc pode usar o novo terminal do Windows, que você pode instalar da loja com um click e é muito melhor e mais rápido que as outras janelas, como o PowerShell e o CMD além de usar o jeito Unix/Linux da console --- não precisa mais desses system() por exemplo --- e de usar aceleráção via GPU para a tela... Veja mais informações no link no seu terminal mesmo em "novos recursos do console" ou aqui https://www.microsoft.com/pt-br/p/windows-terminal-preview/9n0dx20hk701?activetab=pivot:overviewtab -
C++ Problema com o Prompt no codeblock 17.12
arfneto respondeu ao tópico de Max Robert Marinho em C/C#/C++
Isso eu não entendi. Se vai rodar os mesmos programas porque precisa desse CodeBlocks? Que versão usa? Em que sistema? Com que compilador? -
Pensando um pouco sobre a tal fórmula mágica na hora do lanche Os tais quadrados mágicos tem sempre N*N números. 3x3 tem 9, 4x4 16, 6x6 36 e tal. Lembrando do ensino fundamental, é uma progressão aritmética de razão 1 --- tipo 1,2,3,4,5,6 --- e a soma da PA é (a[1] + a[n])*n)/2 --- nesse exemplo ((1+6)* 6) / 2 = 21 se a soma de M termos da PA é (a[1]+a[M]) * M / 2 e M = N*N então a soma dos termos será (a[1]+a[(N*N)]) * (N*N) / 2. E a[1] é claro igual a 1, o primeiro termo sempre E a[N*N] = (N*N) porque a = i, eles são todos numerados de 1 em 1 claro Então a soma de todos os termos da matriz é (1 + (N*N)) * (N*N) / 2 Mas o quadrado é mágico então todas as N linhas tem a mesma soma --- óbvio --- e assim a soma de qualquer linha ou coluna será (1 + (N*N)) * (N*N) / 2N (Dividindo a soma da linha de cima por N linhas) E isso claro diz que a constante não tão mágica agora K = (1+ (N*N)) * N / 2
-
A definição popular de quadrado mágico é bem mais ampla: os números no quadrado 6x6 são os inteiros de 1 a 36, e então claro que não há repetição: cada número aparece uma única vez. Em uma definição mais ampla, num quadrado de largura N os númeris vão de 1 a N*N A soma desses valores é uma tal "constante mágica" e vale (n * ( n*n + 1 )) / 2 n = 3, soma = 15 n = 4 soma = 34 n = 6 soma = 111 por exemplo É disso que estamos falando? Tem um enunciado mais preciso? Exemplo 3x3 se for essa a definição: 8 1 6 3 5 7 4 9 2 adicionado 2 minutos depois Tem muitas discussões e programas online sobre isso. Por exemplo em http://www.1728.org/magicsq1.htm tem uma discussão dos 3 casos possíveis. Vi agora. No entanto nada vi sobre a fórmula mágica
-
Está usando uma definição muito antiga da linguagem. Isso é o que a mensagem está dizendo. Sugiro sempre usar um compilador moderno e ajustado para uma versão moderna da linguagem, como essa opção aí -std=gnu11, ou std=gnu14, ou std=gnu17 para usar as versões de C++ relativas ao padrão desses anos, 2011, 2014, 2017... A linguagem vem sempre evoluindo e não há razão para usar versões antigas. Ainda mais com compiladores grátis e de qualidade disponíveis para vários ambientes.
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