für die profis ...

Message
Author
thedodger
Posts: 26
Joined: 07. Feb 2001 13:39
Contact:

für die profis ...

#1 Post by thedodger »

ich habe hier mal ein problem für die absoluten profis unter euch ... ich weiß nämlcih nicht mehr weiter! <img src="http://www.pl-forum.de/UltraBoard/Images/Sad.gif" border="0" align="middle">
in meiner lib möchte ich eine funktion zur verfügung stellen, die mit einem aufruf _mehrere_ rückgaben hat.
diese rückgaben sind sowohl char's als auch int's.
sie würde ungefähr so aussehen ( nur ein ausschnitt ):
#define DESC_NAME 1
#define DESC_PASSWD 3
#define DESC_CODE 12

char *name, *passwd;
int code;

func( DESC_NAME, &name,
DESC_PASSWD, &passwd,
DESC_CODE, &code,

.
.
.

NULL );

danach will ich auf name, passwd, code ganz normal zugreifen ...

für mich ist es wichtig, mit _einem_ aufruf der funktion _einige_ oder _alle_ Werte zurückzubekommen, deswegen habe ich func() auch als elipse geplant.
e.g.

bool func( int code, ...)
{


}

allerdings habe ich keine ahnung, wie da vorgehen soll. ich hatte kurzzeitig einen (klitzekleinen) lösungsansatz, habe aber immer nur den letzten werte zurückerhalten ...

jetzt beiss ich mir schon seit 2 tagen die zähne an der lösung aus und bin nicht einen schritt weitergekommen und um ein paar haare ärmer! ;)

weiß jemand von euch einen rat?

ich weiß, das es irgendwie funktionieren muß, denn bei einem (ur)alten amigaprogramm wurde genau diese syntax genutzt ...

ich hoffe, ihr könnt mir weiterhelfen ...

Bodo

Jochen

Re: für die profis ...

#2 Post by Jochen »

Tja, und ob da der uralte C-Compiler vom Amiga nicht ein paar spezielle Erweiterungen hatte, die sich sonst nirgends durchgesetzt haben?!?

Ich würd's auf die althergebrachte Methode machen: Übergib einen Pointer auf ein struct, den die Funktion mit den passenden Werten füllt. Sollte ein Element des structs nicht speziell gesetzt werden, setzt Du dort eben einen Wert, der für "ungültig/nicht gesetzt" steht.

Und dass Du mittels "man stdarg" Infos zum Umgang mit variablen Parameterlisten erhältst, weisst Du schon?

thedodger
Posts: 26
Joined: 07. Feb 2001 13:39
Contact:

Re: für die profis ...

#3 Post by thedodger »

> Tja, und ob da der uralte C-Compiler vom Amiga nicht ein paar spezielle Erweiterungen hatte, die sich sonst nirgends durchgesetzt haben?!?

Nein, glaub ich weniger, das die lib dort unter Oberon geschrieben wurde und die restlichen Programme teilweise unter C und oberon ...
Okay, kann doch sein ...

> Ich würd's auf die althergebrachte Methode machen: Übergib einen Pointer auf ein struct, den die Funktion mit den passenden Werten füllt. Sollte
> ein Element des structs nicht speziell gesetzt werden, setzt Du dort eben einen Wert, der für "ungültig/nicht gesetzt" steht.

werd ich letzendlcih auch nicht mehr daherum kommen ...
ich wollte mich nur möglcihst eng an die "vorgaben" halten um etwas kombatibel zu sein / bleiben.

> Und dass Du mittels "man stdarg" Infos zum Umgang mit variablen Parameterlisten erhältst, weisst Du schon?

ja

Bodo

thedodger
Posts: 26
Joined: 07. Feb 2001 13:39
Contact:

Re: für die profis ...

#4 Post by thedodger »

die idee mit dem struct war schon nicht schlecht, doch hat sich herausgestellt, das es für die benutzer der lib zu umständlich und zu kompliziert sein wird. also hab ich das struct wieder entfernen müssen ...

jemand eine andere lösung?

B.

Andreas Hammer

Re: für die profis ...

#5 Post by Andreas Hammer »

Hallö !

Warum arbeitest Du nicht mit einer Checksumme ?! Das könnte dann ungefähr so aussehen:

int func(&name, &passwd, &code, .... )
{
int Check_name = 1;
int Check_pass = 2;
int Check_code = 4;
// evtl. weitere Checksummen nach dem Muster
// int Check_xxx = 2^3
// int Check_xxx = 2^4 etc. bilden

// falls nur name verändert wurde

return Check_name;

// falls nur passwd

return Check_pass;

// etc
// und für kombinationen, z. B.

return Check_name + Check_pass;

// etc.
}

So kann man am Rückgabewert Deiner Funktion eindeutig darauf schließen,
welche Deiner Werte abgefragt werden müssen/können/dürfen.

Eine weitere Möglichkeit ist natürlich, die Checksumme als Referenz der Funktion mitzugeben.

Ich hoffe ich konnte Dir weiterhelfen.

Bis die Tage,
Andreas Hammer

thedodger
Posts: 26
Joined: 07. Feb 2001 13:39
Contact:

Re: für die profis ...

#6 Post by thedodger »

danke, aber das ist ein falscher ansatz, da name und passwd jeweils ein char (ponter ?) sein soll.
deinen ansatz nutze ich schon via bitverschiebung zum setzen von flags *g* ...

ich möchte <b>eine</b> funktion aufrufen, die mir <b>mehrere</b> pointer auf z.b. char's zurückliefert. (siehe auch dazu ursprungsfrage)
vielleicht gibt es ja auch einen anderen weg (ausser einem struct) um das zu erreichen ... nur mir fällt keiner mehr ein! <img src="http://www.pl-forum.de/UltraBoard/Images/Sad.gif" border="0" align="middle">

Bodo

Andreas Hammer

Re: für die profis ...

#7 Post by Andreas Hammer »

Hm, sorry, dann habe ich Dich wohl falsch verstanden.
Leider fällt mir zu Deinem Problem momentan keine Lösung ein.

Bis die Tage
Andreas

weissi
Posts: 40
Joined: 24. Mar 2001 20:16
Location: Freiburg
Contact:

Re: für die profis ...

#8 Post by weissi »

Ein Array das aus char-Pointern besteht???
So ungefähr?

char *test[5];
for (i = 0; i < 5; i++) {
test<i> = (char *)malloc(128); /* bzw. test<i> = malloc(128); reicht für C */
/*test ob genug Speicher verfügbar war und so Scherze*/
}

return test;

thedodger
Posts: 26
Joined: 07. Feb 2001 13:39
Contact:

Re: für die profis ...

#9 Post by thedodger »

... würde auch nicht funktionieren, da du dieses array
a) mitgeben müsstest und
b) es *vorher* in der größe definieren müsstest (da bin ich mir aber nicht sooo sicher ...)

da aber dieses aray theoretisch unendlich sein könnte (naja, das ist aber echt theoretisch ...) oder - sagen wie mal 128 einträge - beinhalten könnte, wo man *nicht* weiß, wie groß ein einzelner ist, wird das IMHO nix.

Oder liege ich da falsch?

Bodo
Last edited by thedodger on 13. May 2001 11:42, edited 1 time in total.

Sven

Re: für die profis ...

#10 Post by Sven »

kannst Du nicht einfach in der Funktionsdeklaration Pointer verwenden und dann Deinen char Pointer uebergeben...

func(char *name, char *password, int *code)

Wenn Du jetzt einen char mit
char username[128;
definierst und dann mit
func(&username, &password, &code)
uebergibst, werden die Werte innerhalb der Funktion veraendert.
Ueber einen Return Wert der Funktion koenntest Du steuern, welche(r) Werte veraendert worden ist.

Ich hoffe, ich liege mit diesem Vorschlag nicht ganz danebene...

Sven

Bodo

Re: für die profis ...

#11 Post by Bodo »

nien, das sollte schon funktionieren ... allerdins war die func() nur ein beispiel ...
in real, sollte es egaö sein, wieviele werte ich der funktion übergebe.
das kann einer sein, oder 20 ... je nachdem, deswegen habe ich auch eine elipse eingesetzt und keine "festverdrahtete" Funktion.
Dein ansatz ist aber im groben durchausrichtig *g*

Bodo

data

Re: für die profis ...

#12 Post by data »

nimm c++ LOL...

und machs mit new...

thedodger
Posts: 26
Joined: 07. Feb 2001 13:39
Contact:

Re: für die profis ...

#13 Post by thedodger »

witzbold ...
wenn du das ganz mal etwas verfolgt hättest ... aber für dich noch mal im klartext:

innerhalb meiner lib nutze ich durchaus c++, stelle jedoch ein reines c interface zur verfügung.

wenn du keine konkreteren hilfen hast, lass es bleiben

Bodo 'der-heut-leicht-säuerlich-aufstößt' Schulz

data

Re: für die profis ...

#14 Post by data »

sollte eigentlich ein witz sein..
ich bin absoluter progg newbie...
nur als einer meinte das es doch mit nem array ginge.. und
du sagtest ne geht nicht weil du vorher nicht weisst wieviel speicher das
belegt dann dachte ich.... naja new eben.. ;)

cus
data

data

Re: für die profis ...

#15 Post by data »


Post Reply