Reihenfolge der Variablendeklaration in Borland Turbo C++



  • Hallo allerseits,

    da dies mein erster Beitrag hier ist, stelle ich mich mal vor.
    Ich bin Jahrgang 1973 und habe vor ein paar Tagen mein Fernstudium E-Technik abgeschlossen. Beruflich habe ich nichts mit Softwareentwicklung zu tun, mein Interesse ist also reines Hobby. Im Studium habe ich die Grundlagen von C gelernt und beschäftige mich nun mit C++.

    Seit Stunden suchte ich einen Fehler in meinem Code. Nachdem ich die Reihenfolge
    der Variablendeklaration Zeile 30 und 31 getauscht hatte lief das Programm. (man tut ja so einiges wenn man am verzweifeln ist)
    Wenn ich zuerst das char-Feld deklariere und danach int i, liefert die Ausgabe in der for-schleife in main "12", dann hängt das Programm. Eingegeben habe ich 1001.

    Warum ist das so? Ich dachte die Reihenfolge sollte keine Rolle spielen.
    Ich nutze den Borland C++Builder für Microsoft Windows Version 10.0.2288.42451 Update 2.

    Vielen Dank
    C-Bär

    [code]#include<iostream>
    #include<conio.h>
    
    using namespace std;
    
    void Bitfehlertabelle(int schluessel[4]);
    
    int main(void)
    {
    
    	int schluessel[4];
    	int i;
    
    	Bitfehlertabelle(schluessel);
    	cout<<"Der Schluesselcode ist: ";
    	for(i=0;i<4;i++)
    	{
    		cout<<schluessel[i];
    	}
    	cout<<endl<<endl;
    
    	getch();
    	return(0);
    }
    
    //------------------------------------------------------------------------------
    void Bitfehlertabelle(int code[4])
    {
    	int i=0;
    	char codeeingabe[4]={0};
    
    	cout<<"Schluesselcode (vierstellig/dual) eingeben: ";  //Benutzereingabe
    	cin>>codeeingabe;										//speichert den Code als char-Feld
    	fflush(stdin);
    
    	for(i=0;i<4;i++)										//Wandlung von char nach int
    	{
    		if(codeeingabe[i]=='0')
    		{
    			code[i]=0;
    		}
    		else code[i]=1;
    	}														//Ende Wandlung
    
    }
    [/code]
    


  • Bitfehlertabelle() modifiziert "int schluessel[4];" nicht, weil du das array nicht als Referenz übergibst.



  • Gugi schrieb:

    ...weil du das array nicht als Referenz übergibst.

    das macht er doch.
    🙂



  • Wegen der automatisch angehängten Nullterminierung muss ein char-Array, das vier Zeichen aufnehmen können soll, die Größe 5 haben.


  • Mod

    MFK schrieb:

    Wegen der automatisch angehängten Nullterminierung muss ein char-Array, das vier Zeichen aufnehmen können soll, die Größe 5 haben.

    Genau das ist es. Da du offensichtlich noch ziemlich stark deine C Kenntnisse beim C++ programmieren benutzt, noch ein paar hilfreiche Stichworte um solche Probleme in Zukunft zu vermeiden:
    std::vector: C++ Variante eines Arrays. Bietet vollautomatische dynamische Speicherverwaltung und Typenprüfung.
    std::string: C++ Variante eines char-Arrays. Ist im Prinzip ein vector<char> mit ein paar Extras zur Stringmanipulation.



  • Du hast recht MFK.

    Ich musste erst mal überlegen, was die Feldgröße mit der Reihenfolge der Deklaration zu tun haben soll.
    Aber nun ist der Groschen gefallen. Deklariere ich int i nach dem Array, liegt es im Speicher direkt hinter dem Array. Bitfehlertabelle() trägt in "codeeingabe[5]" (das es ja gar nicht gibt) das Nullzeichen an, das dann fälschlicherweise in int i liegt.

    Danke für Eure Antworten, hab wieder was gelernt.

    C_Bär


Anmelden zum Antworten