Forum: PC-Programmierung Wie Variablen ans Unterprogramm übergeben ?


von Daniel Blum (Gast)


Lesenswert?

Hallo!

Kurze Frage, zur Programmierung von Unterprogrammen:
Ich habe eine Haupt - und eine Unterroutine

void main(void)
{
int x;            // für test
test();
}

void test()
{}

Jetzt möchte ich in test am liebsten keine Variable "x" deklarieren, 
sondern
ausschließlich in main(). Allerdings meckert mein Compiler ständig 
Fehler an.
Wie deklariere ich die Variablen denn in main() , oder sogar außerhalb 
der main() Routine richtig,  sodaß ich keine Fehlermeldung bekomme !?


Mfg Daniel

von Tobias (Gast)


Lesenswert?

Beispiel

void main(void)
{
int x;            // für test
x = test(x);
}

int test(int x)
{
mach was damit;
return x;
}

von Daniel Blum (Gast)


Lesenswert?

Ist das nicht ein bisschen aufwändig?
Falls ich drei Variablen benötige, dann haben ich ein riesen Wust an 
Informationen im Quelltext..!
Gibt es nicht ne besser Lösung?

Danke für den Beitrag!

von Walter (Gast)


Lesenswert?

außerhalb von main als globale Variable:

int x;            // für test
void main(void)
{
test();
}

int test()
{
mach was damit;
}

von Hans (Gast)


Lesenswert?

Wobei man versuchen sollte globale Variablen zu vermeiden.
So wurde mir das jedenfalls beigebracht im Bezug auf µC Anwendungen.

von Daniel Blum (Gast)


Lesenswert?

@Hans
Wie würdest Du es denn machen?
Gibt es keine "Richtline" für eine gute saubere Programmierung?

von Feadi F. (feadi)


Lesenswert?

Da gibt es auch noch die Referenz:
1
void main(void)
2
{
3
  int x;            // für test
4
  test( x );
5
}
6
7
void test( int &x )
8
{
9
  x++;
10
}

> Falls ich drei Variablen benötige, dann haben ich ein riesen Wust an
> Informationen im Quelltext..!
Wenn im Quelltext keine Informationen sind, was ist dann der Sinn 
dahinter? Programmierer müssen schliesslich hart Arbeiten.

Gruß, Feadi

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Das Verhalten ist eh 'implementation defined', also schwer zu sagen, was 
passiert, wenn man 'main' nicht als 'int' implementiert.

von Hans (Gast)


Lesenswert?

Ich würde die Versionen von Tobias und  Feadi aus Frankreich nutzen! Ist 
doch überhaupt gar kein Problem, alles schön übersichtlich und so.

von Roland Praml (Gast)


Lesenswert?

wenn man mehr Variablen übergeben möchte, packt man diese am Besten in 
eine Struct.

und wenn es geht bzw sinnvoll ist immer mit Referenzen arbeiten, das 
spart Kopien
1
void test (int x) // hier wird x kopiert
2
{
3
   x=3; // es wird auf der Kopie gearbeitet
4
}
5
6
void test_ref (int &x)  // hier wird x referenziert
7
{
8
   x=5; // es wird auf der Referenz gearbeitet
9
}
10
11
x=1;
12
test(x);
13
// x ist immer noch 1 und nicht 3
14
test_ref(x);
15
// x ist jetzt 5

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

C (zumindest C89, das noch sehr verbreitet ist) kennt keine Referenzen.

von Daniel Blum (Gast)


Lesenswert?

Ok !! Thema Strukturen... Super Idee...

Dann mach mal bitte nen Vorschlag wie das aussehen soll..!

Falls es nicht so viele Umstände macht !!

mfg Daniel

von Roland Praml (Gast)


Lesenswert?

hmm, macht mir jetzt schon zu viel Umstände ;-)

Einfach mal im Quellcode von anderen Projekten rumstöbern und ein paar 
Tricks abschauen...

von Profi (Gast)


Lesenswert?

MIT C++
#include<iostream>

void main(void)
{
  int x=5;            // für test
  cout<<test(x)<<std; //6
}

void test( int &x )
{
  x++;
}

MIT C

#include<stdio.h>

void main(void)
{
  int x=5;            // für test
  printf("%d \n",test(&x)); //6
}

void test(int *x)
{
  *x++;
}

von Profi Teil2 (Gast)


Lesenswert?

Voriges Mail war mit Wertrückgabe

In C Arbeiten mit Adresse &Variabelnname
und den Pointer * in der Parameterliste in der Methode.
die Pointer müssen in der ganzen Methode mit gezogen werden,
sonst weiss der Compiler nicht welche Adresse gemeint ist.

Bei C++ genügt das & in der Parameterliste in der Methode.

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Tolle Profis:

Diese Anweisung  'cout<<test(x)<<std;' kann und wird so nicht 
funktionieren, wenn test als Rückgabetyp void hat. Warum das so ist, 
sollen unsere Profis am besten selbst nachlesen bzw ausprobieren.

von Chris (Gast)


Lesenswert?

Nicht nur das, "void main()" war nie und ist nicht zulässig, weder in C 
noch in C++. Neuere gcc-Versionen melden AFAIK sogar einen 
Compile-Fehler, wenn man nicht "int main()" schreibt.

von Rolf Magnus (Gast)


Lesenswert?

> Nicht nur das, "void main()" war nie und ist nicht zulässig, weder in C
> noch in C++.

Das stimmt nicht so ganz. In C++ muß der Rückgabetyp tatsächlich 
grunsätzlich immer int sein. In C (zumindest in ISO-C) darf es auch 
andere implementationsspezifische Definitionen von main() geben.

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.