Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » globale variablen im header

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.12.2003, 16:50 Uhr
~sebbraun
Gast


Ich habe ein Problem mit dem aufsplitten eines Programms in mehrere dateien:

das programm bestand bisher aus 2 dateien, base.cpp und main.cpp (und lief ausgezeichnet)
Meine globalen Feldvariablen int note[] und int nummer[] (speichern jeweils zugehörige daten) befanden sich in der datei base.cpp. alle funktionen die darauf zugriffen befanden sich ebenfalls dort.
nun will ich verschiedene funktionen auslagern so das das programm aus 4 dateien besteht: core main base und gui
damit weiterhin alle funktionen auf die variablen zugreifen können wollte ich die beiden felder in der datei core.h definieren.
Hierbei tritt jedoch das Problem auf: die bereits compilierten dateien lassen sich nicht zusammenlinken. DEr compiler gibt mir als fehlemeldung aus, dass die variabeln mehrmals definiert würden
Habe bereits einiges ausprobiert, hatte jedoch keinen erfolg. Für hilfe wäre ich äußerst dankbar.
hier mein Quelltext:

C++:
// base.cpp:

#include <iostream>
using namespace std;
#include "core.h"
#include "base.h"



void copyintarray(int* arrayin,int* arrayout)
{  
    
    
    for(int i=0;i<66;i++)
    {
        *arrayout = *arrayin;
        arrayout++;
        arrayin++;
    }
    
    for(int j=0;j<67;j++)
    {
        cout<<"array "<<j<<" ="<<*arrayout<<endl;
        arrayout++;
    }
    cout<<endl;
    
    
        return;
}





void kommandozeile(int pargc,char** pargv)
{
    
  
  

   for(int x = 0; x < pargc; ++x)
   {
      split_func(pargv[x],'-');
   }
return;
}



void split_func(char* param, char trenner)
{
  
  
  char temp1[455];
  char temp2[455];
  
  
  bool bAnfang = 1;
  int y = 0;
  for(int x = 0; x < int(strlen(param)); x++)
  {
    if(bAnfang)
    {
      if(param[x] != trenner)
      {
        temp1[y] = param[x];
        temp1[y+1] = '\0';
        y++;
      }
      else
      {
        bAnfang = 0;
        y = 0;
      }
    }
    else
    {
        temp2[y] = param[x];
        temp2[y+1] = '\0';
        y++;
    }
  }

  

  nummer[lauf]=atoi(temp1);
  note[lauf]=atoi(temp2);
  ++lauf;
}







void listtop(int anzahl,int* psortnote,int* psortnummer)
{  
    int zaehler=1;
    int j =66;
    cout<<" Stelle  "<<"  "<<"Punktzahl"<<"    "<<"Matr.Nummer"<<endl;
    while(j<67 && j>67-anzahl)
    {
    
        cout<<endl<<"     "<<zaehler<<"          " <<psortnote[j-1]<<"              "<<psortnummer[j-1] ;  
        j--;
        zaehler++;
    }
}


int count(int* array,int size,int* anzahl)
{    int zaehler;
    for(int lauf=0;lauf<(size+1);lauf++)
    {
        if(*array != 0)
        {
            zaehler++;
        }        
    }
    return zaehler;    
    *anzahl=zaehler;
}        



void bubblesort(int* pnote,int* pnummer,int size)
{
for(int i = 0; i < size ; i++)
{
      for(int j = 0; j < (size-1); j++)
      {
            if( pnote[j] > pnote[j + 1])
            {
              int temp = pnote[j];
              pnote[j] = pnote[j + 1];
               pnote[j + 1] = temp;

           int temp2 = pnummer[j];
              pnummer[j] = pnummer[j + 1];
           pnummer[j + 1] = temp2;    
          
            }
      }
}
  
}



//core.cpp:


#include "base.h"
#include "core.h"
#include<iostream>

using namespace std;








void menu()
{    int pargc=0;
    char chose= 'A';
    while (pargc == 0 && chose!='e')
    {        cout<<endl<<endl;
            
            cout<<"bitte wählen sie einen Menupunkt:"<<endl;
            cout<<"+: (add) Klausurergebnis hinzufügen"<<endl;
            cout<<"- : (erase) Klausurergebnis entfernen"<<endl;
            cout<<"m : (mean) Klausurdurchschnitt ausgeben"<<endl;
            cout<<"q : (quota) Durchfallquote ausgeben "<<endl;
            cout<<"t : (top) Auflisten der Studenten mit der besten    Note"<<endl;
             cout<<": (fail) Auflisten der durchgefallenen Studenten"<<endl;
             cout<<"l : (list) Auflisten aller Klausurergebnisse (unsortiert!) "<<endl;
            cout<<"e : (end) Programm beenden "<<endl;
            
            cin>>chose;

            switch (chose)
            {
                case '+' :
                {
                    add();
                }break;
    
                        case '-':
                {
                    erase();
                }break;

                case 'm':
                {
                    mean();
                }break;
    
                case 'q':
                {
                    quota();    
                }break;

                case 't':
                {
                    top();    
                }break;

                case 'f':
                {
                    fail();
                }break;

                case 'l':
                {
                    list();
                }break;
                
                case 'e':
                {
                    continue;
                }    
            }
    
    }

    cout<<endl<<endl;
}
    







    





void add()
{    int manum=0;
    while(manum!=100)
    {    
        
        cout<<"bitte nummer,100 zum beenden"<<endl;
        cin>>manum;
        
        if (manum!=100)
        {
            
            int klauno;
            cout<<"note angeben"<<endl;
            cin>>klauno;
        
            bool gesetzt=0;
    
        
        
        

            for(int i=1;i<66;i++)
            {
                if(manum == nummer[i])
                {    cout<<"erkannt"<<endl;
                    note[i]=klauno;
                    i=66;
                    gesetzt=1;
                }break;
    
                cout<<"noch net do"<<endl;
            }
    
        
            if (gesetzt==0)
            {    int j=0;
                while(nummer[j]!=0)
                {
                    j++;
                }
    
            nummer[j]=manum;
            note[j]=klauno;
            }
        }
    }

}




void erase()
{    int manum=0;
    while(manum!=100)
    {    
        
        cout<<"bittezu löschende nummer,100 zum beenden"<<endl;
        cin>>manum;
        
        bool geloescht;
        

    
        if (manum==100)
        {
            geloescht=1;
        }

        
        for(int i=0;i<66;i++)
        {
            if(manum == nummer[i])
            {    cout<<"erkannt"<<endl;
                note[i]=0;
                nummer[i]=0;
                i=66;
                geloescht=1;
            }break;
    
            cout<<"nicht vorhanden"<<endl;
        }
    
    
    
    
        
    }
}







void list()
{
    int j =0;
    cout<<" Stelle  "<<"  "<<"Punktzahl"<<"    "<<"Matr.Nummer"<<endl;
    while(j< 66)
    {

    cout<<endl<<"     "<<j<<"          " <<note[j]<<"              "<<nummer[j] ;  
    j++;
    }
}




void mean()
{        
    double summe=0;
    double anzahl=0;

    for(int lauf=0;lauf<66;lauf++)
    {
        
        

        if(note[lauf]!=0)
        {
            summe +=note[lauf];
            anzahl++;
        }
    }
    
    double durchschnitt = summe/anzahl;
    cout<<"der Durchschnitt beträgt:"<<durchschnitt<<endl<<endl<<endl;
    return;
}




    

void quota()
{
    
    double durchgefallen=0;
    double zaehler =0;
        
    for(int lauf=0;lauf<66;lauf++)
    {
        if(nummer[lauf] > 0)
        {
            zaehler ++;
        }        
        
        if(note[lauf]<9 && nummer[lauf]>0)
        {    
            durchgefallen++;    
        }
    }

    double quote = durchgefallen/zaehler;

    cout<<"Von "<<zaehler<<" Teilnehmern sind "<<durchgefallen<<" durchgefallen."<<endl;
    cout<<"Die Durchfallquote beträgt damit "<<quote<<endl;
    
    return;
}
            

    



void top()
{    
    
    int anzahl=10;
    cout<<"diese Funktion listet die klausuren nach fallender Punktzahl auf.Wievile ergebnisse möchten sie sehen?"<<endl;
    cin>>anzahl;
    int  sortnummer[500]={};
    int sortnote[500]={};
    
    copyintarray(nummer,sortnummer);
    copyintarray(note,sortnote);
    
    bubblesort(sortnote,sortnummer,66);
    count(sortnummer,66,&anzahl);
    
    listtop(anzahl+1,sortnote,sortnummer);
}
    




void fail()
{      
    
   double durchgefallen=0;
    double zaehler =0;
        
    for(int lauf=0;lauf<66;lauf++)
    {
        if(nummer[lauf] > 0)
        {
            zaehler ++;
        }        
        
        if(note[lauf]<9 && nummer[lauf]>0)
        {    
            durchgefallen++;    
        }
    }



    cout<<"Von "<<zaehler<<" Teilnehmern sind "<<durchgefallen<<" durchgefallen."<<endl;
        return;
}



//main.cpp:

#include "base.h"
#include "core.h"




int main(int argc,char** argv)
{

kommandozeile(argc,&*argv);
  
menu();


    
    return 0;
}



//core.h

#ifndef _core_h_included_
#define _core_h_included_

int lauf=0;
int nummer[66] = {};
int note[66]= {};

void fail();
void top();
void quota();
void mean();
void list();
void erase();
void add();
void menu();

#endif


//base.h:

#ifndef _base_h_included_
#define _base_h_included_

void bubblesort(int* pnote,int* pnummer,int size);
int count(int* array,int size,int* anzahl);
void listtop(int anzahl,int* psortnote,int* psortnummer);
void split_func(char* param, char trenner);
void kommandozeile(int pargc,char** pargv);
void copyintarray(int* arrayin,int* arrayout);

#endif





Bearbeitung von loddab:
Hier ein schönes Beispiel, warum man cpp-Tags setzten soll!

Dieser Post wurde am 08.12.2003 um 16:57 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.12.2003, 09:04 Uhr
Bruder Leif
dances with systems
(Operator)


Boooooooooah was ein Quelltext! Wenn nur alle Fragen so ausführlich wären Probier mal, die globalen Variablen zusätzlich als static zu definieren, dann sollte das funktionieren. Wenn nicht -> global = bäbbä, also in Funktionsaufrufe mit einbauen...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.12.2003, 09:10 Uhr
Tommix



Hallo,
Du musst Definition und Deklaration trennen. Also im Header z.B:

C++:
extern int nummer[66];


und in einem Quelltext dann

C++:
int nummer[66] = {};



Gruss, Tommix

Dieser Post wurde am 09.12.2003 um 09:11 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.12.2003, 10:04 Uhr
ao

(Operator)



Zitat:
Bruder Leif postete
Probier mal, die globalen Variablen zusätzlich als static zu definieren, dann sollte das funktionieren.

Eben nicht, weil dann jedes der vier C-Files seine eigenen Variablen hat. Das kompiliert dann zwar, aber es läuft nicht richtig, weil du nicht von base.cpp aus die Variablen von gui.cpp abfragen kannst.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.12.2003, 19:59 Uhr
Bruder Leif
dances with systems
(Operator)


Whooops... aber compilieren läßt sichs ;-) Arbeite nicht so viel mit globalen Variablen, sorry...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.08.2005, 15:47 Uhr
~VB-Veteran
Gast


hi,

ich habe ein Problem mit dem Einbinden von source files

ich habe 3 Files:

main.cpp
Modul.cpp
Header.h


Code:
#include "stdafx.h"
#include "Header.h"

// meine globale Variablen
int Test1=4;
int Test2=5;

int _tmain(int argc, _TCHAR* argv[])
{

Fehler();

    return 0;
}

void Test(int a, int b)
{
  printf("Dies ist ein Test\n%d\n%d",a,b);
}




Header.h

Code:
#ifndef _Header_h_
#define _Header_h_

void Test(int, int);
void Fehler(void);
#include "Modul.cpp"

#endif



Modul.cpp

Code:

void Fehler(void)
{
   Test1 = Test2 * Test2;
   Test(Test1, Test2);
   printf("noch nicht mal das klappt");
}




Worauf ich bei diesem Beispiel hinaus will, ist, dass ich auf
globale Variablen und Funktionen in main.cpp nicht in eingebundenen
source-Files zugreifen kann :confused:

Irgendwie hab ich wohl etwas Grundlegendes beim Einbinden der Dateien
falsch gemacht oder habe einfach nen Verständnisfehler
(Bin von VB auf C++ umgestiegen und da sind globale Variablen in allen
Modulen abrufbar und wirklich global :p )

Ich wäre euch sehr dankbar, wenn mir das jemand nochmal erklären könnte
oder mir wenigstens ne vernünftige Referenz zum Nachlesen angeben könnte.

MfG

Anfänger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.08.2005, 14:11 Uhr
Pablo
Supertux
(Operator)


Du musst in Header.h folgendes eintragen:


C++:
extern int Test1;
extern int Test2;



@VB-Veteran: Bitte keine Doppelposts oder Doppelthreads. Wir können schon lesen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 05.08.2005 um 14:13 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: