[C] Funktion in Struct welche Variable von Struct zurückgeben soll

DexXxtrin

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein Struktur mit Funktionen gemacht:
C:
typedef struct list_{
	static unsigned int size;
	int (*getSize)();
} list;

Nun möchte ich ja, dass beim Aufruf getSize die Strucktur eigne size zurückgegeben wird. Wie muss ich meine Funktion getSize schreiben, dass dies so geschieht? Oder geht dies gar nicht?

C:
list* newList(){
	list* _list = (list*)malloc(sizeof(list));

	(*_list).size = 0;
	(*_list).getSize = _getSize;
	
	return _list;
}

static int _getSize(){
	//****? -> return size von der list, welche die Funktion aufruft
}
 
Hi

Es gibt keine Funktionen in structs.
Du hast nur einen Funktionspointer.

Zuerst mal die Funktion selbst:
Wozu das static?
Und um etwas wi "this" in C++ zu haben musst du das Objekt übergeben
C:
int getSize(list *l){
    return l->size;
}

Wenn du nach wie vor einen Pointer auf die Funktion in der list haben willst kannst das machen,
bringt aber nichts Anderes als Speicherverschwendung.
Den Parameter musst du beim Aufruf trotzdem mitgeben,
da kannst du die Funktion auch gleich allein/normal aufrufen.


Und zur list selbst noch: Bist du dir sicher, dass size static sein soll?
Was soll das dann werden?
 
Zur Erklärung: In der Struktur wird ein Funktionspointer gespeichert. Das ist ein ganz normaler Pointer, nur dass er eben auf eine Funktion und nicht auf eine Variable zeigt.

1. Das bedeutet du musst der Funktion, auf die der Pointer zeigt auf jeden Fall einmal eine list als Parameter geben, sonst kannst du keine Größe zurück geben (von welcher list auch?).

2. So eine Zuweisung wie in Zeile 5 kann nicht funktionieren. Hier würdest du die Adresse ändern, auf die der Funktionspointer zeigt.

3. Das static-keyword, das du vor _getSize() schreibst, bedeutet dass diese Funktion nur in dieser Datei verfügbar ist. Ich glaube das war es auch nicht was du beabsichtigt hast oder?

Irgendwie sieht es so aus als würdest du von C++ kommen kann das sein? In C gibt es keine Objektorientierung.
Ansonsten würde ich die raten, dich vielleicht einmal genauer in das Thema Funktionspointer einlesen.

Lg


Edit: Sry, vergiss was ich in Punkt 2 gesagt habe, jetzt habe ich verstanden was du möchtest ;p
 
Zuletzt bearbeitet:
Ok das dacht ich mir, dass ich es so lösen muss. Wäre halt schöner gewesen anders rum. ;)

Also wenn ich die size static mache, kann man diese doch nicht von einem anderen File aus aufrufen?!

Es soll eine verkettete Liste geben, und man soll halt nicht vom main-File (oder sonst wo) her die Size verändern. Die Methoden und Strukturen sind im File list.c/list.h. Gibt auch den Aufruf insert, welcher dann die size incrementiert.
 
@ibafluss:

2. ist so beabsichtigt, da ich ja der Struktur sagen muss, welche Funktion zum Pointer gehört.

3. die Funktion direkt sollte nicht von einem anderen File aus aufgerufen werden, über die Stucktur allerdings dann schon. Oder hab ich da einen Überlegungsfehler gemacht?
Sprich nun muss das Static wieder wegnehmen, da ich ja die Funktion direkt von "aussen" aufrufe und die Liste im Parameter mitgebe.

Ja ich komme eher von objektorientierten Sprachen ;) Aber dass es dies in C nicht gibt ist mir klar, aber möchte trotzdem versuchen, eine Art Pseudo-Objektorientierung in meinen Code zu nehmen
 
Zuletzt bearbeitet:
Ok sry, da habe ich dich ein wenig falsch verstanden.

Ist das in reinem C geschrieben? Wenn ja, dann kannst du vor eine Variable in einer Struktur nicht static schreiben. Das static, das etwas nur in einer Datei sichtbar macht, gibt es nur bei Funktionen, bei Variablen nicht.

Lg
 
Kann passieren.

Demnach kann ich eine Variable in meiner Liste nicht so definieren, dass die nicht manipuliert werden kann?
 
Also mir fällt jetzt nur folgende Möglichkeit ein:
Du könntest size als eine lokale static-Variable einer Funktion definieren. In diesem Zusammenhang bedeutet das static ja, dass die Variable auch nach dem Ende der Funktion seinen Wert beibehält. Und diese Funktion gibt die Adresse der Variable zurück, somit kannst du die Variable dann in anderen Funktionen ändern.
Das getSize() in meine Beispiel hat jetzt nicht den Sinn so wie in deinem Beispiel.

C++:
static int* getSize()
{
    static int size = 0;

    return &size;
}

void incrementSize()
{
    int *size = getSize();

    (*size)++;
}

Das static im Funktionskopf von getSize() bedeutet jetzt, dass diese Funktion nur in dieser Datei verfügbar ist, somit kann size nur über die von dir erstellten Funktionen geändert werden.

Lg
 
Ich sehe momentan nicht, wie ich dies umsetzen soll:

In die Struktur kann ich ja nicht direkt eine Funktion hinein schreiben.
Also:
C:
typedef struct list_{
	static unsigned int* getSize(){
		static unsigned int size = 0;
		return &size;
	}
	list_node* head;
} list;

geht nicht.

Wenn ich es wieder über den Funktionspointer mache, haben alle Listen die selbe Grösse, da alle die selbe Funktion verwenden...
 
Ok, da wird es schwer werden eine Lösung zu finden.

Ich könnte dir maximal eine anbieten, bei der der Nutzer size zwar nicht ändern kann, aber er könnte das Programm zum Absturz bringen wenn er gewisse Strukturelemente verändert.

Kommt jetzt also darauf an, was du damit tun möchtest?

Lg
 

Neue Beiträge

Zurück