2017-01-25 4 views
-4

です。昨日私はthisという質問で助けを求めましたが、状況は良くなりましたがOKではありません。私は正しいコードを再投稿しますが、訂正にもかかわらず別の問題を返します。 2番目の関数はすべての配列の値を0として読み込みます。 問題はポインタに関するものだと思いますが、それを修正する方法を理解できません。あなたはleggiSequenzaに渡された配列への書き込みをされていない配列の戻り値はすべて0

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

int leggiSequenza(char *nomeFile, int *seq) { 

    FILE *in; 
    int i; 
    int dim; 

    if((in = fopen(nomeFile, "r"))==NULL) { 
     printf("Errore: impossibile leggere il fie in apertura.\n"); 
     return -1; 
    } 

    fscanf(in, "%d", &(dim)); 
    printf("Trovati %d valori.\n", dim); 

    if(dim < 0) { 
     printf("Errore: il numero di interi risulta negativo.\n"); 
     return -1; 
    } 

    seq = (int*) malloc(dim*sizeof(int)); 

    i=0; 
    while(!feof(in) && i<(dim)) { 
     fscanf(in, "%d", &seq[i]); 
     i++; 
    } 

    for(i=0; i<(dim); i++) { 
     printf("Il valore letto in posizione %d è: %d.\n", i+1, seq[i]); 
    } 


    fclose(in); 
    free(seq); 

    return dim; 
    } 




int numeroPassi(int *valori, int size) { 

    int i; 
    int somma; 
    int passi[size]; 

    for(i=0; i<size; i++) { 
     printf("valore in posizione %d = %d.\n", i+1, valori[i]); 
    } 

    somma=0; 
    for(i=0; i<(size-1); i++) { 
     somma = somma + abs(valori[i]); 
    } 

    printf("La somma del valore assoluto di tutti gli elementi è: %d.\n", somma); 

    return 0; 
} 




int main(int argc, char* argv[]) { 

    char nomeFile[200]; 
    int passi; 

    printf("\n"); 

    printf("Inserire il nome del file:\n"); 
    scanf("%s", nomeFile); 
    printf("\n"); 

    int * p = malloc(200*sizeof(int)); 
    int dim = leggiSequenza(nomeFile, p); 
    printf("dimensione = %d\n", dim); 
    printf("\n"); 

    passi = numeroPassi(p, dim); 

    printf("\n"); 

    free(p); 

    return 0; 
} 
+0

コードを編集し、誰かがこの質問を読むことを期待するならば、正しく字下げします。 – Lundin

+0

コード内で英語を使用する方が簡単です。 –

+0

申し訳ありませんが、あなたは正しいです。私は言語を変えるのを忘れた。 – FranzGoogle

答えて

2

は、ここに私のコードです。代わりに、書き込んだり空いている新しい配列を割り当てています。

その問題を解決するためにleggiSequenzaから次の行を削除します。

seq = (int*) malloc(dim*sizeof(int)); 

free(seq); 
+0

ありがとうございます!今それは完璧に動作します! – FranzGoogle

1
int * p = malloc(200*sizeof(int)); 

を[OK]を、ここでは、いくつかのメモリを割り当てられました。今、あなたは最初の関数にそのポインタpを渡す:

int dim = leggiSequenza(nomeFile, p);

この関数内あなたが実際にpが行うのと同じメモリを指すポインタである変数seqを持っています。

もっと見てみよう:seq = (int*) malloc(dim*sizeof(int)); ここで新しいメモリを割り当てた後、それを使って何かをします。

次に、あなたが今、あなたはpassi = numeroPassi(p, dim);を呼び出す

(メモリがpによって指さがまだ有効であるが、変化しません)ので、mallocに2回目の呼び出しによって割り当てられたメモリがクリアされるfree(seq)を呼び出します。ここではpが指すメモリは、最初の関数で変更がないかのように使用されます。

+1

それは失われません。 'p'はまだそれを指しています。 – StoryTeller

+0

ありがとう!今私はエラーがどこにあるのか理解しています。とても親切。 – FranzGoogle

+0

@StoryTellerあなたは正しいです、申し訳ありません。ちょうど編集されました。 –