2017-01-25 1 views
-4

Gestern bat ich um eine Hilfe in this Frage, und jetzt ist die Situation besser, aber nicht OK. Ich wiederhole den korrekten Code, aber es gibt ein anderes Problem, trotz der Korrekturen. Die zweite Funktion liest alle Werte des Arrays als 0. Ich denke, das Problem ist über die Zeiger, aber ich kann nicht verstehen, wie man es behebt.Alle zurückgegebenen Werte des Arrays sind 0

Hier ist mein Code:

#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

Bearbeiten Sie Ihren Code und ziehen Sie ihn richtig ein, wenn Sie erwarten, dass jemand diese Frage liest. – Lundin

+0

es wäre viel einfacher, wenn Sie die englische Sprache in Ihrem Code verwenden würden. –

+0

Entschuldigung, du hast Recht. Ich habe vergessen, die Sprache zu ändern. – FranzGoogle

Antwort

2

Sie sind nicht auf das Array Schreiben Sie in zu leggiSequenza weitergegeben. Stattdessen weisen Sie ein neues Array zu, in das Sie schreiben und dann frei geben.

Entfernen Sie die folgenden Zeilen aus leggiSequenza das Problem zu beheben:

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

und

free(seq); 
+0

Vielen Dank! Jetzt funktioniert es perfekt! – FranzGoogle

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

Ok, hier gibt es einige Speicher zugewiesen. Jetzt übergeben Sie diesen Zeiger p in die erste Funktion:

int dim = leggiSequenza(nomeFile, p);

Innerhalb dieser Funktion können Sie eine Variable seq haben, die einen Zeiger tatsächlich auf den gleichen Speicher zeigt, dass p tut.

Lass uns weiter schauen: seq = (int*) malloc(dim*sizeof(int)); Hier hast du neuen Speicher zugewiesen und tust danach etwas damit.

Dann rufen Sie free(seq) damit die durch den zweiten Aufruf malloc zugewiesenen Speicher gelöscht (Speicher hingewiesen durch p noch gültig ist, jedoch bleibt unverändert)

Nun rufen Sie passi = numeroPassi(p, dim);. Hier wird der Speicher, auf den zeigt, verwendet, als ob es keine Änderungen durch die erste Funktion gegeben hätte

+1

Es ist nicht verloren. 'p' weist immer noch darauf hin. – StoryTeller

+0

Danke! Jetzt verstehe ich, wo der Fehler ist. Sehr nett. – FranzGoogle

+0

@StoryTeller Sie haben Recht, tut mir leid. Gerade bearbeitet. –

Verwandte Themen