Anzeige:
Ergebnis 1 bis 6 von 6

Thema: c struct passbyreference

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177

    c struct passbyreference

    Hi,

    ich habe leider ein kleines Problem bei meinem c Quellcode, das wohl von meinem c++ Schreibstiel kommt.
    In meiner main() Funktion erstelle ich ein struct das ich über zwei Funktionen mit einzelnen Werten füllen möchte. Doch die Übergabe des struct's will einfach nicht klappen.

    Quellcode vereinfacht:
    Code:
    struct val{
          int a;
          char* b;
    };
    
    void fillValue(struct val *v){
          
       bool switch=getXY(); // eigentlich umfangreicheres Dateilesen und Werte aufnehmen
    
       if(switch){
            v->a = 10;
       }else{
            v->b = "Text";
    
    }
    
    
    void fillValues(struct val *v){
    
         ...
    
         fillValue(v);
    }
    
    int main(){
       Values *v;
       fillValues(v);
    }
    Doch all meine Versuche das struct zu übergeben sind gescheitert. Momentan denke ich über ein globales Struct value nach.

    Vielen Dank für Eure Hilfe!

    Gruß
    dml

    Edit: Gelöst
    ----------------------------------------------------------------------------------------------------------------------


    Hab jetzt in meinen Unterlagen dazu:

    Code:
    void fillValue(void* _v){
         struct value *v = _v;
    gefunden. Ganz vergessen das "kleine Problem", naja Übung macht den Meister.
    Geändert von dml (13-12-2012 um 10:47 Uhr)

  2. #2
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von dml Beitrag anzeigen
    Code:
       Values *v;
       fillValues(v);
    Du meinst hier entweder
    Code:
       struct val *v = calloc(1, sizeof(struct val));
       fillValues(v);
       [...]
       free(v);
    oder
    Code:
       struct val v;
       fillValues(&v);
    Hab jetzt in meinen Unterlagen dazu:
    Code:
    void fillValue(void* _v){
         struct value *v = _v;
    gefunden.
    Hier verstehe ich weder, wozu das gut sein soll, noch, wieso es das Problem löst. (Ich sehe lediglich, daß du damit die Typüberprüfung des C-Compilers bezüglich des Parameters "v" der Funktion fillValue() ausgehebelt hast. Wozu? Typ-Überprüfung des Compilers ist IMHO eine gute Sache.)

    Es mag sein, daß ich das alles nicht verstehe, weil von dir munter "struct val", "Values" und "struct value" durcheinandergewurfelt wird (BTW: Wie ist "Values" und wie "struct value" definiert?), was vermutlich auch das Aushebeln der Typüberprüfung scheinbar notwendig macht.

    (Ich empfehle nachdrücklich, die Typen geradezuziehen, so daß das Aushebeln der Typüberprüfung nicht notwendig ist.)
    Geändert von sommerfee (13-12-2012 um 11:20 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    Hi Sommenfee!

    Vielen Dank das Du mir Hilfst. Stimmt schon mein Beispielcode war etwas unsauber.
    bool switch, hat mir selber am besten gefallen.

    Ich meinte:
    Code:
    int main(){
       struct val *v;
       fillValues(v);
    }
    Mit:
    Code:
    int main(){
       struct val v;
       fillValues(&v);
    }
    hat das Testprogramm jetzt gut funktioniert.

    Code:
     
    #include<stdio.h>
    #include<stdbool.h>
    
    struct val{
          int a;
          char* b;
    };
    
    void fillValue(struct val *v){
          
            v->a = 10;
            v->b = "Text";
    	
        printf("1: v->a=%p %i\n",&v->a, v->a);
        printf("1: v->b=%p %s\n",v->b, v->b);
    }
    
    
    void fillValues(struct val *v){
    
         fillValue(v);
        printf("2: v->a=%p %i\n",&v->a, v->a);
        printf("2: v->b=%p %s\n",v->b, v->b);
    }
    
    int main(){
      
       struct val v;
       fillValues(&v);
    
        printf("3:  v.a=%p %i\n",&v.a, v.a);
        printf("3:  v.b=%p %s\n",v.b, v.b);
    
      return 0;
    }
    Ausgabe:
    1: v->a=0xa04c364 10
    1: v->b=0x8048590 Text
    2: v->a=0xa04c364 10
    2: v->b=0x8048590 Text
    3: v.a=0xa04c364 10
    3: v.b=0x8048590 Text
    Geändert von dml (13-12-2012 um 20:27 Uhr) Grund: Ausbesserung

  4. #4
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    * != [] != "" : )
    Geändert von dml (24-04-2013 um 16:25 Uhr) Grund: hochgeladene Datei gelöscht: inhaltlich sehr fehlerhaft, fast keinen Sinn und eventuelle Wartung unnötiger Aufwand

  5. #5
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Anmerkung: Es gibt die Funktion strdup() (deklariert in string.h), du brauchst also kein MyStrdup() zu erfinden.
    Geändert von sommerfee (14-12-2012 um 21:38 Uhr)

  6. #6
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    Ja klar, aber die Funktion wird von mir ja auch nicht verwendet. Ist auch ein bisschen problematisch, da der reservierte Speicher immer wieder manuel freigegeben werden muss.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •