Forum: PC-Programmierung Fehlermeldung: j nicht deklariert! weshalb?


von feldi (Gast)


Lesenswert?

Habe hier einen Programausschnitt! Ich bekomme jedoch immer die 
fehlermeldung das j nicht deklariert ist! Weshalb?

Gruß feldi
1
    cout << "Es werden solange neue Listenelemente erstellt, bis \"stop\" als" 
2
     << "\nName eingegeben wird!\n";
3
           
4
   
5
    short vergl; 
6
    char c[32], temp[32];
7
    int Prioritaet, i=1;j;
8
9
    do 
10
    {   
11
        cin.sync();
12
        cin.clear();
13
          
14
        cout << "\n\nListenelement Nr. " << i << ":\n";  
15
        cout << "Name des Auftrags: ";
16
        cin  >> c;
17
              
18
19
        //Prüfen ob "stop" eingegeben wurde:
20
           
21
        for(int j=0; c[j] != '\0'; j++)
22
            {
23
                 temp[j] = tolower(c[j]); //umwandeln in Kleinbuchstaben
24
             }
25
        temp[j] = '\0';           //HIER erscheint der dekelerationsfehler
26
               
27
        vergl = strcmp(temp,"stop");
28
        if (vergl == 0) break;
29
 
30
        cout << "Prioritaet des Auftrags: ";
31
        cin  >> Prioritaet;
32
        
33
        if(i==1) Wurzel = Neues_Element(Prioritaet, c, NULL);
34
        else Wurzel = Neues_Element(Prioritaet, c, Wurzel);
35
        
36
        i++;    
37
   }
38
          
39
   while (vergl != 0); 
40
   cout << "\n\nEnde der Liste. ";

von ich (Gast)


Lesenswert?

weil

temp[j] = '\0';

nicht das j aus der Schleife ist.

Und

int Prioritaet, i=1;j;

besitzt keine Zuwisung

von frage (Gast)


Lesenswert?

>int Prioritaet, i=1;j;
                    ^
Sollte da nicht ein Komma hin? Komisch, ich hätte erwartet der Compiler 
beschwert sich dort schon.

>for(int j=0;
     ^^^^

Nochmal?

von feldi (Gast)


Lesenswert?

Hallo
ja klar es müßte ein komma sein aber an dem liegt die Fehlermeldung 
nicht!
auch mit Komma bekomme ich die Fehlermeldung

Wie müsste ich das j deklarieren und wo?

Gruß feldi

von Egberto (Gast)


Lesenswert?

Da bei Priorität

von Egberto (Gast)


Lesenswert?

Also ohne ; und das int j =0 durch j=0 ersetzen

von hacker-tobi (Gast)


Lesenswert?

Hi,

also mal von vorn...was willst du denn mit:

       temp[j] = '\0';

erreichen? Doch wohl, das \0 am Ende angehängt wird oder?
Das funktioniert so schonmal nicht, da hier das "j" nicht das "j" aus 
der Schleife ist.
Ergo empfiehlt es sich, j global zu deklarieren und zu initialisieren, 
nicht in der Schleife.

int Prioritaet, i=1;j;


wird dann zu

int Prioritaet, i=1, j=0;

und

for(int j=0; c[j] != '\0'; j++)

wird zu

for(; c[j] != '\0'; j++)

gruß

tobi

von Hermann-Josef (Gast)


Lesenswert?

Hi,

wenn oben kein j deklariert wird, ist die Schleifenvariable j außerhalb 
der Schleife nicht mehr gültig, das ist der Fehler
1
        for(int j=0; c[j] != '\0'; j++)
2
            {
3
                 temp[j] = tolower(c[j]); //umwandeln in Kleinbuchstaben
4
             }
5
        temp[j] = '\0';           //HIER erscheint der dekelerationsfehler

Vielleicht wolltest Du das so schreiben ?
1
        int j; // weiter oben
2
        for( j=0; c[j] != '\0'; j++)
3
            {
4
                 temp[j] = tolower(c[j]); //umwandeln in Kleinbuchstaben
5
            }
6
        temp[j] = '\0';           //HIER erscheint der dekelerationsfehler

Wenn Du oben ein j hast und als Schleifenvariable, dann wäre das j 
allerdings nicht mehr der Wert am Ende der Schleife, was es wohl sein 
müsste, um den String zu terminieren.

Gruß
Hermann-Josef

von Simon B. (nomis)


Lesenswert?

Der Deklarationsfehler kommt nicht erst bei "temp[j] = '\0';" sondern 
schon bei der Zeile "int Prioritaet, i=1;j;" - da steht nämlich ein 
einzelner Ausdruck, der nur aus "j" besteht.

Der Compiler könnte hier eine Warnung der Art "Warning, statement has no 
effect" oder sowas ausgeben, weil da eben ein Ausdruck ohne Effekt 
steht.

(Mal abgesehen davon, dass zu diesem Zeitpunkt eben j noch nicht 
deklariert ist...)

Viele Grüße,
        Simon

von hacker-tobi (Gast)


Lesenswert?

@Hermann-Josef: ich war schneller ;)

von hacker-tobi (Gast)


Lesenswert?

Übrigens: Es kann sein, das der Compiler für das Statement

int Prioritaet, i=1;j;

keine Warnung ausgibt, zumindest beim gcc muss dafür imHo -Wall gesetzt 
sein.

von feldi (Gast)


Lesenswert?

Hallo nochmals!

Also hier mal mein komplettes Programm!
Ich will eigentlich "Aufträge" von der Konsole einlesen und in eine 
Liste ketten!
Durch Eingabe von STOP soll das Einlesen beendet werden!

Mein Problem in diesem Fall ja das das j aus der Schleife außerhalb der 
schleife nicht mehr gültig ist!

Wie löse ich dies am besten?
Über Zeiger?
1
#include <iostream>
2
#include <iomanip>
3
#include <stdlib.h>
4
#include <string.h>
5
6
using namespace std ;
7
8
9
//------------------------------------------------------------------------------
10
11
//struct als globaler Datentyp
12
struct ListElm {int Prio; char *name; struct ListElm *next;};                 
13
                                                                              
14
//------------------------------------------------------------------------------
15
16
//Ausgabe eines Elements mit Unterprogramm
17
void PrintElm(struct ListElm *z)                                                
18
{
19
    cout << "------------------------------------"<< endl
20
         << "Prioritaet.....: " << dec << z->Prio << endl
21
         << "Name...........: " <<        z->name << endl
22
         << "Verkettungsinfo: " << hex << z->next << endl
23
     << dec;
24
}
25
26
//------------------------------------------------------------------------------
27
28
//Ausgabe der Liste mit Unterprogramm
29
void PrintList(struct ListElm *Tail)                                      
30
{
31
     while (Tail != NULL)
32
     {
33
      PrintElm(Tail);
34
      Tail = Tail->next;
35
      }  
36
}
37
38
//------------------------------------------------------------------------------
39
40
//2.2 Unterprogramm zur Erzeugung eines neuen Elements 
41
42
struct ListElm* Neues_Element(int prio, const char* s, struct ListElm *naechste)
43
{
44
  struct ListElm *a; 
45
    
46
  a = new struct ListElm;
47
    a->Prio = prio;
48
       
49
    a->name = new char[strlen(s)+1];
50
    strcpy(a->name,s);
51
              
52
    a->next = naechste;
53
      
54
    return a;    
55
}
56
57
58
59
60
//______________________________________________________________________________
61
//_____________________________main programm____________________________________
62
//______________________________________________________________________________
63
64
65
66
67
int main(int argc, char *argv[])
68
{
69
    struct ListElm *Wurzel;
70
 
71
    Wurzel = Neues_Element(1, "Sepp", NULL);
72
    PrintList(Wurzel);
73
  
74
    Wurzel = Neues_Element(2, "Hans", Wurzel);
75
    PrintList(Wurzel);
76
  
77
    system("pause");
78
    system("cls");
79
    
80
  Wurzel = NULL;
81
    
82
    
83
    //2.3 Aufträge von Konsole einlesen und in Liste ketten
84
    
85
    cout << "Es werden solange neue Listenelemente erstellt, bis \"stop\" als" 
86
     << "\nName eingegeben wird!\n";
87
           
88
   
89
    short vergl; 
90
    char c[32], temp[32];
91
    int Prioritaet, i=1;
92
93
    do 
94
    {   
95
        cin.sync();
96
        cin.clear();
97
          
98
        cout << "\n\nListenelement Nr. " << i << ":\n";  
99
        cout << "Name des Auftrags: ";
100
        cin  >> c;
101
              
102
103
        //Prüfen ob "stop" eingegeben wurde:
104
           
105
        for(int j=0; c[j] != '\0'; j++)
106
            {
107
                 temp[j] = tolower(c[j]); //umwandeln in Kleinbuchstaben
108
             
109
        temp[j] = '\0';
110
    }  
111
        vergl = strcmp(temp,"stop");
112
        if (vergl == 0) break;
113
 
114
        cout << "Prioritaet des Auftrags: ";
115
        cin  >> Prioritaet;
116
        
117
        if(i==1) Wurzel = Neues_Element(Prioritaet, c, NULL);
118
        else Wurzel = Neues_Element(Prioritaet, c, Wurzel);
119
        
120
        i++;    
121
   }
122
          
123
   while (vergl != 0); 
124
   cout << "\n\nEnde der Liste. ";
125
   
126
   
127
   system("pause");
128
   system("cls");
129
   
130
   
131
   
132
   cout << "Ausgabe der Liste:\n\n";
133
   PrintList(Wurzel);
134
   
135
   
136
    
137
  
138
  system("PAUSE");  
139
  return 0;
140
}
Gruß feldi

von 123gast (Gast)


Lesenswert?

Ich hab so das Gefühl du machts dir das Leben schwer... Anfänger && 
Hausaufgabe?

Warum definierst du j nicht einfach ganz oben
1
int Prioritaet, i=1, j;
und lässt das "int" in der Schleife weg? Es ist imho sowieso wenig 
sinnvoll Variablen mitten im Code zu definieren, erzeugt nur Fehler 
(teils schwer nachvollziehbar).

Davon abgesehen: Das nächste mal ein paar Leerzeilen weniger bitte und 
den Code besser als Anhang (Endung .c um die Syntaxvorhebung zu 
aktivieren).

Und gaaaanz wichtig: Einrückungen usw. beachten. Dein Code ist ein 
bisschen(!) chaotisch in dieser Hinsicht, sehr gut um Fehler zu 
übersehen bzw. einzubauen.

von DirkB (Gast)


Lesenswert?

feldi schrieb:
> Mein Problem in diesem Fall ja das das j aus der Schleife außerhalb der
> schleife nicht mehr gültig ist!

Dann definiere es außerhalb der Schleife!

Das hat Hermann-Josef scjon gestern um 21:07 geschrieben, sogar mit 
Code.

von feldi (Gast)


Lesenswert?

DirkB schrieb:
> Warum definierst du j nicht einfach ganz obenint Prioritaet, i=1, j;

habe ich schon versucht!

Mein problem ist mittlerweile auch nicht mehr das j sondern das ich aus 
der do while schleife (mit STOP) nicht herauskomme!

von egberto (Gast)


Lesenswert?

wenn du das temp[j] = '\0';
in der Schleife machst, überschreibst du temp komplett mit 0.

Wenn du also an die letzte Position von temp eine 0 setzen willst, 
brauchst du j außerhalb der Scheife - kannst es also nicht mit for(int 
j=0; deklarieren... wie hier jetzt schon so oft gesagt wurde!

Eventuell solltest du mit einem einfacheren Programm beginnen...gute C 
Kurse gibt es im Netz genug.

von 123gast (Gast)


Lesenswert?

egberto schrieb:
> Eventuell solltest du mit einem einfacheren Programm beginnen...gute C
> Kurse gibt es im Netz genug.

Soll heissen: Du (feldi) übernimmst dich hier etwas. Stimmt meine 
Vermutung "Anfänger && Hausaufgabe" ?

von feldi (Gast)


Angehängte Dateien:

Lesenswert?

egberto schrieb:
> wenn du das temp[j] = '\0';
>
> in der Schleife machst, überschreibst du temp komplett mit 0.
>
>
>
> Wenn du also an die letzte Position von temp eine 0 setzen willst,
>
> brauchst du j außerhalb der Scheife - kannst es also nicht mit for(int
>
> j=0; deklarieren... wie hier jetzt schon so oft gesagt wurde!

habe ich schon versucht, (siehe Anhang)
es funktioniert aber leider nicht!

Gruß Feldi

von feldi (Gast)


Lesenswert?

123gast schrieb:
> egberto schrieb:
>
>> Eventuell solltest du mit einem einfacheren Programm beginnen...gute C
>
>> Kurse gibt es im Netz genug.
>
>
>
> Soll heissen: Du (feldi) übernimmst dich hier etwas. Stimmt meine
>
> Vermutung "Anfänger && Hausaufgabe" ?


Anfänger, ja! Hausaufgabe, nein --->  ÜBUNG

von 123gast (Gast)


Lesenswert?

feldi schrieb:
> Anfänger, ja! Hausaufgabe, nein --->  ÜBUNG

Ok, sollte auch kein Vorwurf sein. Immer hin hast du meine Hinweise 
beachtet, der Code ist jetzt ordentlich formatiert und als Anhang 
vorhanden.

Zum Problem:
>for(; c[j] != '\0'; j++)
ändern in
>for(j=0; c[j] != '\0'; j++)

Du musst dir im Klaren sein: Programmieren heisst "einen Algorithmus 
finden um das gegebene Problem zu lösen", das Tippen des Quellcodes ist 
nur ein ganz kleiner Teil. Bevor du drauf los programmierst überleg 
dir wie DU (als Mensch) die Aufgabe lösen würdest, beschreibe es mit 
Worten, teste deine Lösung mit Papier und Bleistift und - wenn alles 
passt - "übersetze" die Lösung in die Programmiersprache deiner Wahl.

von feldi (Gast)


Lesenswert?

Danke !

War der Meinung dass ich dies schon versucht hatte...hab mich wohl 
getäuscht!

Jetzt funktioniert es

Gruß feldi

von 123gast (Gast)


Lesenswert?

feldi schrieb:
> Danke !
Gerne.

> War der Meinung dass ich dies schon versucht hatte...hab mich wohl
> getäuscht!
Daraus entnehme ich dass du das "trial-and-error"-Prinzip anwendest. 
Machen viele (Ich auch), aber: Bei größeren Projekten stößt man sehr 
schnell an die Grenzen dieser Methode, da muss man vorher denken und 
systematische Fehlersuche betreiben.

Ein Beispiel: Meine aktuelle (private) Bastelei hat jetzt schon 
geschätzt 1500-2000 Zeilen Code (sehr wenig für ein Projekt). Wenn ich 
da einen Bug suche komme ich nur mit Rumprobieren nicht mehr weit, da 
muss man methodisch vorgehen und - das ist am besten - Fehler von vorne 
herein so weit wie möglich durch saubere Programmierung ausschließen.

>Jetzt funktioniert es
Das war Sinn der Sache... Jetzt kommt der nächste Schritt: Wo lässt sich 
noch was verbessern, optimieren usw. ? Vielleicht gibts noch ein paar 
spezielle C++-Sachen die du nutzen kannst, das ist nicht mein Gebiet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.