noch eine zeichenkette^^

S

soso

Jungspund
Hallo nochmal!:rolleyes:

Wir haben leider noch ein Problem... nur eine andere Aufgabe^^:
Aber auch hier gibt es einen segmentation fault...
Das Programm soll bei einer Zeichenkette A mit A-B-A und B mit B-A-B ersetzten und + und - sollen bleiben... die next_iteration funktion soll mit einer anfangszeichkette z (bestehend aus A) mehrmals durchgeführt werden können...

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

/* Berechnet aus einer Zeichenkette die nächste Iteration, indem auf
 * jedes Zeichen der gegebenen Zeichenkette, wenn möglich, eine
 * Umformungsregel angewendet wird. Für das Ergebnis wird mit malloc()
 * Speicher alloziert.
 */
char *next_iteration(char *str)
{
	int i, lae;
	char *str3;
	str3 = malloc(5 * strlen(str) + 1);
	for (i = 0; i <= strlen(str); i++)
	{
	 lae = strlen(str3);
	 switch(str[i])
	 {
	   case 'A':
	 	{
	  	 str3[lae] = 'B';
	  	 str3[lae+1] = '-';
	  	 str3[lae+2] = 'A';
	  	 str3[lae+3] = '-';
	  	 str3[lae+4] = 'B';
	 	}
		break;
	   case 'B':
	 	{
	  	 str3[lae] = 'A';
	  	 str3[lae+1] = '+';
	  	 str3[lae+2] = 'B';
	  	 str3[lae+3] = '+';
	  	 str3[lae+4] = 'A';
	 	}
	 	break;
	   case '-':
		str3[lae] = '-';
		break;
	   case '+':
		str3[lae] = '+';
		break;
	 }
	}
	return str3;
	
}

/* main-Funktion. Benutzt den ersten Kommandozeilenparameter als Anzahl
 * der zu berechnenden Iterationen und berechnet die Zeichenkette nach
 * so vielen Iterationen, ausgehend von der Zeichenkette "z".
 */
int main(int argc, char *argv[])
{
	int i, x;
	char *p, *s;
	char *z;
	if (argc == 0) return 0;
	x = atoi(argv[0]);
	z[0] = 'A'; 
	z = malloc(sizeof (z[0]));
	p = next_iteration(z);
	if (i > 1) 
	for (i = 2; i <= x; i++)
	{
	 s = next_iteration(p);
	 free (p);
	 p = s;
	}
	printf("%s",z);
}

Wir bitten um Hilfe!! :help: mal wieder... :O

ciao
 
Hier noch das Gleiche. z ist wieder ein Pointer auf ein char, und ihr wollt auf *(z + 0) zugreifen (mit z[0]), wobei z auf nichts zeigt. Ihr müsst also erstmal Speicherreservieren.
Anmerkung: 0 wird normalerweise zurückgegeben, wenn alles glatt gelaufen ist. Bei einem Fehler solltet ihr etwas von 0 verschiedenes zurückgeben.
 
So.. haben jetzt noch nen bisschen was dran geändert... theoretisch gibt uns das programm mit den jeweiligen Iterationen immer die richtige zeichenkette aus... aber wir sollen die Ausgabe des Programms jetzt aber noch in eine Datei mit der Endung .ps umleiten. Diese Datei sollen wir dann mit dem Programm gv betrachten.
leider kommt gv mit unserem programm nicht klar und kann es nicht lesen.... warum??
haben unsere datei 8.3. genannt und dann im terminal mit 8.3. 7>er.ps (7 für 7 Iterationen) in eine ps-datei umgewandelt... wenn wir sie jetzt mit ggv er.ps öffnen wollen, geht das leider nicht (eigentlich soll was dreieckiges rauskommen... kann es aber nich lesen..)

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

/* Funktionsprototyp der Funktion print_ps,
diese soll am Ende der main-Funktion mit der erzeugten Zeichenkette
und der Zahl der dafür durchgeführten Iterationen aufgerufen werden. */
void print_ps(char *str, int iterations);


/* Berechnet aus einer Zeichenkette die nächste Iteration, indem auf
 * jedes Zeichen der gegebenen Zeichenkette, wenn möglich, eine
 * Umformungsregel angewendet wird. Für das Ergebnis wird mit malloc()
 * Speicher alloziert.
 */
char *next_iteration(char *str)
{
	int i,pos=0;
	char *str3;
	str3 = malloc(5 * strlen(str) + 1);
	for (i = 0; i <= strlen(str)-1; i++)
	{
	 switch(str[i])
	 {
	   case 'A':
	  	 strcpy(str3+pos,"B-A-B");
		 pos = pos+5;
		 break;
	   case 'B':
	 	 strcpy(str3+pos,"A+B+A");
		 pos = pos+5;
	 	break;
	   case '-':
		strcpy(str3+pos,"-");
		pos = pos+1;
		break;
	   case '+':
		strcpy(str3+pos,"+");
		pos = pos+1;
		break;
	 }
	}
	return str3;
	
}

/* main-Funktion. Benutzt den ersten Kommandozeilenparameter als Anzahl
 * der zu berechnenden Iterationen und berechnet die Zeichenkette nach
 * so vielen Iterationen, ausgehend von der Zeichenkette "F".
 */
int main(int argc, char *argv[])
{
	int i, x;
	char *s, *z;
	if (argc == 1) return 1;
	x = atoi(argv[1]);
	z = malloc(sizeof (char));
	z[0] = 'A'; 
	for (i = 1; i <= x; i++)
	{
	 s = next_iteration(z);
	 free (z);
	 z = s;
	}
	print_ps(z, x);
	printf("%s",z);
}



/* Die Funktion ab hier sollen nicht geändert werden! 

-----------------------------------------------------------------------

*/

/* Funktionsprototypen */

void print_preamble();
void print_move(int iterations);
void print_rotate_left(void);
void print_rotate_right(void);
void print_epilogue();

/* Funktion, die die erzeugte Zeichenkette zeichnet. str ist der Zeiger
 * auf die Zeichenkette; iterations ist die Anzahl der Iterationen,
 * durch die str enstanden ist.
 */
void print_ps(char *str, int iterations)
{
	int i;
	char *finalstr;
	if (str) {
	/*Weil es hübscher aussieht, wird die übergebene Zeichenkette
	vor der Darstellung noch verdreifacht*/
	finalstr=malloc(strlen(str)*3+3);
	sprintf(finalstr,"%sR%sR%s",str,str,str);
	print_preamble();
		for (i=0;i<strlen(finalstr);i++) {
			switch(finalstr[i]) {
				case 'F':
					print_move(iterations);
					break;
				case 'L':
					print_rotate_left();		
					break;
				case 'R':
					print_rotate_right();
					break;
			}	
		}
	}
	print_epilogue();
}


/* PostScript-Befehle zur Initialisierung. iterations ist die Zahl der
 * Iterationen.
 */
void print_preamble()
{
	/* Header mit PostScript-Version */
	printf("%%!PS-Adobe-2.0\n");
	/* Anzahl der Seiten */
	printf("%%%%Pages: 1\n");
	/* Seitengröße */
	printf("%%%%BoundingBox: 0 0 595 842\n");
	/* Seitengröße (nochmal) */
	printf("%%%%DocumentPaperSizes: a4\n");
	/* Ende der Header */
	printf("%%%%EndComments\n");
	/* Beginn der ersten Seite */
	printf("%%%%Page: 1 1\n");
	/* neuer Pfad */
	printf("newpath\n");
	printf("100 600 moveto\n");
}

/* Eine Linie ausgeben. Diese Funktion sollte dann aufgerufen werden,
 * wenn 'F' verarbeitet wird. iterations ist die Zahl der
 * Iterationen.
 */
void print_move(int iterations)
{
	int i;
	/* Linienlänge anhand der Iteration bestimmen; die Länge
	 * verringert sich exponenziell mit der Iteration
	 */
	float length = 400.;
	for (i=1;i<=iterations;i++)
		length/=3;
	
	/* Linie von der aktuellen Position mit aktueller Drehung um
	 * length in (gedrehter) x-Richtung zeichnen
	 */
	printf("%f 0 rlineto\n", length);
}

/* Rotation nach links um 60°. Diese Funktion sollte beim Verarbeiten
 * von '-' aufgerufen werden.
 */
void print_rotate_left(void)
{
	/* Koordinatensystem um -60° nach rechts rotieren */
	printf("60 rotate\n");
}

/* Rotation nach rechts um 60°. Diese Funktion sollte beim Verarbeiten
 * von '+' aufgerufen werden.
 */
void print_rotate_right(void)
{
	/* Koordinatensystem um 60° nach rechts rotieren */
	printf("-120 rotate\n");
}

/* Abschließende Befehle ausgeben. Iterations ist die Zahl der
 * Iterationen.
 */
void print_epilogue()
{
	/* den Pfad zeichnen */
	printf("stroke\n");
	/* die Seite ausgeben */
	printf("showpage\n");
	/* Seiten- und Dateiende */
	printf("%%%%EOF\n");
}

kann jmd helfen??
 

Ähnliche Themen

ip6tables Problem

"non blocking console input" wieder rückgängig machen?

Unix Webserver mit HTML Seite erstellen

String auf Konsole ausgeben

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Zurück
Oben