Problem mit Zeiger und Strukturen

Cherrycoke

Mitglied
Hallo Community,

ich bereite mich zur Zeit auf eine Prüfung vor und habe noch so meine Probleme mit folgender Aufgabe:

Geben Sie C-Anweisungen an, mit denen

  • die Variable p mit den Koordinaten (x = 0, y = 0, z = 0) belegt wird,
  • Die Daten der Kugel mit dem Mittelpunkt (x = 1.1, y = 2.2, z = 3.3), Radius 1 und bestehend aus dem Material mit dem Identigikationsnummer 42 in die Variable k eingetragen werden, und
  • Platz für eine neue, über den Zeiger pk zugängliche Variable von Typ Kugel angelegt wird. Diese Variable soll mit den Daten einer Kugel mit Radius 1 belegt werden, deren Mittelpunkt im Ursprung liegt und die aus dem Material 23 besteht.

Dazu habe ich bisher folgendes Programm geschrieben:

Code:
#include <stdlib.h>
#include <assert.h>

/* Koordinaten eines Punktes im Raum */
typedef struct {
	double x, y, z;
} Punkt;

/* Daten einer Kugel */
typedef struct {
	Punkt mitte;
	double radius;
	int material_id;
} Kugel;

int main (void){
	Punkt p;
	Kugel k;
	Kugel *pk;
	
	/* 1. Aufgabenpunkt */
	p.x = 0;
	p.y = 0;
	p.z = 0;

	/* 2. Aufgabenpunkt */
	k.mitte.x = 1.1;
	k.mitte.y = 2.2;
	k.mitte.z = 3.3;
	k.radius = 1;
	k. material_id = 42;
	

	/* Beginn: 3. Aufgabenpunkt */
	pk = calloc(1, sizeof(Kugel));

	/* Testausgabe */
	printf("Variable p:\n");
	printf("p.x = %f\np.y = %f\np.z = %f\n", p.x, p.y, p.z);
	printf("\n\n");
	printf("Kugel:\n");
	printf("Mittelpunkt:\n");
	printf("x = %f\ny = %f\nz = %f\n", k.mitte.x, k.mitte.y, k.mitte.z);
	printf("Radius\n");
	printf("r = %f\n", k.radius);
	printf("ID\n");
	printf("ID = %d\n", k.material_id);

	free(pk);

	return 0;
}

Meine Frage nun an euch. Lässt sich Aufgabenpunkt 1 und 2 eleganter lösen? Ich bin Anfänger, und kenne bisher nur diese funktionierende Vorgehensweise.

Und die Eigentliche Frage: Ich habe leider keine Ahnung, wie ich den 3. Aufgabenteil angehe. Ich habe nun mal für die Variable pk Speicherplatz reserviert, aber wie Schreibe ich nun in den Speicherplatz die geforderten Werte?

Wie würde ich zum Beispiel den Mittelpunkt von pk eingeben? Ebenfalls einfach pk.mitte.x = 0? Wie würde es denn aussehen, wenn ich Speicherplatz für 2 Variablen angefordert hätte, und die zweite Variable beschreiben wollen würde (pk = calloc(2, sizeof(Kugel));).

Danke für eure Hilfe!
 
Ich wüsste nicht, was an 1 und 2 auszusetzen ist.
Alles in Ordnung

Zu Punkt 3:
Da pk ein Pointer ist, muss man ihn zuerst dereferenzieren
Mit pk allein greifst du auf die Adresse zu, an dem sich deine Kugelns befinden
Mit *pk kannst du auf die Kugel selber zugreifen

pk . mitte . x = 0 ;
würde dann so gehen:
( *pk ) . mitte . x = 0 ;
Und für das "(*pk)." gibts netterweise eine Abkürzung:
pk -> mitte . x = 0 ;

Falls du mehrere reservierst: Die letzte Codezeile ist gleichbedeutend mit
pk[0] . mitte . x = 0 ;
Damit greifst du auf die erste Kugel zu ( in C und C++ beginnt der Index bei 0! )
Die zweite Kugel wäre dann pk[1], die dritte pk[2] usw...
Achtung: Bei der [...]-Schreibweise gehört wieder ein Punkt, kein ->

Gruß
 
Ich hätte zur gleichen Aufgabe nochmal eine Fragen. Scheinbar bereiten sich Cherrycoke und ich uns auf die gleiche Prüfung vor :)

Ich will nur sichergehen, dass ich die 3. Anweisung richtig verstanden habe. Müsste die wie folgt lauten?
pk = calloc (1, sizeof(Kugel));
(*pk).mitte.x = 0;
(*pk).mitte.y = 0;
(*pk).mitte.z = 0;
(*pk).radius = 1;
(*pk).material_id = 23;

Ist es richtig, dass die Variable wieder *pk heißt? Es ist im oberen Teil des Programms ja schon eine Variabel namens *pk definiert worden. Habe ich so tatsächlich Platz für eine neue, über den Zeiger zugängliche Variable vom Typ Kugel angelegt?
 
Ja, das ist richtig.

Übrigens, statt
(*pk).xyz
kann man auch
pk->xyz
schreiben, ist aber eigentlich egal
 
Ich habe noch eine ähnliche Aufgabe zu bearbeiten, von der ich auch gerne wissen würde, ob die Lösungen so stimmen.

Gegeben ist folgendes Programmstück:
}
Code:
typedef struct {
	int punkte;
	int tor_diff;
} Ergebnis;

typedef struct {
	char name[20];
	Ergebnis erg;
} Verein;

int main (void)
{
	Ergebnis e;
	Verein v;
	Verein *pv;

	/*Hier die weiteren Anweisungen einfügen*/
}

Nun sollen folgende C-Anweisungen ergänzt werden:
1. Ein zusätliches Feld t vereinbaren, welches Daten von 18 Bundesligavereinen aufnehmen kann.
2. die Variabel e mit den Werten 44(punkte) und +9(tor_diff) belegen
3. die Variable v mit dem Namen "Schalke", 44 Punkte und der Tordifferenz +9 belegen
4. Platz für eine neue, über den Zeiger pv zugängliche Verein-Variable erzeugen und diese mit den Daten "Werder", 40 Punkte, Tordifferenz +23 belegt wird
5. Der Tabellenführer (erster Eintrag in t) mit den Daten "Bayern", 44 Punkte, +21 belegt wird.

Zu 2., 3. und 4. habe ich mir folgendes überlegt:
Code:
e.punkte = 44;
e.tor_diff = +9:

v.strcpy(name, "Schalke");  
v.erg.punkte = 44;
v.erg.tor_diff = +23;

pv = calloc(1, sizeof(Verein));
(*pv).strcpy(name, "Werder");
(*pv).erg.punkte = 40;
(*pv).erg.tor_diff= +23;

Könntet ihr mir bitte nochmal weiterhelfen, wie ich die erste und letzte Anweisung umsetzen muss und ob man die strcpy-Funktion so einsetzen darf? Es ist in der Aufgabe nämlich nicht erlaubt eine Zeichenkette mit dem Zuweisungsoperator = zu belegen, sonder es muss mit der strcpy Funktion belegt werden.
 
char* mit = zuweisen ist sowieso nicht erlaubt.
Dein strcpy sollte aber eher so aussehen:
strcpy(v.name,"Schalke");

Zu 1 und 5:
1:
C++:
Verein *t;
t=(Verein *)calloc(18,sizeof(Verein));
5:
t[0] die Werte Bayern, 44 und 21 zuweisen
Das gleiche wie 4., nur statt (*pv) nimmst du t[0]
 
Zurück