Gundares Posted May 27, 2014 at 08:18 PM Report #557192 Posted May 27, 2014 at 08:18 PM (edited) boa noite,antes de mais obrigado pela atenção, alguém me sabe dizer o porque de quando tento guardar matrizes grandes nesta função as primeiras linhas são apagadas? linhas e colunas são passados como argumentos sendo apontadores. char **matr; int i,x,y; if (!(scanf ("%d",linhas))) printf("Por favor insira numero de linhas valido");/*guarda o número de linhas*/ if (!(scanf ("%d",colunas))) printf("Por favor insira numero de linhas valido");/*guarda o número de colunas*/ x= *linhas; y= *colunas; matr = (char **) malloc((sizeof (char )) * x +1);/*cria espaço na memoria para a matriz*/ for (i=0;i<x;i++){ matr[i]=(char *) malloc((sizeof (char )) * y +1 ); if (!(scanf ("%s",matr[i]))) {printf("linha invalida,por favor insira outra \n");i--;}; /*guarda linhas da matriz*/ if (cad_tamanho(matr[i])!=y) {printf("linha invalida,por favor insira outra \n");i--;}; /*vê se o tamanho da linha guardada é valido*/ } return matr; Obrigado. Edited May 27, 2014 at 09:33 PM by Gundares Tags code + GeSHi + limpeza da formatação
HappyHippyHippo Posted May 27, 2014 at 09:39 PM Report #557215 Posted May 27, 2014 at 09:39 PM apresenta os seguintes dados: - código completo da função - código da chamada da função assim como código relevante aos argumentos usados na chamada - dados de entrada da aplicação - valores esperados - valores resultantes IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Gundares Posted May 27, 2014 at 09:47 PM Author Report #557220 Posted May 27, 2014 at 09:47 PM (edited) Código completo da função: char** busca_mat(int *linhas,int *colunas) { char **matr; int i; if (!(scanf ("%d",linhas))) printf("Por favor insira numero de linhas valido");/*guarda o número de linhas*/ if (!(scanf ("%d",colunas))) printf("Por favor insira numero de linhas valido");/*guarda o número de colunas*/ matr = (char **) malloc((sizeof (char )) * *linhas );/*cria espaço na memoria para a matriz*/ for (i=0;i<*linhas;i++){ matr[i]=(char *) malloc((sizeof (char )) * *colunas ); if (!(scanf ("%s",matr[i]))) {printf("linha invalida,por favor insira outra \n");i--;}; /*guarda linhas da matriz*/ if (cad_tamanho(matr[i])!=*colunas) {printf("linha invalida,por favor insira outra \n");i--;}; /*vê se o tamanho da linha guardada é valido*/ } return matr; } código de chamada e relevante: int main () { char **matriz; int *linhas,*colunas,i; linhas=(int) malloc(sizeof(int)); colunas=(int) malloc(sizeof(int)); matriz=busca_mat(linhas,colunas); printf("linhas=%d colunas=%d \n",*linhas,*colunas); for(i=0;i<*linhas;i++) { printf("%s\n",matriz[i]); } return 0; } o que recebe: número de linhas (por exemplo: 9) número de colunas (por exemplo: 9) matriz (por exemplo: abcdefghi jklmnopqr stuvwxyza abcdefghi jklmnopqr stuvwxyza abcdefghi jklmnopqr stuvwxyza ) o que espero: li=9 col=9 abcdefghi jklmnopqr stuvwxyza abcdefghi jklmnopqr stuvwxyza abcdefghi jklmnopqr stuvwxyza o que recebo: li=9 col=9 0�� ��� stuvwxyza abcdefghi jklmnopqr stuvwxyza abcdefghi jklmnopqr stuvwxyza Edited May 27, 2014 at 10:00 PM by Gundares GeSHi
HappyHippyHippo Posted May 27, 2014 at 09:54 PM Report #557225 Posted May 27, 2014 at 09:54 PM (edited) isso nem compila sei somente de olhar para o código ... ps : e não é por faltar o código da função cad_tamanho que podia ser completamente removida em detrimento da strlen Edited May 27, 2014 at 09:55 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Gundares Posted May 27, 2014 at 09:56 PM Author Report #557227 Posted May 27, 2014 at 09:56 PM Ele corre no linux.
HappyHippyHippo Posted May 27, 2014 at 09:58 PM Report #557229 Posted May 27, 2014 at 09:58 PM então explica este milagre : int main () { // ... matr=busca_mat(li,col); // <-- onde está declarada a variável "matr" ?? // ... } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Gundares Posted May 27, 2014 at 09:59 PM Author Report #557230 Posted May 27, 2014 at 09:59 PM Pois passei mal o código tava a tentar por mais legivel escaparam alguns pormenores
HappyHippyHippo Posted May 27, 2014 at 10:06 PM Report #557233 Posted May 27, 2014 at 10:06 PM então apresenta o código corregido IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Gundares Posted May 27, 2014 at 10:08 PM Author Report #557235 Posted May 27, 2014 at 10:08 PM Já está.
HappyHippyHippo Posted May 27, 2014 at 10:11 PM Report #557236 Posted May 27, 2014 at 10:11 PM este é o problema mais habitual que existe no fórum (um dia tenho de começar a fazer uma estatística desta coisa ...) para ver se chegar lá sozinho ou por conhecimento ou por pesquisa aqui no fórum, responde a esta pergunta : "quantas vezes carregas na tecla ENTER antes de começar a inserir as strings ?" IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Gundares Posted May 27, 2014 at 10:13 PM Author Report #557237 Posted May 27, 2014 at 10:13 PM (edited) Duas uma para o primeiro nove e outra para o segundo Edited May 27, 2014 at 10:14 PM by Gundares
HappyHippyHippo Posted May 27, 2014 at 10:19 PM Report #557239 Posted May 27, 2014 at 10:19 PM pois ... e por acaso a tua aplicação não se dá ao trabalho de apresentar uma daquelas mensagem de : "ao não gosto da tua string" que tens no teu código ? é que se não apresenta é porque a tua função cad_tamanho está mal ou está a acontecer uma coincidência muito, mas mesmo muito grande ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Gundares Posted May 27, 2014 at 10:22 PM Author Report #557241 Posted May 27, 2014 at 10:22 PM Neste caso desaparecem 2 quando experimentei com uma matriz com 20x20 desapareceram 3 Não se queixa.
HappyHippyHippo Posted May 27, 2014 at 10:29 PM Report #557248 Posted May 27, 2014 at 10:29 PM vais fazer esta brincadeira : #define CLEAR_INPUT while (getchar() != '\n') /* void */ char** busca_mat(int *linhas,int *colunas) { char **matr; int i; if (!(scanf ("%d",linhas))) printf("Por favor insira numero de linhas valido");/*guarda o número de linhas*/ CLEAR_INPUT; if (!(scanf ("%d",colunas))) printf("Por favor insira numero de linhas valido");/*guarda o número de colunas*/ CLEAR_INPUT; matr = (char **) malloc((sizeof (char )) * *linhas );/*cria espaço na memoria para a matriz*/ for (i=0;i<*linhas;i++){ matr[i]=(char *) malloc((sizeof (char )) * *colunas ); if (!(scanf ("%s",matr[i]))) {printf("linha invalida,por favor insira outra \n");i--;}; // pensa neste if caso o primeiro falhe ... if (cad_tamanho(matr[i])!=*colunas) {printf("linha invalida,por favor insira outra \n");i--;}; } return matr; } e se funcionar tudo bem, pesquisa na net sobre "clear input buffer" IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Gundares Posted May 27, 2014 at 10:31 PM Author Report #557249 Posted May 27, 2014 at 10:31 PM Vi esta solução feita por professores na universidade, pensei que estava correta. int cad_tamanho (char s[]) { int p; p=0; while (s[p]!='\0') p++; return p; } Ok obrigado pela ajuda, depois quando testar esta função deixo feedback 😄
Gundares Posted May 27, 2014 at 10:48 PM Author Report #557257 Posted May 27, 2014 at 10:48 PM (edited) Ok obrigado pela ajuda correu bem mas tive que em vez de usar o #define CLEAR_INPUT while (getchar() != '\n') /*void*/ visto isto não funcionar,criei a função void clear (void) { while ( getchar() != '\n' ); } e também percebi o porque de a usar , obrigado ;D Edited May 27, 2014 at 10:48 PM by Gundares
HappyHippyHippo Posted May 27, 2014 at 10:53 PM Report #557262 Posted May 27, 2014 at 10:53 PM Ok obrigado pela ajuda correu bem mas tive que em vez de usar o #define CLEAR_INPUT while (getchar() != '\n') /*void*/ visto isto não funcionar pensares que não funciona não é a mesma coisa que não funcionar ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now