2016-04-03 19 views
-3

Ich weiß, dass diese Art von Frage schon gestellt wurde, aber keine der Lösungen half mir aus. Ich mag die Summe aus einer Matrix der Elemente machen, wenn eine Taste auf der Tastatur getroffen wird, aber das Programm gibt mir die nächsten Fehler:Matrix Variable nicht in diesem Bereich erklärt

main.cpp|6|error: 'j' was not declared in this scope| 
main.cpp|13|error: 'a' was not declared in this scope| 
main.cpp|19|error: 'a' was not declared in this scope| 

Mein Programm ist:

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a[i][j],i,j,s=0,n; 
    char x; 
    cout<<"n="; 
    cin>>n; 
    for (i=1;i<=n;i++) 
     for (j=1;j<=n;j++) 
     { 
      cout<<"a["<<i<<"]["<<j<<"]="; 
      cin>>a[i][j]; 
     } 
    cout<<"Type:"<<x; 
    if(x=='1') 
    { 
     for (i=1;i<=n;i++) 
      for (j=1;j<=n;j++) 
       s=s+a[i][j]; 
     cout<<s; 
     cout<<"bla bla bla"; 
    } 
    return 0; 
} 

Was falsch ist ? Die Variablen wurden am Anfang des Programms deklariert. Danke im Voraus!

+0

Sie haben sie in der falschen Reihenfolge deklariert: 'int i, j, a [i] [j], s = 0, n;' VLAs sind nicht Standard C++ BTW, und wie Sie es erklärt haben, ist ziemlich nutzlos. –

+0

Das ist nicht einmal eine richtige VLA. – anukul

Antwort

-1

Zwei Probleme: Die erste ist über Ihren Fehler, und das ist, dass Variablen in der Reihenfolge deklariert/definiert werden, die Sie tatsächlich in der Quelle tun.

Zum Beispiel:

int i, j; 

In der Zeile oberhalb der Variablen i deklariert wird vor die Variable j.

Das zweite Problem ist, dass Sie versuchen, die Variablen i und j zu verwenden, bevor sie initialisiert werden. Das heißt, sie haben einen unbestimmten Wert und geben Ihnen undefined Verhalten, wenn Sie sie verwenden.

Ein dritter Punkt ist, dass C++ nicht variable-length arrays hat, was bedeutet, dass Sie Arrays nicht tatsächlich mit Laufzeitvariablen deklarieren können (obwohl einige Compiler es als nicht portable Erweiterung hinzufügen).

Um alle oben genannten Probleme zu lösen, müssen Sie entweder std::vector verwenden (was ich empfehle), oder dynamisch Speicher mit new[] zuweisen.

Es gibt auch ein potenzielles viertes Problem, und zwar deshalb, weil Array-Indizes in C++ auf Null basieren. Wenn Sie also ein Array von N Elementen haben, gehen gültige Indizes von 0 bis N - 1 (inklusive). Ihre Schleifen über den Arrays gehen von 1 zu N, was bedeutet, dass der letzte Index außerhalb der Grenzen liegen könnte.

+0

Ich habe 'int i, j, a [100] [100], s = 0, n; 'und es löste mein Problem. Vielen Dank! – Ionut

+0

@Ionut Lesen Sie weiter meine Antwort, weil es * immer * falsch ist. Es verursacht keinen Compiler-Fehler, sollte Ihnen jedoch Warnungen geben. Wenn Sie keine Warnungen erhalten, aktivieren Sie weitere Warnungen, da Warnungen des Compilers genauso wichtig sind, um Fehler zu beheben. –

-1

Wie bei Zeile 6 liegt der Fehler in dem Teil int a[i][j], den ich glaube nirgendwo (nicht einmal in JavaScript oder Java) erlaubt und so die Variable 'i' und 'j' konnten nur Konstanten mit ihren zuvor definierten Werten sein Array-Deklaration, wenn Ihre Syntax so sein muss. Sie können entweder für jede Spalte der erforderlichen Matrix

int **a=new int[i]; 

und dann für dynamische Array-Deklaration gehen, können Sie

for(int z=;z<j;z++) 
    a[z]=new int[j]; 

haben, wo ‚i‘ und ‚j‘ darf nicht mehr nur zuvor sein deklariert aber auch in irgendeiner Weise definiert, wenn Sie Speicher Einschränkungen haben.

Oder genug Platz, bevor die Hand nehmen und dann fortfahren, die ich persönlich nicht, wie

int a[100001];

Die nachfolgenden Fehler bevorzugen sind relativ und würden gelöst werden, wenn dieses Problem behandelt wird.

Auch haben Sie ein Problem beim Durchlaufen Ihrer Matrix, wie Sie gehen OutOfBounds (0 bis n-1 und nicht 1 bis n), die keine Probleme während der Laufzeit als solche verursachen kann, aber zu unsachgemäßen Datenabruf führen und Manipulation durch andere Codezeilen.

Verwandte Themen