Hola Ali:<div><br></div><div>Te comento:</div><div><br></div><div>Para generar una matriz de enteros es suficiente con generar una secuencia de enteros que luego trataremos como una matriz; por eso es suficiente con generar</div>
<div><br></div><div><br></div><div><b>m = (int *) malloc(nF*nC*sizeof(int)); </b></div><div><b><br></b></div><div>después que tenemos el espacio de memoria, lo utilizamos como si fuera una matriz de nC columnas; es decir:</div>
<div><br></div><div><b> combinaciones((void *) m); </b></div><div><b><br></b></div><div>el prototipo de combinaciones es:</div><div><br></div><div><b>void combinaciones(int mat[][nC]);</b></div><div><br></div><div>Observa que no es necesario poner el número de filas, aunque podrías ponerlo sin problemas.</div>
<div><br></div><div>En mi máquina (intel core i5) los cálculos son rapidísimos, tanto la generación de la memoria como la obtención de las combinaciones.</div><div><br></div><div>Luego, si quieres comprobar los valores puedes hacerlo con la función:</div>
<div><br></div><div><b>mostrar((void *)m); </b></div><div><br></div><div>pero, esto si que tarda bastante tiempo.</div><div><br></div><div>Por supuesto, no está de más comprobar que la asignación de memoria ha sido correcta (tal como te comenta Salvador Pozo.</div>
<div><br></div><div>A mi me funciona aparentemente bien (no he analizado detenidamente los resultados)</div><div><br></div><div>A continuación te copio todo el programa con los prototipos y las declaraciones de funciones.</div>
<div><br></div><div><div>#include <stdio.h></div><div>#include <stdlib.h></div><div><br></div><div><br></div><div>/*Programa que calcula las combinaciones de 25 numeros tomados de 6 en 6 y el resultado lo expresa en forma de una matriz 177000x6 dinamica*/</div>
<div><br></div><div><br></div><div>#define nF 177100 // Número de filas</div><div>#define nC 6 // Número de columnas</div><div><br></div><div>void set0(int mat[][nC]);</div><div>void setnf(int mat[][nC]);</div><div>
void mostrar(int mat[][nC]);</div><div>void combinaciones(int mat[][nC]);</div><div><br></div><div><br></div><div>void set0(int mat[][nC])</div><div>{</div><div> // inicia a ceros la matriz</div><div> int f, c;</div>
<div> </div><div> for (f=0; f<nF; f++)</div><div> {</div><div> for (c=0; c<nC; c++)</div><div> mat[f][c]=0;</div><div> }</div><div>}</div><div><br></div><div>void setnf(int mat[][nC])</div>
<div>{</div><div> // inicia en la primera posición de cada fila el número de fila</div><div> int f, c;</div><div> </div><div> for (f=0; f<nF; f++)</div><div> {</div><div> mat[f][0]= f;</div><div> for (c=1; c<nC; c++)</div>
<div> mat[f][c]=0;</div><div> }</div><div>}</div><div>void mostrar(int mat[][nC])</div><div>{</div><div> int f, c;</div><div> </div><div> for (f=0; f<nF; f++)</div><div> {</div><div> for (c=0; c<nC; c++)</div>
<div> printf(" %d ", mat[f][c]);</div><div> printf("\n");</div><div> }</div><div>}</div><div><br></div><div>void combinaciones(int mat[][nC])</div><div>{</div><div> int f, c, i1, i2, i3, i4, i5, i6;</div>
<div> </div><div> f = 0;</div><div><br></div><div> for (i1 = 1; i1 <= 25; i1++)</div><div> {</div><div> for (i2 = i1 + 1; i2 <= 25; i2++)</div><div> {</div><div> for (i3 = i2 + 1; i3 <= 25; i3++)</div>
<div> {</div><div> for (i4 = i3 + 1; i4 <= 25; i4++)</div><div> {</div><div> for(i5 = i4 + 1; i5 <= 25; i5++)</div><div> {</div><div> for (i6 = i5 + 1; i6 <= 25; i6++)</div>
<div> {</div><div> if ((i1 != i2) && (i1 != i3) && (i1 != i4) &&</div><div> (i1 != i5) && (i1 != i6) && (i2 != i3) &&</div>
<div> (i2 != i4) && (i2 != i5) && (i2 != i6) &&</div><div> (i3 != i4) && (i3 != i5) && (i3 != i6)&&</div><div> (i4 != i5) && (i4 != i6) && (i5 != i6))</div>
<div> {</div><div> c = 0;</div><div> mat[f][c] = i1;</div><div> c = c + 1;</div><div> mat[f][c] = i2;</div>
<div> c = c + 1;</div><div> mat[f][c] = i3;</div><div> c = c + 1;</div><div> mat[f][c] = i4;</div>
<div> c = c +1;</div><div> mat[f][c] = i5;</div><div> c = c + 1;</div><div> mat[f][c] = i6;</div>
<div> f = f + 1;</div><div> }</div><div> }</div><div> }</div><div> }</div><div> }</div><div> }</div>
<div> }</div><div><br></div><div>}</div><div>int main(void)</div><div><br></div><div>{</div><div> </div><div> int *m = NULL;</div><div> </div><div> // reserva dinámica de memoria para la matriz</div><div> </div>
<div> m = (int *) malloc(nF*nC*sizeof(int)); </div><div><br></div><div> </div><div><br></div><div> // set0((int **)m); // establecer la matriz a ceros</div><div><br></div><div> // setnf((void *)m); // establecer el número de fila</div>
<div> </div><div> </div><div> // system("time");</div><div> combinaciones((void *) m); // cálculo de las combinaciones (aprox 1 seg)</div><div> // system("time");</div><div> // system("pause");</div>
<div> </div><div> mostrar((void *)m); // mostrar matriz, tarda bastante, sólo para test</div><div> system("time");</div><div> </div><div> /*Liberacion de memoria*/</div><div> free(m);</div><div>
<br></div><div> return 0;</div><div>}</div><div><br></div><div><br></div><div>Saludos</div><div><br></div><div>José Luis</div><div><br></div><div><br></div><div class="gmail_quote">El 29 de octubre de 2012 01:14, Ali Rincon <span dir="ltr"><<a href="mailto:alrincon1963@hotmail.com" target="_blank">alrincon1963@hotmail.com</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Caramba hermano, tiene Ud. toda la razón. Con las correciones que Ud. hizo el programa corre hermosamente. Mis respetos. Pero, permitame hacerle una pregunta: Este programa servirá para una matriz de 3268760x15, es decir, 25 elementos tomados de 15 en 15, que es realmente a donde quiero llegar??<br>
<br>
Le expreso todo mi agradecimiento por su amable ayuda,<br>
<br>
Ali Rincon<br>
Venezuela<br>
<br>
SP> Hola, Ali:<br>
SP> Hay dos errores, el número de combinaciones de 25 elementos tomados de 6 en 6 es 177100, no 177000. El programa deja de funcionar cuando se llega al elemento del array 177001.<br>
SP> El otro error es que en el bucle para reservar memoria para cada fila usas el valor nC en lugar de nF.<br>
SP> Además, en previsión de un error al reservar memoria (y más en arrays dinámicos tan grandes), hay que hacer una verificación de errores:<br>
SP> ----8<------<br>
SP> mat = malloc(nF * sizeof(int *));<br>
SP> if(!mat) {<br>
SP> printf("Error de memoria\n");<br>
SP> return 1;<br>
SP> }<br>
SP> for(f = 0; f < nF; f++) {<br>
SP> //mat[f] = (int *)malloc(nC * sizeof(int));<br>
SP> mat[f] = malloc(nC * sizeof(int));<br>
SP> if(!mat[f]) {<br>
SP> printf("Error de memoria\n");<br>
SP> for(c = 0; c < f; c++) free(mat[c]);<br>
SP> free(mat);<br>
SP> return 1;<br>
SP> }<br>
SP> }<br>
SP> ---8<------<br>
SP> Hasta pronto.<br>
SP> --<br>
SP> Salvador Pozo (Administrador)<br>
SP> mailto:<a href="mailto:salvador@conclase.net">salvador@conclase.net</a><br>
SP> _______________________________________________<br>
SP> Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
SP> <a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
SP> Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br><br><br clear="all"><div><br></div>-- <br><div>José Luis Torre</div>
<div><a href="http://ww.ehu.es/" target="_blank">ww.ehu.es</a></div>
<div> </div><br>
</div>