PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c struct passbyreference



dml
13-12-2012, 09:05
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:


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:




void fillValue(void* _v){
struct value *v = _v;


gefunden. Ganz vergessen das "kleine Problem", naja Übung macht den Meister.

sommerfee
13-12-2012, 10:03
Values *v;
fillValues(v);


Du meinst hier entweder


struct val *v = calloc(1, sizeof(struct val));
fillValues(v);
[...]
free(v);

oder


struct val v;
fillValues(&v);



Hab jetzt in meinen Unterlagen dazu:


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.)

dml
13-12-2012, 15:17
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:


int main(){
struct val *v;
fillValues(v);
}


Mit:


int main(){
struct val v;
fillValues(&v);
}

hat das Testprogramm jetzt gut funktioniert.




#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

dml
14-12-2012, 13:02
* != [] != "" : )

sommerfee
14-12-2012, 13:24
Anmerkung: Es gibt die Funktion strdup() (deklariert in string.h), du brauchst also kein MyStrdup() zu erfinden.

dml
18-12-2012, 08:58
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.