Ringraziandovi degli aiuti che mi sono stati offerti le altre volte che ho postato
sul forum,ho ancora bisogno di voi .

il linguaggio come da titolo e' c e uso djgpp

Il programma deve generare con i numeri ogni possibile combinazione da poter formare
con lettere abbinate delle parole.

Per esempio il numero 2 della matrice card e con RIGA impostata a 7 deve dare un massimo di combinazioni che corrispondono a 3^7=2187 e cio 3 sono lettere abbinate a 2(abc) e 7 sono le volte che viene composto il numero.

Il problema e' questo che se faccio con il numero 7(pqrs) o 9(wxyz) la potenza diventa 4^7=16384 e il risultato si blocca dopo aver fatto circa 5400 combinazioni.
La stessa cosa avviene se scrivi 8 numeri con tre lettere che come potenza e' 3^8=6561.

Per farla breve sembra che superato all'incirca le 5400 combinazioni il programma vada in panne.

Non capisco il motivo, forse c'e' qualcosa nel programma che io non riesco a vedere.
Percio mi rimetto alla vostra clemenza.

l'immagine sotto mostra in esecuzione il numero 2(abc) combinazioni 2187 e il numero 9(wxyz) combinazioni 16384

l'immagine del 9 non e' tagliata e' che il programma chiude l'esecuzione a quel punto.
io ho fatto una prova inserendo una variabile contatore ed ho notato che si blocca dopo aver fatto circa 5400 combinazioni.

http://img11.imageshack.us/img11/8669/combinazioni.jpg

inserisco il programma sperando che sia comprensibile dato che l'ho creato io e essendo un principiante gli errori sono dietro l'angolo



codice:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RIGA 7
#define COLONNA 5


int count=0;
 void sposta(char controlla[][COLONNA],int i,int j);
 void combina(char numero[][COLONNA],char controlla[][COLONNA]);
 void copia(char numero[][COLONNA],char controlla[][COLONNA],int partenza,int fine); 
 void abbina(char numero[][COLONNA], char controlla[][COLONNA]);


main(){
	int riga=0, muovi=0, digita=0;
	char tel[15], c[2]={' ','\0'};
	char telefono[RIGA][COLONNA], controlla[RIGA][COLONNA];
	char card[10][COLONNA]={" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

	gets(tel);
	while(muovi<RIGA){
		c[0]=tel[muovi];
		digita=atoi(c);
		strcpy(&telefono[riga][0],&card[digita][0]);
		strcpy(&controlla[riga][0],&card[digita][0]);
		++riga;
		++muovi;
	}
	
	combina(telefono,controlla);
	printf("\nCombinazioni N.%d\n",count);

}



void sposta(char controlla[][COLONNA],int i,int j){
	char copia;
	int x=0;
	int totale=0;
	int colonna;
	totale=strlen(&controlla[i][0]);
	colonna=totale;

		while(totale>0 && x<colonna-1){

		   copia=controlla[i][x];
		   controlla[i][x]=controlla[i][x+1];
		   controlla[i][x+1]=copia;
		   ++x;
		   --totale;
		}    
		
		controlla[i][x]='0';
		controlla[i][x+1]='\0';
}

void combina(char numero[][COLONNA],char controlla[][COLONNA]){
    int i,j;
	int conta=0;
	
  	 while(conta<RIGA){
	  
	  printf("%c",controlla[conta][0]);
	  ++conta;
	}  
      ++count;
	  printf("\n");
	
		
     abbina(numero,controlla);
	
}

void copia(char numero[][COLONNA],char controlla[][COLONNA],int partenza,int fine){
    int i,j;
	
	for(i=partenza;i<RIGA;i++){
		for(j=0;j<COLONNA;j++){
		  memcpy(&controlla[i][j],&numero[i][j],4);
		}
    }
	
}	

void abbina(char numero[][COLONNA], char controlla[][COLONNA]){
    int muovi=0,stop=0;

		for(muovi=0;muovi<RIGA;muovi++){
            		  			

		 if(controlla[(RIGA-1)-muovi][1]!='0' && controlla[(RIGA-1)-muovi][1]!='\0' ){
			
				 sposta(controlla,(RIGA-1)-muovi,0);
				 copia(numero,controlla,(RIGA-1)-muovi+1,0);
				 stop=1;
				 muovi=RIGA+1;
		    }
		}
		
		if(stop==1) 
       	combina(numero,controlla);
		 
}