Zum Inhalt springen

C (array aus unterprogram in main zurück geben)


mindtrip_1

Empfohlene Beiträge

Zuerst möchte ich mich Entschuldigen das ich mein komplettes Programm hier so hinzugefügt habe. Kenne mich nicht mit der Seite aus da ich mich erst Heute angemeldet habe da ich Hilfe brauche und nichts verständliches im Internet gefunden habe.
Ich habe vor kurzem mit meinem Techniker angefangen und habe direkt so ein Ding vor die Füße geworfen bekommen. Habe mich mal dran getraut und bin zu dem Stand unten gekommen.

Mein Problem ist [Warning] comparison between pointer and integer [enabled by default]
Möchte aus denn Jeweiligen Rechnungen meines Unterprogrammes das Ergebnis an Main zurück geben, hänge seit 3 Tagen daran und komme nicht weiter.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Reihen Parallelwiderstand */
int Abfrage_Rechnung();
float Abfrage_Widerstaende();
float Rechnung_Reihe();
float Rechnung_Parallel();
float x;
int main(void) //wenn INT davor steht, muss am ende return X stehen, bei void erwartet er nichts am ende
{
float r[10]; //Array deklariert (FLießkommerzahlen)
int anz;
int wahl;
int i;
float rges;//wegen den Kommazahlen, welche als ergebnis erscheinen können
float leitwert;
float x[1];
x[1]=1;

printf ("Ich rufe Das Unterprogramm Auswahl_Rechnung auf\n");
Abfrage_Rechnung();

while(Abfrage_Rechnung!=0) {

if (Abfrage_Rechnung!=0)
{ //Zahlenabfrage
printf ("Ich rufe Das Unterprogramm Abfrage_Widerstaende auf\n");
Abfrage_Widerstaende();

if (Abfrage_Rechnung==01111111)
{//Reihenschaltung
printf ("Ich rufe Das Unterprogramm Rechnung_Reihe auf\n");
Rechnung_Reihe();
}
else
{//Parallelschaltung brerchnet mit Leitwert
printf ("Ich rufe Das Unterprogramm Rechnung_Parallel auf\n");
Rechnung_Parallel();
}

}
else //Sprung zum ende des Programmes
{
printf("Fertig\n");
}

}
return 0;
}
int Abfrage_Rechnung(void){ //Abfrage der Rechenart
int wahl;

printf("\nWahl der Widerstandsberechnung:\n");
printf("1 Reihenschaltung\n");
printf("2 Parallelschaltung\n");
printf("0 Programmende\n");
scanf("%d",&wahl);
return wahl;
}
float Abfrage_Widerstaende(void){
int anz;
int i;
float r[10];
printf("Geben Sie die Anzahl der Widerstaende ein:\n\n");
scanf("%d",&anz);

for (i=0;i<anz;i++)
{
printf("Geben Sie den %d. Widerstandswert in Ohm ein:\n",i+1);
scanf("%f",&r);

}

for (i=0;i<anz;i++)
printf("R[%d] = %5.2f Ohm\n",i+1,r);

return r[10];
}
float Rechnung_Reihe(){
float rges;
int i,anz;
float r[10];
rges=0;
for (i=0;i<anz;i++)
rges=rges+r;
printf("Der Gesamtwiderstand betraegt %5.2f Ohm",rges);

}
float Rechnung_Parallel(void){
int i,anz;
float rges, leitwert;
float r[10];


leitwert=0;
for (i=0;i<anz;i++)
leitwert=leitwert+1/r;
rges=1/leitwert;
printf("Der Gesamtwiderstand betraegt %5.2f Ohm",rges);
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo mindtrip,

deinem Code nach zu urteilen, verstehst du wichtige Grundlagen noch nicht, z.B. Anwendung von Funktionen und Gültigkeitsbereich von Variablen.

Die von dir beschriebene Fehlermeldung kommt vermutlich von der Zeile "if (Abfrage_Rechnung==01111111)", da du hier die Speicheradresse der Funktion (nicht den Rückgabewert der Funktion) mit einem Integer vergleichst.
Wenn du die Funktion richtig aufrufst "... Abfrage_Rechnung() ..." sollte der Fehler verschwinden, funktionieren wird dein Code aber auch dann nicht, da noch einige weitere Fehler drin sind.

Ich kann Programmieranfängern nur empfehlen, Grundlagen systematisch zu lernen. Wenn hierfür kein Ausbilder/Lehrer  etc... zur Verfügung steht, gibts online viele gute Tutorials mit sinnvollen Begleitübungen, die nur bereits behandelte Themen voraussetzen. Einfach bei Suchmaschine oder (je nach Vorliebe) Videoportal nach "c tutorial" suchen.
Wenn du die 3 Tage, die dich dieses Problem bereits gekostet hat, mit Anfängertutorials verbracht hättest, wüsstest du vermutlich schon ganz gut, wie man Funktionen anwendet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es gibt zwei Arten von Unterprogrammen: Prozeduren und Funktionen.

Eine Prozedur führt nur irgendwas aus und hat keinen Rückgabewert. Eine Funktion berechnet irgendwas und gibt dir das Ergebnis zurück.

Main() kann sowohl als eine Prozedur als auch eine Funktion betrachtet werden. Wenn du schreibst:

int main() {
  // ...
}

Dann ist es eine Funktion und es wird ein Rückgabewert mittels dem Schlüsselwort return erwartet. Das Betriebssystem erwartet dann ein Rückgabewert von deinem Programm. Wenn der Rückgabewert 0 ist, dann heißt es, dass Programm lief erfolgreich durch. Bei ungleich 0 ist irgendein Fehler aufgetreten.

Wenn du aber hingegen

void main() {
  // ...
}

schreibst, handelt es sich hier um eine Prozedur, da sie kein Rückgabewert hat. Dies wird mit void gekennzeichnet. Die Prozedur führt halt nur irgendwas aus.

Prozeduren und Funktionen kannst du dir halt Vorstellen, wie Blackboxen. Sie machen halt was. Einige geben was zurück, andere wiederum nicht. Jetzt hast du z.B. Abfrage_Rechnung() als Funktion geschrieben aber den Rückgabewert verwendest du gar nicht.

Auch ist dir der Gültigkeitsbereich von Variablen nicht klar. Variablen haben nämlich nur eine eingeschränkte Gültigkeit. Sie gelten nur in den geschweiften Klammern, in denen sie deklariert sind. Beispiel:

void main() {
  int wert = 123; // Variable ist in main() gültig.
  
  {
    int wert2 = 234; // Variable ist nur in den inneren geschweiften klammern gültig
    printf("wert2 = %i\n",wert2); // Funktioniert, weil wert2 im korrekten Gültigkeitsbereich ausgewiesen wird.
  }
  
  printf("wert = %i\n",wert);
  printf("wert2 = %i\n",wert2); // Der Compiler meldet einen Fehler, da die Variable wert2 nicht bekannt ist.
}

Es funktioniert also nicht, dass du Variablen für die Rückgabewerte in main() deklarierst und dann versuchst sie innerhalb der Funktionen zu befüllen. Du müsst den Rückgabewert in main() benutzen. Also anstatt:

int main() {
  int wahl;
  // ...
  Abfrage_Rechnung();
  // ...
}

int Abfrage_Rechnung() {
  int wahl;
  // ...
  return wahl;
}

Musst du dann schreiben:

int main() {
  int wahl = Abfrage_Rechnung();
}

int Abfrage_Rechnung() {
  int wahl;
  // ...
  return wahl;
}

Abfrage_Rechnung() ist halt eine Art Platzhalter für einen Wert, den du in dieser Funktion ermittelst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...