Ir ao conteúdo
  • Cadastre-se

vangodp

Membros Plenos
  • Total de itens

    3.550
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

664

Sobre vangodp

  • Data de Nascimento 16-02-1977 (41 anos)

Informações gerais

  • Cidade e Estado
    Málaga/Espanã
  • Sexo
    Masculino
  1. mande o que levar feito para ver
  2. quando você faz fwrite(&p, sizeof(Loja), 1, f1), "Producto *x" é um ponteiro, ou seja, o que se envia para o arquivo é a direção de memoria onde estava alojada essa variavel nesse momento, e não a variavel em si, propriamente dito. As auternativas que você tem seria criar outra estrutura(sem ponteiros) com um vetor de produtos do tamanho de p.quantidade, copiar tudo da outra anterior nessa nova, e enviar ao arquivo. Algo assim: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ char nome[50]; double valor; }Produto; typedef struct{ Produto *x; int quantidade; }Loja; int main(){ Loja p; int i; FILE *f1; f1 = fopen("TESTE.bin", "wb"); printf("\nQuantidade de produtos: 2\n\n"); p.quantidade = 2; p.x = calloc(p.quantidade, sizeof(Produto)); //ler a lista de produtos... //Obviamente vou fazer a mão para evitar perder tempo preenchendo dados por teclado cada vez que for realizar um compilado novo. Faz de conta que é o teclado tip tip tap!!! ;) printf ("Faz de conta que estamos lendo por teclado tip tip tap poin!!!\n\n"); strcpy (p.x[0].nome, "BombrilXD"); p.x[0].valor= 5.0; strcpy (p.x[1].nome, "CocaColaLoL"); p.x[1].valor= 3.0; //Estrutura AUXILIAR. typedef struct _Dados{ Produto lista[p.quantidade]; int quantidade; }Dados; { printf("Enviando dados ao arquivo.\n"); Dados dados; //passamos os dados de p para dados, em outras palavras a intenção é fazer-> dados = p. Só que sabemos que não é tão simples assim né. XD for (i=0; i<p.quantidade;i++ ) { strcpy (dados.lista[i].nome, p.x[i].nome); dados.lista[i].valor = p.x[i].valor; } //agora enviamos "dados" ao arquivo em vez de p que contêm um ponteiro. fwrite(&dados, sizeof(Dados), 1, f1); free(p.x); fclose(f1); printf("Dados enviados.\n\n"); } //Agora vamos resgatar os dados do arquivo e guardar em outra variavel para ver se funcionou printf("Procedemos a ler os dados do arquivo.\n\n"); Dados d; // Essa é a nova variavel que vamos usar f1 = fopen("TESTE.bin", "rb"); printf("Dados Lidos.\n\n"); fread(&d, sizeof(Dados), 1, f1); fclose(f1); printf("Comprovando dados.\n"); for (i=0; i<p.quantidade;i++ ) { printf("Produto %s, Valor %f\n", d.lista[i].nome, d.lista[i].valor); } printf("Eh correto?: "); system("pause"); printf("\nFIM\n"); return 0; } Outra auternativa seria serializar os dados. Inclusive acredito que serializando seria "mais correto". Se você não sabe o que é serializar, quer dizer enviar cada dado da estrutura por separado. #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char nome[50]; double valor; } Produto; typedef struct { Produto *x; int quantidade; } Loja; int main() { Loja p; int i; FILE *f1; f1 = fopen ( "TESTE.bin", "wb" ); //Tecladito.. >_< printf ( "\nQuantidade de produtos: 2\n\n" ); p.quantidade = 2; p.x = calloc ( p.quantidade, sizeof ( Produto ) ); strcpy ( p.x[0].nome, "BombrilXD" ); p.x[0].valor = 5.0; strcpy ( p.x[1].nome, "CocaColaLoL" ); p.x[1].valor = 3.0; //Serializando fwrite(&p.quantidade, sizeof(int), 1, f1); for (i=0;i<p.quantidade ;i++) { fwrite(&p.x[i], sizeof(Produto), 1, f1 ); } free ( p.x ); fclose ( f1 ); return 0; } E para ler, é só fazer o processo inverso... ou seja, ler um int, e 2 produtos, com fread.
  3. Primeiro acredito que essa não seja a função correta. Seria infinitamente melhor usar CreateProcess da biblioteca windows.h Com system você seu programa se detém para executar o segundo programa, e só volta quando o segundo termine. A solução é criar outro processo assim você tem por um lado processo A, que funciona independente de processo B, B seria um processo filho de A, mas são os 2 separados. Para não perder os dados existem muitas estratégias a seguir. Se você seguir o conselho sobre dividir o programa em 2 processos separados, você precisa buscar alguma estratégia de comunicação entre processos. Algumas dessas podem ser pipes, sockets, memória compartilhada, permanência de dados(arquivos), etc, não são as únicas mas são as que tenho constância. acredito que para seu caso você deva procurar algo sobre CeateProcess junto com pipes, mas realmente não sei si lhe estou indicando um caminho correto, espero que outros usuários contribuam na ajuda até tomar uma boa direção. Para ver o que estou falando vou lhe deixar um exemplo de como usar CreateProcess. Mas sem comunicação entre processos. O exemplo a seguir você pode chamar ele de main.c, e o programa a ser executado vou chamar de modulo1, com a ideia de ter mais tarde vários outros módulos(outros programas). Resumindo... O main.c(main.exe) abre o modulo1.c(modulo1.exe) e passa um mensagem, no qual o segundo vai mostrar na tela. Vão ser abertas 2 janelas, mas pode ser aberta uma só se você trocar o parâmetro da função CreateProcess chamado CREATE_NEW_CONSOLE por 0, neste caso abriria 1 só janela. main.c #include<stdio.h> #include <windows.h> int main(){ HWND hWnd; STARTUPINFO sInfo; PROCESS_INFORMATION pInfo; ZeroMemory(&sInfo, sizeof(sInfo)); sInfo.cb = sizeof(sInfo); ZeroMemory(&pInfo, sizeof(pInfo)); char * cmd = ( char* ) "Isso vai receber o modulo1"; if ( CreateProcess( "modulo1.exe", cmd, NULL, NULL, false, CREATE_NEW_CONSOLE, // Trocar por 0 se quiser uma só janela, porém o 1º programa não vai esperar 2º programa, quando o segundo terminar volta automatico ao primeiro. NULL, NULL, &sInfo, &pInfo ) ) { do { printf("Esperando 100 micro segundos...\n"); Sleep(100); } while ((hWnd = FindWindow(NULL, "modulo1.exe")) != NULL); MoveWindow(hWnd, 0, 0, 800, 600, true); CloseHandle(pInfo.hProcess); } return 0; } modulo1.c #include<stdio.h> #include <stdlib.h> int main (int argc, char *argv[]){ printf("Recebido: "); if ( argc > 1 ){ for (int i = 0; i < argc ; i++) { printf("%s ", argv[i]); } printf("\n"); } system("pause"); return 0; } você deve se perguntar como o segundo programa recebeu "Isso vai receber o modulo1". Isso é por causa dos parâmetros de main, mas isso só serve para passar dados na hora que abrir o segundo programa, não estariam se comunicando realmente, pois não teria como passar dados de volta ao primeiro, mas ja é um começo. adicionado 1 minuto depois compile os 2 e deixe ambos na mesma pasta e rode o main.exe e veja a magia acontecer. Prove trocar CREATE_NEW_CONSOLE por 0 para ver o que acontece. adicionado 2 minutos depois Talvez você esteja procurando respostas fáceis, mas realmente sinto muito, não há uma forma "fácil" de se fazer isso.
  4. vangodp

    C Como fazer um labirinto em C??

    Primeiramente acredito que o mapa tenha que ser declarado dentro de main, e logo seja passado para outras funções por parâmetros para coisas como mostrar, alterar etc. você teria funções como mostrar, comprovar colisões etc.
  5. #include <stdio.h> #include <stdlib.h> #define N 10// essa constante comanda o tamanho do meu vetor de pessoas do tipo pessoa typedef struct { // uma struct que guarda dados como nome e idade de uma pessoa char nome[100]; int idade; } TIPO_PESSOA; int menu() { int op = 0; printf ( "\n\n\t\t\t\t\t\t\tMenu principal\n\n\n" ); printf ( "1 - Criar Lista\n\n" ); printf ( "2 - Inserir no inicio\n\n" ); printf ( "3 - Inserir no meio\n\n" ); printf ( "4 - Inserir no final\n\n" ); printf ( "5 - Buscar por posicao\n\n" ); printf ( "6 - Listar os cadastros feitos\n\n" ); printf ( "8 - Sair\n\n\n" ); printf ( "Digite uma opcao: " ); fflush ( stdin ); scanf ( "%d%*c", &op ); return op; } void listar( TIPO_PESSOA *lista, int numeroDeCadastros ){ int i; system ( "cls" ); for (i=0; i<numeroDeCadastros ;i++ ) { printf("Nome: %s Idade: %d\n", lista[i].nome, lista[i].idade ); } system("pause"); } void createList( TIPO_PESSOA **ponteiroaPessoa, int tamanhoDesejadoLista){ *ponteiroaPessoa = malloc(sizeof(TIPO_PESSOA)*tamanhoDesejadoLista); } int main() { system ( "mode con:cols=115 lines=40" ); TIPO_PESSOA *pessoa; int numeroDeCadastrados = 0; int op; do { op = menu(); switch ( op ) { case 1: system ( "cls" ); createList( &pessoa, N); break; case 2: break; case 3: break; case 4: if (numeroDeCadastrados < N ){ system ( "cls" ); printf ( "\n\n\nDigite o nome: " ); scanf ( "%[^\n]%*c", pessoa[numeroDeCadastrados].nome ); //nome ja é um ponteiro entao n precisa de endereço para atribuir printf ( "Digite a idade: " ); scanf ( " %d%*c", &pessoa[numeroDeCadastrados].idade ); // ponto porque é uma variavel normal numeroDeCadastrados++; } break; case 6: listar(pessoa, numeroDeCadastrados); break; default: break; } system ( "cls" ); } while ( op != 8 ); free(pessoa); system ( "pause" ); return 0; } Fiz isso meio que correndo da uma lida aí e o que não entender pergunte.
  6. si compilar ele dinamicamente sim. Procure compilar de forma estática.
  7. abre a pasta do allegro, essa dll deve estar dentro. Normalmente está dentro de uma pasta chamada bin, dentro do diretorio que você instalou o allegro. Pegue a dll junto com o exe que você criou.
  8. Primeiro você deveria dar algumas pistas sobre o que vai fazer... -É 2D ou 3D? -você já está usando uma biblioteca grafica para fazer o jogo? -Faça uns desenhos, mesmo que a lápis e compartilhe aqui se possível.
  9. também pode usar threads, mas é algo complexo de se usar.
  10. você teria 2 valores tipo valorminimo e valormaximo, ambos flotantes, dai é só comparar carro[X].preco com valorminimo, e valormaximo. tipo if ( carro[X].preco > valorminimo && carro[X].preco < valormaximo){imprimir carro[X].preco}. ponha esse if dentro de um for para comparar toda a lista de carros.
  11. Não acredito saber tanto. Não entendo nada de win API só o C/C++ padrão.
  12. eu usei o conio 2.1 que tenho e funcionou perfeitamente. Muito interessante o programa, n 4ao imaginava que podia fazer isso no CMD. Se alguem precisar um tutorial para conio 2.1 aqui ta:https://www.scriptbrasil.com.br/forum/topic/182371-conio2h-não-instala-no-codeblocks-1601/

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×