2016-11-25 3 views
-3

Ich schrieb diesen Code in C, um ein Array von Zahlen zu lesen, dann schreiben Sie sie auf dem Bildschirm, aber für einige Werte von n (ex. N = 6), gibt es einen Fehler . Was ist falsch?Ich weiß nicht, was der Fehler ist

 #include <stdio.h> 
#include <stdlib.h> 
int n; 
void read(int *a) 
{ 
    int i; 
    for(i=0;i<n;i++) scanf("%d",a+i); 
} 
void write(int *a) 
{ 
    int i; 
    for(i=0;i<n;i++) printf("%d",*(a+i)); 
} 
int main() 
{ 

    int *a; 
    printf("n="); 
    scanf("%d",&n); 
    a=(int *)malloc(n*sizeof(int)); 
    read(&a); 
    write(&a); 

    return 0; 
} 
+3

Wenn Ihr Code nicht ohne Warnungen kompiliert, sagen Sie es. Wenn Ihr Code nicht ohne Warnungen kompiliert wird, nehmen Sie an, dass Sie einen Fehler gemacht haben. Compiler generieren keine Warnungen zum Spaß - oder um Anfänger zu nerven. Sie generieren Warnungen, wenn sie sicher sind, dass der Code, den Sie geschrieben haben, nicht der Code ist, den Sie schreiben wollten. Beachten Sie die Warnungen! Wenn Sie sie nicht verstehen, fragen Sie nach den Warnungen des Compilers. Gib nicht vor, dass dein Code gut ist. (Gibt es irgendeinen Grund, '* (a + i)' über 'a [i]' 'vorzuziehen? Ich kann mir keine guten vorstellen.) –

+3

Auch für zukünftige Referenz ist es bei weitem besser, sowohl die Größe des Arrays (die Anzahl der Elemente in ihm) und das Array zu einer Funktion als auf eine globale Variable für die Größe zu verlassen. Das heißt: 'void lesen (int n, int * a)' und 'void schreiben (int n, int * a)' wäre besser als das, was Sie haben, und Sie sollten globale Variablen im Allgemeinen und solche wie 'vermeiden insbesondere n '. –

+0

(Haftungsausschluss: Nicht _alle_ Warnungen sind die Schuld des Programmierers; sie können auf einen Fehler im Compiler und/oder dessen Unterstützung für den Standard hinweisen oder nur informativ sein. Dies gilt insbesondere für bestimmte Compiler (wie Visual C/C++)) und/oder wenn bestimmte Compiler-Optionen (wie "-Wall") angegeben sind, Beispiele beinhalten GCCs "-Wdouble-promotion" ("warning:' float "implizit auf' double' "hochgestuft) &' -Wimplicit-fallthrough '(" Warnung: 'case" fällt in 'switch' Anweisung"), oder MSVC C4514 ("Warnung: Ich optimierte eine ungenutzte Inline-Funktion out") & C4820 ("Warnung: Ich habe Polsterung hinzugefügt").) –

Antwort

2

Sie rufen read() und write() falsch - Sie sollten nicht die Adresse des Nehmens werden, was bereits ein Zeiger.

Wechsel:

read(&a); 
write(&a); 

zu:

read(a); 
write(a); 

Beachten Sie, dass in Zukunft sollten Sie immer Compiler-Warnungen aktivieren und zur Kenntnis nehmen sie - dieser Fehler würde sofort klar gewesen, wenn Compiler-Warnungen wurden aktiviert:

<stdin>:21:10: warning: incompatible pointer types passing 'int **' to parameter of type 'int *'; remove & [-Wincompatible-pointer-types] 
    read(&a); 
     ^~ 
<stdin>:4:16: note: passing argument to parameter 'a' here 
void read(int *a) 
      ^
<stdin>:22:11: warning: incompatible pointer types passing 'int **' to parameter of type 'int *'; remove & [-Wincompatible-pointer-types] 
    write(&a); 
      ^~ 
<stdin>:9:17: note: passing argument to parameter 'a' here 
void write(int *a) 
       ^
2 warnings generated. 
+0

Kann sogar ein C90-Compiler den Code gültig verarbeiten, ohne Warnungen zu generieren? Sicher, 'gcc -std = c90-c so-4081-2138.c' erzeugt Warnungen (während der Code-Generierung), und das ist ungefähr so ​​lax wie Sie bekommen können. Und ich denke, der Standard erfordert mindestens eine solche "Diagnose" für den Code. (Siehe auch den ersten meiner beiden Kommentare zur Hauptfrage.) Außerdem beobachte ich, dass 'clang' sehr explizit ist:' warning: inkompatible Zeigertypen, die 'int **' an Parameter des Typs 'int *' übergeben; entferne & [-Wincompatible-pointer-types] 'und zeige die Funktionsaufrufe an. –

+0

Ja, guter Punkt - Ich habe gerade festgestellt, dass diese Warnungen generiert wurden, ohne dass sogar "-Wall" hinzugefügt wurde. Und ja, 'clang's Fehlermeldungen scheinen etwas detaillierter zu sein als' gcc's, was manchmal hilfreich sein kann. Natürlich kann das OP einen schrecklichen alten Compiler wie Turbo C benutzen und wer weiß, ob das bei einer Chance entsprechende Warnungen generiert? –

-2

Blick auf diese:

#include <stdio.h> 

int n; 

void read(int *a) 
{ 
    int i; 
    for (i = 0; i < n; i++) 
    { 
     scanf("%d", (a + i)); 

     // don't forget to consume the rest of line until ENTER 
     scanf("%*[^\n]"); // consume all caracters until the newline 
     scanf("%*c");  // consume the newline 
    } 
} 

void write(int *a) 
{ 
    int i; 
    for (i = 0; i<n; i++) printf("%d", *(a + i)); 
} 

int main(int argc, char *argv[]) 
{ 
    int *a; 
    printf("n= "); 
    scanf("%d", &n); 

    // don't forget to consume the rest of line until ENTER 
    scanf("%*[^\n]"); // consume all caracters until the newline 
    scanf("%*c");  // consume the newline 

    a = (int *)malloc(n*sizeof(int)); 

    // this is a FATAL ERROR ! 
    //read(&a); 
    //write(&a); 

    read(a); 
    write(a); 

    printf("\n"); 

    // don't forget to release memory allocated with 'malloc' 
    free(a); 

    return(0); 
} 



ich das, was Sie wollen? Wenn ja, viel Spaß.

+0

@PaulR, posten ich nur Antworten nach dem Test den Code MYSELF. In meinem Compiler ZERO ERRORS. Wenn Sie Fehler in meinem Programm finden, lassen Sie mich bitte wissen, was sie sind. Aber besser als das, post hier dein volles Programm für alle von uns lernen mit dir. Kommentare sind nur hilfreich, wenn sie mit konkreten Beispielen gerechtfertigt sind. Ich warte auf deinen Code. – user7140484

+0

@PaulR, Nach Ihrem letzten Kommentar «Es gibt mehr Bugs in diesem Code als in der ursprünglichen Version». Also bleibt die Herausforderung bestehen. Besser als sagen, dass unsere Bemühungen nutzlos sind, schreiben Sie UNSERE Antworten. Kannst du das FULL-Programm nicht ins OP schreiben (und mir) etwas lernen? Schließlich ist das volle Programm nicht so groß. – user7140484

Verwandte Themen