C und Parameter an Funktionen übergeben

Erstmal ein freundliches hallo.

Nach einer etwas längeren Programmierpause hab ich mich nun wieder mal ein bisschen ans Programmieren gesetzt und wollte als Einstand mal ein simples Programm schreiben.

Jedoch stoße ich auf folgendes Problem:

Ich will der Funktion 3 Parameter übergebn. 2 Int-Werte und einen Char die sie mir dann verarbeiten soll (Int werte je nachdem welcher Char geschickt wurde Addieren, Subtrahieren, Multiplizieren oder Dividieren) und das Ergebnis dann als Char Array zurückgeben.

Jedoch kommt es dabei immer zu einem Segmentation Fault, ergo greift das Programm auf irgendeinen Speicher zu auf den es nicht zugreifen darf (soweit ich es richtig verstanden habe).

Nun die Frage an euch ... wie kann ich es zum Laufen bringen ohne einen SegFault zu provozieren.

Bin für jeden Anhaltspunkt dankbar.

Hier noch die Betreffende Funktion:
Code:
char Ausg(int x, int y, char z){
	switch(z){
		case '+':
			return("%d + %d = %d",x ,y, x+y);
			break;
		case '-':
			return("%d - %d = %d",x ,y, x-y);
			break;
		case '*':
			return("%d * %d = %d",x ,y, x*y);
			break;
		case '/':
			return("%d / %d = %d",x ,y, x/y);
			break;
		default:
			printf("Default");
			return(0);
	}
}

PS: Auf die Methode dass es mir das Char Array zurückgeben muss bestehe ich nicht, wäre auch zufrieden wenn ich nur das Ergebniss der Operation als Int zurückbekomme.

Danke im Vorraus ;)
 
PS: Auf die Methode dass es mir das Char Array zurückgeben muss bestehe ich nicht, wäre auch zufrieden wenn ich nur das Ergebniss der Operation als Int zurückbekomme.

dann definiere deine funtion als

long Ausg(int x, int y, char z)

und returne einen long wert in dem das ergebnis deiner rechenoperation steht.

Informiere dich darueber hinaus noch uebers typwandeln und casten ;)
 
Soll das heißen ich soll den Char wert vor der Übergabe in einen Int umwandeln?

Oder hab ich den Wink mit dem Zaunpfahl falsch verstanden?
 
Soll das heißen ich soll den Char wert vor der Übergabe in einen Int umwandeln?
Nein.

Denn:

dann definiere deine funtion als

Zitat:
long Ausg(int x, int y, char z)

und returne einen long wert in dem das ergebnis deiner rechenoperation steht.

Es geht darum dass, wenn du 2 "volle" integer werte miteinander multiplizierst, sie nicht mehr in einen anderen integer "reinpassen".

Und sowas musst du eben bedenken.
Also guck nach Typumwandlungen und casting und wenn du es ganz bunt treiben willst
allgemein nach "arithmetik grosser zahlen in C" ;)

Dh. wenn du mit zahlen arbeiten willst die definitiv nicht mehr in die Standardtypen reinpassen (siehe kryptozeug, primzahlen).
 
Original von Gulliver
Es geht darum dass, wenn du 2 "volle" integer werte miteinander multiplizierst, sie nicht mehr in einen anderen integer "reinpassen".

das wäre mir neu, rein technisch geht das ohne probleme. wenn du aber 'nicht mehr reinpassen' im sinne von einem overflow meinst, dann stimmt das.

und @ topic:

return ist kein printf, return geht so: "return hier_ein_ausdruck", da kannst du nicht mit %i, %d, etc. arbeiten...

wenn, dann z.B. so:

return (int1 + int2);


und lass die funktion um himmels willen einen zahlentyp zurückgeben ;)
 
Original von Heinzelotto
das wäre mir neu, rein technisch geht das ohne probleme. wenn du aber 'nicht mehr reinpassen' im sinne von einem overflow meinst, dann stimmt das.

Sicher geht das, nur probier mal aus, was du für ein Ergebnis erhälst ;) Int selbst ist ja von der Länge her begrenzt, deswegen sollte man long (int) verwenden, da kommt man bei den meisten Programmen nicht an die Grenze, afaik hat long ne Größenordnung von 10^19 bei 64bit, wobei int nur in der Größenordnung von 10^9 liegt.
 
Code:
char Ausg(int x, int y, char z)

Vorsicht, das ist kein String / Array of char, sondern Du gibst ein einzelnes Char-Zeichen zurück, in das Du versuchst 4 Bytes (bzw. sizeof(int)) hineinzuquetschen, ergo Segfault.
 
Ich fasse die wesentlichen Dinge zusammen:

1.) Der Rückgabedatentyp muss ein String (char*) und kein char-Zeichen sein
2.) Verwende für die Rückgabe z.B. die Funktion sprintf() um die Daten in einem String zu speichern.
3.) Dieser String darf nicht auf dem Stack, sondern muss auf dem Heap liegen (malloc/calloc/realloc)
4.) Verwende keine natürlichen Zahlen, sondern rationale Zahlen für die Division und beachte, dass der Divisor ungleich Null sein muss.
5.) Freigabe des Strings auf dem Heap am Ende des Programms.

So kann es aussehen:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *Ausg(int, int, char);

int main(void) {
  char *s;
  s=Ausg(6, 8, '+'); puts(s);
  s=Ausg(6, 8, '-'); puts(s);
  s=Ausg(6, 8, '*'); puts(s);
  s=Ausg(6, 8, '/'); puts(s);
  s=Ausg(6, 0, '/'); puts(s);
  free (s);
  return 0;
}

char *Ausg(int x, int y, char z) {
  char *str=calloc(128,1);
  switch(z){
    case '+': sprintf(str, "%d + %d = %d",x ,y, x+y); break;
    case '-': sprintf(str, "%d - %d = %d",x ,y, x-y); break;
    case '*': sprintf(str, "%d * %d = %d",x ,y, x*y); break;
    case '/': (y!=0) ? sprintf(str, "%d / %d = %2.2f",x ,y, (float)((float)x/(float)y)) : strcpy(str, "devision by zero undefined");
              break;
    default:  strcpy(str, "default");
  }
  return str;
}
There you go:

Code:
hackse@hacksenkessel:/tmp$ gcc -Wall -o test test.c && ./test
test.c: In function ‘Ausg’:
test.c:24: warning: pointer/integer type mismatch in conditional expression
6 + 8 = 14
6 - 8 = -2
6 * 8 = 48
6 / 8 = 0.75
devision by zero undefined

Greetz
Hackse
 
Zuletzt bearbeitet:
Zurück
Oben