| 
		|  Willkommen |  
	|  |  
 
		|  myGully |  
	|  |  
 
		|  Links |  
	|  |  
 
		|  Forum |  
	|  |  
 |  | 
	
		|  |  
	
	
		
	
	
	
		|  05.04.13, 20:19 | #1 |  
	| Anfänger 
				 
				Registriert seit: Sep 2009 
					Beiträge: 10
				 
		
		 Bedankt: 1
		
	      | 
				 Zufallstexte C 
 
			
			So guten abend ersteinmal, 
unten ist der ausschnitt einer von mir geschriebenen funktion (die kommentare wurden vom aufgabenbetreuer als hilfestellung gegeben ).
 
Was die funktion im moment macht steht schon dabei lediglich die letzten 2 schritte fehlen, und bei denen weiß ich nicht weiter.
Was die funktion eigentlich machen sollte wenn sie fertig ist: 
Die funktion soll einen (speichereffizienten // malloc) Puffer mit einer zufälligen anzahl (1-MAXLEN) zufälliger Buchstaben (A-Z) füllen. 
MEIN PROBLEM:  Wie schaffe ich es die generierten buchstaben in einen string zu schreiben, dh. den string durch die ergebnisse der for schleife zu füllen? 
Ich denke mal dass soll auch der kommentar des Aufgabenstellers bedeuten:
 
	Code:  //char* zufallsstring
    //return zufallsstring Ein weiteres Problem  ist, ich studiere nicht informatik sondern e-technik und wir haben viel zu wenig informatik vorlesungen also ist das meiste selbst angelernt also falls jemand so nett ist und erklärungen schreibt bitte so dass es auch C-anfänger verstehen    
Die nächste aufgabe wird dann in die main geschrieben: 
Die Funktion zur generierung der zufälligen zeichenkette, also der inhalt des puffers soll mehrmals neu beschrieben werden wobei dessen ergebnisse in einem array abgespeichert werden. (Hier benötige ich eigentlich keine hilfe ich denke mal das funktioniert einfach mit strcpy(array string); wobei ich mir auch nicht ganz sicher bin wie ich dass anstelle weil der puffer ja in einer anderen funktion sitzt, also evtl. mit einem pointer)
 
 
	Code: #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAXLEN 5
#define CHAR 26
char *zufall ()
{
    srand(time(NULL));
    //variablen
    int zufallszahl;
    int i;
    char zufallschar;
    //generiere zufallszahl im bereich von - bis -> mit Modulo
    zufallszahl = rand() % MAXLEN +1;
    //for-schleife -> iteriere bis zufallszahl -> zufallscharacter mit modulo
    for(i=1; i<=zufallszahl; i++)
    {
        char zufallschar = 64 + (rand() % CHAR +1);
    }
    //char* zufallsstring
    //return zufallsstring
    } 
Über Hilfe würde ich mich riesig freuen ich glaube ich sitze schon mehrere stunden davor und komm nicht weiter    |  
	|   |   |  
	
		
	
	
	
		|  05.04.13, 21:31 | #2 |  
	| Mitglied 
				 
				Registriert seit: Aug 2009 Ort: void* (*wtf[])(void **); 
					Beiträge: 435
				 
		
			
				 Bedankt: 137 
			
		
	      | 
 
			
			eine mögliche (std C) lösung: 
	PHP-Code: 
		
			
#include <stdio.h>#include <stdlib.h>
 #include <time.h>
 #include <string.h>
 #include <assert.h>
 
 
 char* rndstring (char* buf, int length) {
 int i;
 assert (length < 512);
 for (i=0; i < length; i++) {
 buf[i] = 64 + (rand() % 10);
 }
 buf[i] = '\0';
 return buf;
 }
 
 main() {
 char buf[512];
 srand(time(NULL));
 printf ("%s\n", rndstring (buf, 10));
 }
 
 die konstanten müssten noch per #define definiert werden.
		
				__________________ 
				entropie erfordert keine wartung    |  
	|   |   |  
	
		
	
	
	
		|  05.04.13, 23:02 | #3 |  
	| Anfänger 
				 
				Registriert seit: Sep 2009 
					Beiträge: 10
				 
		
		 Bedankt: 1
		
	      | 
 
			
			oh vielen dank   ! 
allerdings kann ich mit assert () nichts anfangen zumal es auch noch nicht behandelt wurde und wahrscheinlich auch gar nicht wird. Kann man das auch anders lösen?
		 |  
	|   |   |  
	
		
	
	
	
		|  05.04.13, 23:05 | #4 |  
	| Hinter dir! 
				 
				Registriert seit: Apr 2010 
					Beiträge: 1.109
				 
		
			
				 Bedankt: 487 
			
		
	      | 
 
			
			Ja die Zeile kannst du rauslöschen, oder besser durch ein if ersetzen.
		 |  
	|   |   |  
	
		
	
	
	
		|  06.04.13, 00:10 | #5 |  
	| Erfahrener Newbie 
				 
				Registriert seit: Mar 2010 
					Beiträge: 129
				 
		
			
				 Bedankt: 78 
			
		
	      | 
 
			
			...weil ich gerade string.h sehe.
 c oder c++?
 
 ansonsten kannst du ja auch die string-klasse nutzen.
 |  
	|   |   |  
	
		
	
	
	
		|  06.04.13, 02:46 | #6 |  
	| Anfänger 
				 
				Registriert seit: Sep 2009 
					Beiträge: 10
				 
		
		 Bedankt: 1
		
	      | 
 
			
			C, C++ kommt erst noch    |  
	|   |   |  
	
		
	
	
	
		|  06.04.13, 13:42 | #7 |  
	| Anfänger 
				 
				Registriert seit: Sep 2009 
					Beiträge: 10
				 
		
		 Bedankt: 1
		
	      | 
				  
 
			
			So also die Ausgabe stimmt zu 90 % dh. es ist eine zufällige anzahl (1 bis MAXLEN) zufälliger buchstaben. Allerdings ist das erste Zeichen immer ein: ° 
Hängt wahrscheinlich mit dieser warnung zusammen?:
 
warning: passing arg 1 of `zufall' makes pointer from integer without a cast
 
	Code: #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAXLEN 5
#define CHAR 26
char* zufall (char* buf)
{
    /**** VARIABLEN ****/
    int zufallszahl;
    int i;
    /**** GENERIERUNG DER ZUFALLSZAHL ****/
    zufallszahl = rand() % MAXLEN +1;
    /**** DYNAMISCHE SPEICHERVERWALTUNG ****/
    buf = (char*) malloc (zufallszahl+1);
    /**** BESCHREIBUNG DES PUFFERS ****/
    for(i=1; i<=zufallszahl; i++)
    {
       buf[i] = 64 + (rand() % CHAR +1);
    }
    /**** RUECKGABE MIT NULLTERMINIERUNG ****/
    buf[i] = '\0';
    return buf;
    }
int main()
{
        char buf;
        srand(time(NULL));
        printf ("%s\n", zufall(buf));
    return 0;
} die warnung wird für diese zeile in der main funktion gebracht :
 
	Code: printf ("%s\n", zufall(buf)); 
Hat jemand ne ahnung warum mir immer dieses ° mit ausgegeben wird?
EDIT: DAs Problem mit dem zeichen ist gelöst, die laufvariable i muss von 0 bis kleiner zufallszahl laufen, weiß jemand warum?  Die warnung wird aber immer noch angezeigt
		 |  
	|   |   |  
	
		
	
	
	
		|  06.04.13, 18:07 | #8 |  
	| bla 
				 
				Registriert seit: Mar 2010 
					Beiträge: 308
				 
		
			
				 Bedankt: 303 
			
		
	      | 
 
			
			
	Zitat: 
	
		| 
					Zitat von Schnidlwuz  DAs Problem mit dem zeichen ist gelöst, die laufvariable i muss von 0 bis kleiner zufallszahl laufen, weiß jemand warum? |  Ein C-Mensch beginnt immer bei 0 zu zählen und nicht bei 1. 
Die erste Position in einem C-String bzw. C-Array ist also 0 und die letzte MAX-1.
 
	Zitat: 
	
		| Die warnung wird aber immer noch angezeigt |  Deine Funktion erwartet als Übergabe-Parameter einen Pointer und bekommt eine Variable, schlimmer Fehler.
 Ausserdem verwendest du ein malloc ohne ein free, auch ein schlimmer Fehler.
 
Das einfachste wäre, du machst es wie urga:
 oder 
 
	PHP-Code: 
		
			
  char buf[MAXLEN+1]; 
 |  
	|   |   |  
	
		
	
	
	
		|  07.04.13, 01:48 | #9 |  
	| Mitglied 
				 
				Registriert seit: Aug 2009 Ort: void* (*wtf[])(void **); 
					Beiträge: 435
				 
		
			
				 Bedankt: 137 
			
		
	      | 
 
			
			ja, was allerdings nicht geht ist: 
	PHP-Code: 
		
			
char* f() {char buf[512];
 // manipuliere inhalt von buf
 return buf;
 }
 
 main() {
 char *x = f();
 // manipuliere/lese inhalt von buf -> programm stürzt früher oder später ab!
 }
 
 lass dir am besten von deinem lehrer erklären warum.
		
				__________________ 
				entropie erfordert keine wartung    |  
	|   |   |  
	
		
	
	
	
		|  07.04.13, 15:22 | #10 |  
	| Anfänger 
				 
				Registriert seit: Sep 2009 
					Beiträge: 10
				 
		
		 Bedankt: 1
		
	      | 
				  
 
			
			
	Zitat: 
	
		| Schreiben sie eine Funktion welche zwei Einträge eines Arrays vertauscht. Der Funktion sollen die beiden zu vertauschenden Elemente als Argumente übergeben werden. Damit dies funktioniert, müssen Zeiger auf die beiden Elemente (also Pointer auf die Elemente des Arrays die ihrerseits Pointer vom Typ char* sind) übergeben werden. Das bedeutet Sie müssen mit Pointern arbeiten, die wiederum auf Pointer zeigen - die Übergabeparameter der Vertauschungsfunktion müssen also vom Typ char** sein. Verwenden sie nicht die Indexnummer im Array als Übergabeparameter. Testen sie die Funktion indem Sie mit ihrer Hilfe den ersten und letzten Eintrag Ihres Arrays vertauschen und das Array vor und nach der Vertauschung ausgeben lassen. |  
	PHP-Code: 
		
			
void vertauschung(pointer1, pointer2)
{
 
 char hilfs;
 
 hilfs = pointer1;
 pointer1 = pointer2;
 pointer2 = hilfs;
 }
 
 int main ()
 {
 
 [.....]
 
 *pointer1 = array[0];
 *pointer2 = array [ARRAYLENGTH-1];
 vertauschung(*pointer1, *pointer2);
 }
 
 Also diese Aufgabe ist verdammt hart... Ich denke mal mein vertauschungscode sollte passen, ich weiß aber nicht ob die funktion wirklich ein void sein darf, noch wie ich das mit der ausgabe des "vertauschten" arrays hinbekomm. Allgemein die aufgabenstellung mit "pointer auf pointer" verwirrt mich ziemlich und ich weiß nicht wie ich von der funktion aus irgendetwas brauchbares in die main bekomme.
		 |  
	|   |   |  
	
		
	
	
	
		|  07.04.13, 17:59 | #11 |  
	| bla 
				 
				Registriert seit: Mar 2010 
					Beiträge: 308
				 
		
			
				 Bedankt: 303 
			
		
	      | 
 
			
			Probiert hast du ja schon, ich denke meine Lösung löst deinen Knopf. 
	PHP-Code: 
		
			
void change(char** a0, char** a1)
{
 char save;
 
 save = *a0[0];
 *a0[0] = *a1[0];
 *a1[0] = save;
 }
 
 void main()
 {
 char szStrg[] = {"012345"};
 char* ptr0 = &szStrg[0];
 char* ptr1 = &szStrg[5];
 
 printf("[%s]\n", szStrg);
 
 change(&ptr0, &ptr1);
 
 printf("[%s]\n", szStrg);
 }
 
 |  
	|   |   |  
	
		
	
	
	
		|  08.04.13, 22:24 | #12 |  
	| Anfänger 
				 
				Registriert seit: Sep 2009 
					Beiträge: 10
				 
		
		 Bedankt: 1
		
	      | 
 
			
			danke für den code! allerdings hab ich noch eine frage, warum ist hier eine 0 in der klammer: 
	PHP-Code: 
		
			
save = *a0[0]; *a0[0] = *a1[0];
 *a1[0] = save;
 
 
ich kann mir dass irgendwie nicht erklären
		 |  
	|   |   |  
	
		
	
	
	
		|  09.04.13, 09:01 | #13 |  
	| bla 
				 
				Registriert seit: Mar 2010 
					Beiträge: 308
				 
		
			
				 Bedankt: 303 
			
		
	      | 
 
			
			Die Übergabeparamter sollen laut Vorgabe char** sein, das entspricht einen Pointer auf einen C-String. Die 0 in der Klammer sagt nur, dass der erste Buchstabe vom C-String übergeben werden soll.
		 |  
	|   |   |  
	
		
	
	
	
		|  09.04.13, 19:48 | #14 |  
	| Mitglied 
				 
				Registriert seit: Aug 2009 Ort: void* (*wtf[])(void **); 
					Beiträge: 435
				 
		
			
				 Bedankt: 137 
			
		
	      | 
 
			
			vielleicht hilft auch folgendes zum verständnis: 
	PHP-Code: 
		
			
char * s1 = "12345";char c1 = s[0]; // erstes zeichen von s1
 char **s2 = &s1; // s2 ist ein zeiger auf s1
 char c2 = *s2[0]; // erstes zeichen von s1
 char ***s3 = &s2; // s3 zeiger auf s2
 char c3 = **s3[0] // erstes zeichen von s1
 
 statt *s2[0] und **s3[0] kann man auch (*s2)[0] bzw. (**s3)[0] verwenden.
		
				__________________ 
				entropie erfordert keine wartung    |  
	|   |   |  
	
		
	
	
	
	
	| 
	|  Forumregeln |  
	| 
		
		Du kannst keine neue Themen eröffnen Du kannst keine Antworten verfassen Du kannst keine Anhänge posten Du kannst nicht deine Beiträge editieren 
 HTML-Code ist Aus. 
 |  |  |  Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 Uhr. ().
 
	
	
		
	
	
 |