WinFuture-Forum.de: Stdarg.h Problem - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Stdarg.h Problem Variable Parameterliste will nicht so wie ich will


#1 Mitglied ist offline   divus 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 28. Januar 06
  • Reputation: 0

  geschrieben 05. November 2006 - 14:30

Hallo, ich hoff ihr könnt mir bei folgendem Problem helfen:

Ich soll für die Schule ein Programm schreiben, bzw. eine Bibliothek in C, mit der es möglich ist, sich Werte in Diagrammen anzeigen zu lassen.

Grundsätzlich wär des kein Problem für mich. Allerdings halte ich ein solches Programm für recht sinnlos, wenn ich z.B. nur 3 Parameter mitgeben kann.
Deswegen hab ich mal gegoogelt und bin dann auf die Bibliotheks-datei stdarg.h gekommen.

Die funktioniert soweit auch recht gut. Hier mal der Code:

#include <stdio.h>
#include <stdarg.h>

void diagv(int a, ...){
	
	int array[100];

	va_list ap;
va_start(ap,a);

	int x;

	for(int i=0;i<a;i++){  
		x=int va_arg(ap, int);
		array[i]=x;
	}

	for(int k=0; k<i; k++){
		printf("%d\n",array[k]);
	}

	va_end(ap);

}

void main(){
	diagv(9,55,3,6,9,4,7,9,12,2);
}


Mein Problem ist jetzt allerdings bei der Sache, dass der Code zwar die Werte die im Main angegeben werden mit übernimmt, aber ich nicht mehr machen kann (wird nicht mehr angezeigt). Und wenn ich einen Wert aus dem Aufruf im Main streiche einfach irgendeine Zahl >30000 angezeigt wird. (Ich denke mal, er nimmt sich einfach irgendeinen Wert, der im Arbeitsspeicher an der Stelle steht)

Um des ganze mal anschaulicher zu gestalten mach ich folgendes Beispiel:

Aufruf:
diagv(9,55,3,6,9,4,7,9,12,2,5)
Führt zur Ausgabe:
9
55
3
6
9
4
7
9
12
2

Aufruf:
diagv(9,55,3,6,9,4,7,9)
Führt zur Ausgabe:
9
55
3
6
9
4
7
9
335421
335668


Kann mir jemand sagen wo der Fehler liegt? Ich selbst hab keine Ahnung mehr. Vor allem weiß ich ned, warum er mir genau DIESE Anzahl an Werten ausgibt.

Gruß divus
0

Anzeige



#2 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 288
  • Beigetreten: 29. März 06
  • Reputation: 0

geschrieben 05. November 2006 - 14:52

Moin,

also, deine Ausgabeschleife terminiert doch für k >= i. Ein i ist in der Methode aber nur in der vorigen Schleife gebunden. Da du als Wert für a immer 9 übergibst, erwartet dein Code 9 Parameter. Die erste Schleife terminiert für i = 10, die zweite dann für k >= i, also k = 10. Deswegen werden dir immer 10 Werte ausgegeben. Die Zufallszahlen entstehen, wenn du weniger als 10 Parameter übergibst, den Wert für a aber auf 9 belässt. Dann wird das Array array trotzdem bis Index 9 abgefragt, was ausserhalb seiner Grenzen liegt, in C aber erlaubt ist. Problem: Den Speicher hast du nie allokiert/initialisiert, daher kommt da Blödsinn raus.
Lösung: Für a immer die Anzahl der übergebenen Parameter übergeben, dann sollte es klappen.
0

#3 Mitglied ist offline   divus 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 28. Januar 06
  • Reputation: 0

geschrieben 05. November 2006 - 14:55

Danke für die schnelle Antwort. Dann werd ichs wohl so machen müssen, obwohls besser wär, wenn die Funktion zählen könnte, wie viele Werte übergeben werden.
Weiß da jemand ne Möglichkeit?

Gruß divus
0

#4 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 288
  • Beigetreten: 29. März 06
  • Reputation: 0

geschrieben 05. November 2006 - 15:14

Ja, das geht. Die Funktion kann über die Parameter iterieren (mit einer Schleife). Die nötigen Funktionen dafür sind in der stdarg.h schon definiert. Das würde in etwa so aussehen
void diagv(char * argumente, ...)
{
va_list arg_ptr;
va_start(arg_ptr, argumente);
while(argumente != NULL)
	 {
		  short Wert = va_arg(arg_ptr, short);
		  /* hier jetzt mitzählen, oder das Argument gleich verarbeiten*/
		  ++argumente;
	 }
	 va_end(arg_ptr);
}

Naja, so in etwa halt ;)
0

#5 Mitglied ist offline   divus 

  • Gruppe: aktive Mitglieder
  • Beiträge: 36
  • Beigetreten: 28. Januar 06
  • Reputation: 0

geschrieben 05. November 2006 - 17:19

Danke dir.
Habs jetzt zwar probiert, mir isses jetzt aber zu blöd geworden. Ich habs jetzt einfach so gemacht:

void diagv(int a, ...){

	va_list ap;

	va_start(ap,a);

	int b=a;

	while(b<1000){

	printf("%d\n",b);
	b=va_arg(ap, int);
	
	}

	va_end(ap);

}


Danke dir trotzdem für die Hilfe

Gruß divus
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0