joaovilaca94 Posted July 12, 2014 Report Share Posted July 12, 2014 Boas! Estive a tentar desenvolver um programa para introduzir valores em matrizes (neste caso numa matriz [10][7]) e estes ficarem guardados em ficheiros... o código que fiz foi o seguinte: FILE *ft; ft = fopen("temperaturas.txt","r+"); int temp; fprintf(ft, "%s", "Introduza as Temperaturas:\n"); for(i=0; i<10;i++) { for(j=0; j<7; j++) { fscanf(ft, "%d", &temp); cid_temp[i][j] = temp; } } fclose(ft); o unico erro que me dá é o seguinte: "prog.temperaturas.c: In function ‘introduz_temperatura’: prog.temperaturas.c:24:14: error: subscripted value is neither array nor pointer nor vector cid_temp[j] = temp;" Não consigo perceber qual é o problema que existe com o "j"... Se alguem me pudesse ajudar agradecia, cumprimentos Link to comment Share on other sites More sharing options...
pwseo Posted July 12, 2014 Report Share Posted July 12, 2014 Tem interesse saber como foi declarada cid_temp, de forma a podermos analisar o erro que obtiveste com mais detalhe. Link to comment Share on other sites More sharing options...
joaovilaca94 Posted July 12, 2014 Author Report Share Posted July 12, 2014 declarei como inteiro: int cid_temp[10][7]; Link to comment Share on other sites More sharing options...
pwseo Posted July 12, 2014 Report Share Posted July 12, 2014 De facto não estou a compreender o porquê desse erro. Talvez alguém mais atento saiba despistar o caso 🙂 Link to comment Share on other sites More sharing options...
joaovilaca94 Posted July 12, 2014 Author Report Share Posted July 12, 2014 Vamos ver... obrigado na mesma 🙂 Link to comment Share on other sites More sharing options...
Rui Carlos Posted July 12, 2014 Report Share Posted July 12, 2014 O array é passado como argumento de uma função? Podes mostrar a função completa? Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
joaovilaca94 Posted July 13, 2014 Author Report Share Posted July 13, 2014 (edited) void introduz_temperatura(int *cid_temp) { int i, j; FILE *ft; ft = fopen("temperaturas.txt","r+"); int temp; fprintf(ft, "%s", "Introduza as Temperaturas:\n"); for(i=0; i<10;i++) { for(j=0; j<7; j++) { fscanf(ft, "%d", &temp); cid_temp[i][j] = temp; } } fclose(ft); } passo como sendo um vetor de inteiros... Edited July 13, 2014 by thoga31 GeSHi Link to comment Share on other sites More sharing options...
pwseo Posted July 13, 2014 Report Share Posted July 13, 2014 (edited) Quando perguntei qual era a declaração de cid_temp presumi que me estivesses a dar a declaração correcta... Da forma que declaraste o cid_temp dentro da função, estás a dizer que é um array de inteiros, o que impede logicamente a operação que estavas a tentar realizar (i.e. cid_temp é um int, aos olhos do compilador). Tens que dizer ao compilador que é um array bidimensional (ou array de array de inteiros). Solução: int **cid_temp. Edited July 13, 2014 by pwseo Link to comment Share on other sites More sharing options...
Rui Carlos Posted July 13, 2014 Report Share Posted July 13, 2014 Solução: int **cid_temp. Mas isso vai obrigar a passar o cid_temp de um array bidimensional para um array de arrays. Tendo em conta que as dimensões são conhecidas (são usadas nos ciclos da função), penso que uma solução mais simples será declarar a função como void introduz_temperatura(int cid_temp[10][7]). Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Mauro M. Posted July 13, 2014 Report Share Posted July 13, 2014 (edited) Usa: void introduz_temperatura (int cid_temp[][7]) Edited July 13, 2014 by Mauro M. Link to comment Share on other sites More sharing options...
Colector Boy Posted July 14, 2014 Report Share Posted July 14, 2014 Mas isso vai obrigar a passar o cid_temp de um array bidimensional para um array de arrays. Tendo em conta que as dimensões são conhecidas (são usadas nos ciclos da função), penso que uma solução mais simples será declarar a função como void introduz_temperatura(int cid_temp[10][7]). Qual a diferenca entre um array bidimensional e um array de arrays? Um array bidimensional nao e um array de arrays mas com 2 dimensoes? E qual o problema do array passar a ser array de arrays? Link to comment Share on other sites More sharing options...
Rui Carlos Posted July 14, 2014 Report Share Posted July 14, 2014 Em C, os arrays multidimensionais são semelhantes a arrays unidimensionais em termos de organização de memória, oferecendo apenas açúcar sintático no acesso aos seus elementos. Por exemplo, int array1[M][N] é equivalente a um array de int array2[M*N], e aceder à posição array1 é equivalente a aceder à posição array2[i*N+j]. A minha definição de array de arrays é semelhante aos arrays bidimensionais do Java, em que tens um array de apontadores para arrays (unidimensionais). Neste caso, int array1[M][N], em vez de ser um espaço de memória contíguo de M*N posições, é um array de M apontadores para arrays de tamanho N. (Estes M arrays de tamanho N podem ou não estar em posições contíguas de memória.) Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Mauro M. Posted July 14, 2014 Report Share Posted July 14, 2014 Em C, os arrays multidimensionais são semelhantes a arrays unidimensionais em termos de organização de memória, oferecendo apenas açúcar sintático no acesso aos seus elementos. Por exemplo, int array1[M][N] é equivalente a um array de int array2[M*N], e aceder à posição array1 é equivalente a aceder à posição array2[i*N+j]. A minha definição de array de arrays é semelhante aos arrays bidimensionais do Java, em que tens um array de apontadores para arrays (unidimensionais). Neste caso, int array1[M][N], em vez de ser um espaço de memória contíguo de M*N posições, é um array de M apontadores para arrays de tamanho N. (Estes M arrays de tamanho N podem ou não estar em posições contíguas de memória.) Mas acredito que possas na mesma acedê-los da mesma forma que acederias um array bidimensional int array[M][N]. Link to comment Share on other sites More sharing options...
joaovilaca94 Posted July 14, 2014 Author Report Share Posted July 14, 2014 Usei void introduz_temperatura(int cid_temp[10][7]) e consegui compilar. Obrigado pela ajuda. Cumprimentos Link to comment Share on other sites More sharing options...
Rui Carlos Posted July 14, 2014 Report Share Posted July 14, 2014 Mas acredito que possas na mesma acedê-los da mesma forma que acederias um array bidimensional int array[M][N]. Sim, podes. Mas a sua declaração/inicialização é diferente. (A razão pela qual eu sugeri não usar o int** era precisamente o facto de tal obrigar a alterar a declaração/inicialização da variável que era passada como argumento da função.) 1 Report Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
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