Jump to content
Leudassdf

[Resolvido] Erro. Alguém ajuda? programa crash num ciclo for com mais de 30000 interaçoes

Recommended Posts

Leudassdf

Boas pessoal,

EU fiz um programa de forma a calcular todas as combinações do euromilhoes.

No entanto quando o executo ele deixa de responder. No entanto isto só acontece se o ciclo tiver mais de 30000 interações.

Alguém me pode dizer o que está a suceder aqui?

#ifndef CALCULAR_GUARDAR_RAM_H_INCLUDED
#define CALCULAR_GUARDAR_RAM_H_INCLUDED
void proximasCombinacoes(short *ptrn1, short *ptrn2,short *ptrn3, short *ptrn4,short *ptrn5, short *ptre1,short *ptre2,short nInteracoes){
short tempn1=ptrn1[nInteracoes-1],tempn2=ptrn2[nInteracoes-1],tempn3=ptrn3[nInteracoes-1],tempn4=ptrn4[nInteracoes-1],tempn5=ptrn5[nInteracoes-1],tempe1=ptre1[nInteracoes-1],tempe2=ptre2[nInteracoes-1];
if((tempe2 = 11) && (tempe1 != 10)){
	tempe1++;
	tempe2=tempe1+1;
}else if(tempe2 < 11){
	tempe2++;
}else if ((tempe1 == 10) &&  (tempe2 == 11) && (tempn5 < 50)){
	tempn5 ++;
	tempe1=1;
	tempe2=2;
}else if ((tempn5 == 50) && (tempn4 < 49)){
	tempn4++;
	tempn5 = tempn4+1;
	tempe1=1;
	tempe2=2;
}else if ((tempn4 == 49) && (tempn3 < 48)){
	tempn3 ++;
	tempn4=  tempn3+1;
	tempn5 = tempn4+1;
	tempe1 = 1;
	tempe2 = 2;
}else if  ((tempn3 == 48) &&  (tempn1 < 47)){
	 tempn1 ++;
	 tempn3  =  tempn1 +1;
	 tempn4  =  tempn3 ;
	 tempn5  =  tempn4 +1;
	 tempe1  = 1;
	 tempn1  = 2;
}else if  ((tempn1  == 47) &&  (tempn1  < 46)){
	 tempn1  ++;
	 tempn1  = tempn1 +1;
	 tempn3  =tempn1 +1;
	 tempn4  = tempn3 +1;
	 tempn5  = tempn4 ;
	 tempe1  = 1;
	 tempe2  = 2;
}
ptrn1[nInteracoes]=tempn1; ptrn2[nInteracoes]=tempn2; ptrn3[nInteracoes]=tempn3; ptrn4[nInteracoes]=tempn4;
ptrn5[nInteracoes]=tempn5; ptre1[nInteracoes]=tempe1; ptre2[nInteracoes]=tempe2;
//printf("%d %d %d %d %d %d %d",tempn1,tempn2,tempn3,tempn4,tempn5,tempe1,tempe2);
 }
void CalcularTodasCombinacoes_RAM(){
short *n1=malloc(116532800),*n2=malloc(116532800),*n3=malloc(116532800),*n4=malloc(116532800),*n5=malloc(116532800),*e1=malloc(116532800),*e2=malloc(116532800);
const int nCombinacoes=116532800;
printf("Aguarde enquanto sao efetuados os calculos necessarios. Este processo pode demorar algum tempo.");
n1[0]=1;n2[0]=2;n3[0]=3;n4[0]=4;n5[0]=5;e1[0]=1;e2[0]=2;
int i=1;
//116532800
for(i=1;i<nCombinacoes;i++){
proximasCombinacoes(n1,n2,n3,n4,n5,e1,e2,i);
}
int nInteracoes=i-1 ;
//printf("%d %d %d %d %d %d %d",n1[nInteracoes],n2[nInteracoes],n3[nInteracoes],n4[nInteracoes],n5[nInteracoes],e1[nInteracoes],e2[nInteracoes]);
printf("%d %d %d %d %d %d %d",n1[nInteracoes],n2[nInteracoes],n3[nInteracoes],n4[nInteracoes],n5[nInteracoes],e1[nInteracoes],e2[nInteracoes]);
}

#endif // CALCULAR_GUARDAR_RAM_H_INCLUDED

Edited by Leudassdf

Share this post


Link to post
Share on other sites
cfmm

Antes de mais em todas as comparacoes, para comparar se as variaveis sao iguais nao e =(atribuicao) mas sim ==(comparacao)...

Depois

short *n1=malloc(116532800),*n2=malloc(116532800),*n3=malloc(116532800),*n4=malloc(116532800),*n5=malloc(116532800),*e1=malloc(116532800),*e2=malloc(116532800);

pensa bem no que estas a fayer com isto, achas que vale a pena fazeres isto?

nao sera melhor assim...

short *i=(short*)malloc(7*sizeof(short));

Edited by cfmm

Share this post


Link to post
Share on other sites
Leudassdf

Antes de mais em todas as comparacoes, para comparar se as variaveis sao iguais nao e =(atribuicao) mas sim ==(comparacao)...

Depois

short *n1=malloc(116532800),*n2=malloc(116532800),*n3=malloc(116532800),*n4=malloc(116532800),*n5=malloc(116532800),*e1=malloc(116532800),*e2=malloc(116532800);

pensa bem no que estas a fayer com isto, achas que vale a pena fazeres isto?

nao sera melhor assim...

short *i=(short*)malloc(7*sizeof(short));

Pois em relação as comparações enganei-me.

No entanto quanto a segunda questão por uma questão de facilidade acho que não há problema em ficar assim.

Mesmo com as alterações aos "==" não resolveu o problema

Edited by Leudassdf

Share this post


Link to post
Share on other sites
Leudassdf

Resolvido,. O problema é que eu na função proximasCombinaçoes declarei o nInteracoes com short e devia ser um int. como o valor era muito grande para o short dáva-me erro...

Share this post


Link to post
Share on other sites
thoga31

Não quero ser picuinhas nem nada, mas acho importante esclarecer um erro simples mas importante em programação.

Por mais de uma vez, @Leudassdf, disseste interacção. Estamos a falar de iterações, sem "n". ;)

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
cfmm

Pois em relação as comparações enganei-me.

No entanto quanto a segunda questão por uma questão de facilidade acho que não há problema em ficar assim.

Mesmo com as alterações aos "==" não resolveu o problema

Mas assim o que tu estas a fazer e alocar 116532800 bytes para guardar short... Assim estas a criar 7 apontadores com esse espaco...

O mais correcto e criares um apontador que aloque espaco para 7 shorts, como eu exemplifiquei.

Eu sei estava a corrigir e a aconselhar te :)

Resolvido,. O problema é que eu na função proximasCombinaçoes declarei o nInteracoes com short e devia ser um int. como o valor era muito grande para o short dáva-me erro...

Era provavel que fosse um erro assim, se ele estava a funcionar

Share this post


Link to post
Share on other sites
HappyHippyHippo

razão para que este exercíco não faz sentido sequer pensar em tentar executar

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Solucao {
 char num[5];
 char est[2];
};

unsigned long long fact_ex(unsigned long long n, unsigned long long m) { return n <= m ? m : n * fact_ex(n - 1, m); }
#define fact(n) (fact_ex((n), 1))
#define comb(n, s) (fact_ex((n), (n) - (s)) / fact(s))

#define n_euro_sol() (comb(50, 5) * comb(12, 2))

int main(void) {
 unsigned long long n_sol = n_euro_sol();

 printf("Numero solucoes do euro milhoes : %llu\n", n_sol);
 printf("Bytes necessarios para guardar todas as combinacoes do euromilhoes : %llu Bytes\n", n_sol * (sizeof(struct Solucao)));
 printf("MBytes necessarios para guardar todas as combinacoes do euromilhoes : %llu MB\n", (n_sol * (sizeof(struct Solucao)) / 1048576));
 printf("GBytes necessarios para guardar todas as combinacoes do euromilhoes : %llu GB\n", (n_sol * (sizeof(struct Solucao)) / 1073741824));

 return 0;
}

Numero solucoes do euro milhoes : 62927172000
Bytes necessarios para guardar todas as combinacoes do euromilhoes : 440490204000 Bytes
MBytes necessarios para guardar todas as combinacoes do euromilhoes : 420084 MB
GBytes necessarios para guardar todas as combinacoes do euromilhoes : 410 GB


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Leudassdf

razão para que este exercíco não faz sentido sequer pensar em tentar executar

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Solucao {
 char num[5];
 char est[2];
};

unsigned long long fact_ex(unsigned long long n, unsigned long long m) { return n <= m ? m : n * fact_ex(n - 1, m); }
#define fact(n) (fact_ex((n), 1))
#define comb(n, s) (fact_ex((n), (n) - (s)) / fact(s))

#define n_euro_sol() (comb(50, 5) * comb(12, 2))

int main(void) {
 unsigned long long n_sol = n_euro_sol();

 printf("Numero solucoes do euro milhoes : %llu\n", n_sol);
 printf("Bytes necessarios para guardar todas as combinacoes do euromilhoes : %llu Bytes\n", n_sol * (sizeof(struct Solucao)));
 printf("MBytes necessarios para guardar todas as combinacoes do euromilhoes : %llu MB\n", (n_sol * (sizeof(struct Solucao)) / 1048576));
 printf("GBytes necessarios para guardar todas as combinacoes do euromilhoes : %llu GB\n", (n_sol * (sizeof(struct Solucao)) / 1073741824));

 return 0;
}

Numero solucoes do euro milhoes : 62927172000
Bytes necessarios para guardar todas as combinacoes do euromilhoes : 440490204000 Bytes
MBytes necessarios para guardar todas as combinacoes do euromilhoes : 420084 MB
GBytes necessários para guardar todas as combinações do euromilhoes : 410 GB

Cumprimentos

Leandro

não percebi o que quises-te transmitir. No entanto eu já fiz o meu programa.

São 116531800 combinaçoes do euromilhoes. Não sei onde foste buscar 62927172000.

Quanto ao tamanho que ocupo na memoria ram é de cerca de 1.20GB. É alguma coisa mas nada parecido com os teus 410GB

Share this post


Link to post
Share on other sites
HappyHippyHippo

São 116531800 combinaçoes do euromilhoes. Não sei onde foste buscar 62927172000.

sim, tenho um erro no calculo mas é porque fiz para 12 estrela e não 11, além de um segundo no cálculo da combinação

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Solucao {
 char num[5];
 char est[2];
};

unsigned long long fact_ex(unsigned long long n, unsigned long long m) { return n <= m ? m : n * fact_ex(n - 1, m); }
#define fact(n) (fact_ex((n), 1))
#define comb(n, s) (fact_ex((n), (n) - (s) + 1) / fact(s))

#define n_euro_sol() (comb(50, 5) * comb(11, 2))

int main(void) {
 unsigned long long n_sol = n_euro_sol();

 printf("Numero solucoes do euro milhoes : %llu\n", n_sol);
 printf("Bytes necessarios para guardar todas as combinacoes do euromilhoes : %llu Bytes\n", n_sol * (sizeof(struct Solucao)));
 printf("MBytes necessarios para guardar todas as combinacoes do euromilhoes : %llu MB\n", (n_sol * (sizeof(struct Solucao)) / 1048576));
 printf("GBytes necessarios para guardar todas as combinacoes do euromilhoes : %llu GB\n", (n_sol * (sizeof(struct Solucao)) / 1073741824));

 return 0;
}

Numero solucoes do euro milhoes : 116531800
Bytes necessarios para guardar todas as combinacoes do euromilhoes : 815722600 Bytes
MBytes necessarios para guardar todas as combinacoes do euromilhoes : 777 MB
GBytes necessarios para guardar todas as combinacoes do euromilhoes : 0 GB

mesmo sendo um número ainda menor que os teus 1.2 GB, achas que é boa ideia executar uma aplicação que ocupa essa quantidade de memória ???

--------------------

ps : aqui fica então o código para preencher um array com todas as combinações do euromilhões:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

struct Solucao {
 char num[5];
 char est[2];
};

#define N_NUMEROS      50
#define N_ESTRELAS     11
#define N_NUMEROS_SOL  5
#define N_ESTRELAS_SOL 2

unsigned long long fact_ex(unsigned long long n, unsigned long long m) { return n <= m ? m : n * fact_ex(n - 1, m); }
#define fact(n) (fact_ex((n), 1))
#define comb(n, s) (fact_ex((n), (n) - (s) + 1) / fact(s))

#define n_euro_sol() (comb(N_NUMEROS, N_NUMEROS_SOL) * comb(N_ESTRELAS, N_ESTRELAS_SOL))

int main(void) {
 unsigned long long n_sol = n_euro_sol();
 unsigned long long n1, n2, n3, n4, n5, e1, e2, i, etime;
 struct Solucao * sols = NULL;
 struct timespec time_start, time_end;

 printf("Numero solucoes do euro milhoes : %llu\n", n_sol);
 printf("Bytes necessarios para guardar todas as combinacoes do euromilhoes : %llu Bytes\n", n_sol * (sizeof(struct Solucao)));
 printf("MBytes necessarios para guardar todas as combinacoes do euromilhoes : %llu MB\n", (n_sol * (sizeof(struct Solucao)) / 1048576));
 printf("GBytes necessarios para guardar todas as combinacoes do euromilhoes : %llu GB\n", (n_sol * (sizeof(struct Solucao)) / 1073741824));
 printf("\n");
 printf("calculating ...\n");

 if ((sols = malloc(n_sol * (sizeof(struct Solucao)))) == NULL) {
   printf("no memory ...\n");
   return -1;
 }

 clock_gettime(CLOCK_REALTIME, &time_start);

 i = 0;
 for (n1 = 1; n1 <= N_NUMEROS - N_NUMEROS_SOL + 1; n1++) {
   for (n2 = n1 + 1; n2 <= N_NUMEROS - N_NUMEROS_SOL + 2; n2++) {
     for (n3 = n2 + 1; n3 <= N_NUMEROS - N_NUMEROS_SOL + 3; n3++) {
       for (n4 = n3 + 1; n4 <= N_NUMEROS - N_NUMEROS_SOL + 4; n4++) {
         for (n5 = n4 + 1; n5 <= N_NUMEROS - N_NUMEROS_SOL + 5; n5++) {
           for (e1 = 1; e1 <= N_ESTRELAS - N_ESTRELAS_SOL + 1; e1++) {
             for (e2 = e1 + 1; e2 <= N_ESTRELAS - N_ESTRELAS_SOL + 2; e2++) {
               sols[i].num[0] = n1;
               sols[i].num[1] = n2;
               sols[i].num[2] = n3;
               sols[i].num[3] = n4;
               sols[i].num[4] = n5;
               sols[i].est[0] = e1;
               sols[i].est[1] = e2;

               i++;
             }
           }
         }
       }
     }
   }
 }

 clock_gettime(CLOCK_REALTIME, &time_end);

 etime = time_end.tv_nsec + time_end.tv_sec * 1000000000 - (time_start.tv_nsec + time_start.tv_sec * 1000000000);
 printf("elapsed time : %llu ns (%llu s)\n", etime, etime / 1000000000);

 free(sols);

 return 0;
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Leudassdf

mesmo sendo um número ainda menor que os teus 1.2 GB, achas que é boa ideia executar uma aplicação que ocupa essa quantidade de memória ???

Não faz sentido. apenas fiz por curiosidade.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.