struct/objekt #C


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

hsma2510

Grünschnabel
Hey, also ich möchte jeder Methode einen Pointer "that" mitgeben der auf das Objekt (bzw. instanziierte Struct) zeigt. Bei der Instanziierung des Objekts, soll die Konstruktor Methode aufgerufen werden.

Hier mein Ansatz.

Danke im voraus.

C:
#include <stdio.h>

struct ad_struct {

    char name[20];
    char street[30];
    int number;
    char city[40];
    int postal;

}that = {0,1 ,2,3,4,};

void kon(struct ad_struct *that){

    that->name;
    that->street;
    that->number;
    that->city;
    that->postal;

}

void print(that){

    printf("Name: %s\n Strasse: %s Nummer: %d \n Stadt: %s Postleitzahl: %d \n",0,1,2,3,4);
}

int main(int argc, char**argv) {

    struct ad_struct a = {"Ingo", "BismarkStrasse", 231, "Ludswigshafen", 23423};

    print(&a);}
 

hsma2510

Grünschnabel
Also müsste dort
C:
void print(struct ad_struct that)
?

Die Zuweisung der Variablen funktioniert nicht und auch die print Methode scheint nicht zu greifen.
 

hsma2510

Grünschnabel
Der Code funktioniert zwar jetzt, aber scheint noch nicht perfekt zu sein.

Wenn ich es kompilieren möchte, dann kommt eine Warnung. Was bedeutet die Warnung?

Code:
Adress.c:35:9: warning: passing argument 1 of 'kon' from incompatible pointer type [-Wincompatible-pointer-types]
   35 |     kon(&that,adr2);
      |         ^~~~~
      |         |
      |         struct ad_struct **
Adress.c:14:28: note: expected 'struct ad_struct *' but argument is of type 'struct ad_struct **'
   14 | void kon(struct ad_struct *that,struct ad_struct a ){
Hier mein überarbeiteter Code.

C:
#include <stdio.h>

struct ad_struct {

    char *name;
    char *street;
    int number;
    char *city;
    int postal;

}adr1 = {"Ernie", "Sesamstreet", 55, "Mannheim", 68160},
adr2 = {"Bert", "Sesamstreet", 56, "Mannheim", 68160};

void kon(struct ad_struct *that,struct ad_struct a ){

    that->name = &a.name;
    that->street = &a.street;
    that->number = &a.number;
    that->city = &a.city;
    that->postal = &a.postal;

}

void print(struct ad_struct *that){

    printf("Name: %s\n Strasse: %s Nummer: %d \n Stadt: %s Postleitzahl: %d \n",that->name,that->street,that->number,that->city,that->postal);
}
int main(int argc, char**argv) {

    struct ad_struct *that;

    kon(&that,adr1);
    print(that);

    kon(&that,adr2);
    print(that);
}
 

ComFreek

Mod | @comfreek
Moderator
Wenn ich es kompilieren möchte, dann kommt eine Warnung. Was bedeutet die Warnung?
Du solltest generell mit -Wall -Werror kompilieren. Manche Warnungen können getrost ignoriert (und deaktiviert) werden, wenn man weiß, was man tut, aber diese Warnung zum Beispiel weist dich auf ein kritisches Problem hin! Das sollte eigentlich ein Fehler sein!

Nunja die Warnung bedeutet genau das, was sie sagt :) In deiner main-Funktion ist die that-Variable vom Typ "struct ad_struct *". Die Funktion kon erwartet als erstes Argument etwas von demselben Typ "struct ad_struct *". Eigentlich könntest du daher direkt "kon(that, adr1)" schreiben. Jedoch schrebist du "kon(&that, adr1)". Insbesondere ist der Ausdruck "&that" vom Typ "struct ad_struct **", denn jedes & Zeichen fügt eine Zeigerindirektion mehr hinzu.

Wenn du das verstanden hast, habe ich folgende Quizfrage für dich: welchen Typen haben die Ausdürcke "*(&that)" und "**(&that)"?


PS: Das Sternchen in Variablen- oder Parameterdeklarationen (d.h. z. B. "int *a") ist ein anderes Sternchen als das bei Dereferenzierung (z. B. in "**(&that)")!
 

hsma2510

Grünschnabel
*(&that) hat den Typen struct ad_struct*
**(&that) hat den Typen struct ad_struct

Nun habe ich aus dem kon(&that, adr1) eine kon(that, adr1) gemacht. Jetzt funktioniert aber die Zuweisung in der Funktion kon() nicht mehr.

Wenn ich das Programm mit dem Debuger laufen lasse, steht dort bei der Zuweisung
Code:
SIGSEGV (Segmentation fault)
 

hsma2510

Grünschnabel
Valgrind läuft bei mir noch nicht, ich denke dazu muss ich noch etwas installieren? "File not found: ....."

Jedenfalls habe ich den that-Pointer initialisiert und es funktioniert :). Ich wollte zuerste den Pointer auf NULL setzen, aber das funktionierte nicht.

Hier die Main Funktion

C:
int main(int argc, char**argv) {

    struct ad_struct a;

    struct ad_struct *that = &a;


    kon(that,adr1);
    print(that);


    kon(that,adr2);
    print(that);
}
 

ComFreek

Mod | @comfreek
Moderator
Valgrind läuft bei mir noch nicht, ich denke dazu muss ich noch etwas installieren? "File not found: ....."
Natürlich, siehe Internet.

Ich wollte zuerste den Pointer auf NULL setzen, aber das funktionierte nicht.
Wieso sollte das funktionieren? NULL kannst auch nicht dereferenzieren.

In der Fassung, in der es nun funktioniert, legst du auf dem Stack die Variable "a" an und lässt "that" darauf zeigen. Deswegen lässt sich "that" auch wunderbar dereferenzieren.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…