Zum Inhalt springen

char array als variable???


dirk12345

Empfohlene Beiträge

so wie ich das sehe hast du eine funktion, die string als parameter übergeben bekommt. richtig???.

dann sehe ich keinen anderen weg ausser das mit einem char* bzw char[] zu benutzen.

was du jetzt allerdings mit "die variable aus wert brauchen" verstehe ich nicht.

zweitens verstehe ich ebenfalls nicht, wieso du in c++ einen string verwenden kannst. das ganze geht auch in c mit einem char*. vergleichen, kopieren, index, ...

:confused: :confused: :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

hhhmmm ich versuchs mal simple zu erklären, das ist jetzt nur nen beispeil wie es ungefähr aussehen soll

int main()

{

char test[20];

strcpy(test,"1.2.3.4.5.6")

//wenn ich nun das z.B. ausgeben will, geht das ja nicht so

//soweit ich weiss

printf("%c",test);

}

im obigen Bsp. müsste ich ja theoretisch eine schleife basteln um den kompletten Inhalt des arrays auszugeben oder irre ich mich da? aber ich kann in meiner funktion, an der stelle wo ich den Inhalt des arrays benötige, keine schleife setzten, ich will das array ja nicht ienfach ausgeben sondern die enthaltenen werte als ganzes verarbeiten

Link zu diesem Kommentar
Auf anderen Seiten teilen

aha cool danke werds gleich mal testen, aber trotzdem bin ich noch nicht ganz zufrieden :-) *nerv*, also noch ein Beispiel, ist zwar ein sinnloses aber es kommt dem ganz nahe worauf ich hinaus will

ich möchte obiges Bsp als Bedinugng in einer schleife so z.B.

for (;i=test ;)

{

}

hier oben würde er mir doch theoretisch nicht den kompletten inhalt des arrays als bedingung nehmen???? und genau das brauch ich es würde dann wenn mans "manuell reinschreibt" soo ausschauen

for(;i=.1.2.3.4.5. ;)

{

}

natrülich ist das jetzt nicht so nen sinnvolles Beispiel :-) aber wenn man es richtig interpretiert dann weiss man was ich mein(????), weil wenn ich hier beginnen würdegena das zu beschreiben was ich mach, würde ewig dauern und den codeveöffentliche ich hier sicher auch nciht :-)

<FONT COLOR="#a62a2a" SIZE="1">[ 19. September 2001 10:39: Beitrag 1 mal editiert, zuletzt von dirk12345 ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von dirk12345:

<STRONG>natrülich ist das jetzt nicht so nen sinnvolles Beispiel :-) aber wenn man es richtig interpretiert dann weiss man was ich mein(????), weil wenn ich hier beginnen würdegena das zu beschreiben was ich mach, würde ewig dauern und den codeveöffentliche ich hier sicher auch nciht :-)</STRONG>

Link zu diesem Kommentar
Auf anderen Seiten teilen

die schleife war auch absoluter Bockmist stimmt :)

is a bisserl blöd, ich weiss auch nicht wie des formulieren soll, hhmm also ich versuchs nochmal (mit ein bisschen Code):

folgende Zeile ist in meinem Programm

--------------------------------------------

read_objid(".1.3.6.1.2.1.1.1.0", anOID, &anOID_len);

--------------------------------------------

".1.3.6.1.2.1.1.1.0" möchte ich durch eine variable ersetzen, wie z. B. "test", da ich diese Kettte ja nicht in ein Double oder Float etc. packen kann, benötige ich ein Char Array, nur ich weiss nicht wie ich das an der oben genannten stelle einsetzen soll??? Hier mal ein paar BSP. wie ich mir das vorstelle und was passiert.

Mein Array "test" enthält die Zeichenkette ".1.3.6.1.2.1.1.1.0"

Bsp 1:

--------------------------------------------

read_objid(test, anOID, &anOID_len);

--------------------------------------------

es passiert gar nix, er schreibt mir an die stelle ein "[]" und das wars

Bsp 2:

--------------------------------------------

read_objid(test[17], anOID, &anOID_len);

--------------------------------------------

er schreeibt mir dort nur ne "0" hin letzte Stelle halt

So ich hoffe jetzt isses verständlicher :confused: und ich möchte halt wissen was ich an diese Stelle schreiben muss um den kompletten Inhalt des Arrays zu erhalten?

Link zu diesem Kommentar
Auf anderen Seiten teilen

das ist auch nicht die funktion selber, diese Zeile is inder Funktion

an die Funktion möchte ich einen wert übergeben:

".1.3.6.1.2.1.1.1.0"

dies mache ich über ien char array "test[20]", ist ja an sich kein Problem, nur weiss ich nciht wie ich das ausdrücken muss oder ob es in C überhauptmöglich ist das an der Codezeile an der gewünschten Stelle der Inhalt des Char Arrays erscheint/übergeben wird????????

vieleicht nochmal zur verdeutlichung, als Beispiel mit einem integer wert:

Nehmen wir an "test" wäre ien integer mit dem wert "12"

dann müsste ich in die Zeile nur folgendes schreiben:

---------------------------

read_objid(test, anOID, &anOID_len);

---------------------------

und es würde gehen, aber mit einem char array weiss ich nicht genau wie sich das verhält, ich ab zwar schon rum probiert mit den oben genannten Beispielen aber s get das nicht!

P.S.: Nein das ist eine Bibilotheks Funktion, die ich in meiner Funktion aufrufe, ich kann ihr lediglich den einen Wert übergeben, mehr braucht man auch nciht

<FONT COLOR="#a62a2a" SIZE="1">[ 19. September 2001 11:48: Beitrag 2 mal editiert, zuletzt von dirk12345 ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn ich das richtig verstehe funktionier das programm, wenn du der funktion "read_objid" als ersten paramter einen int- wert übergibts. wenn du statt dessen allerding einen char[] einsetzt nicht mehr. so weit richtig ???

der grund dafür könnte sein das die funktion mit "void read_objid(int, ...) " deklariert worden ist. dann erwartet die funktion einen int- wert als ersten parameter. wenn du nun statt einen int- wert ein char[] array übergeben willst, versucht der compiler den ausdruck zu casten und das läuft nicht.

solltest du die funktion selber geschrieben haben würde ich den prototypen durch "void read_objid(char*, ...);" ersetzen und dann die funktionsimplementirung entsprechende anpassen.

sollte das nicht das problem gewesen sein, poste doch einfach einmal den(die) prototyp(en) der funktion.

Link zu diesem Kommentar
Auf anderen Seiten teilen

es darf eigentlich keine rolle spielen, ob du der funktion den string direkt (-> ".1.2.3.4.5") oder indirekt (-> test) übergibst.

gibst du da wo du was übergeben hast etwas mit anführungszeichen an die funktion, so nimmt die funktion den test zwischen den gänsefüßchen.

übergibst du der funktion etwas ohne anführungszeichen, wird der name der variablen durch den inhalt derselben ersetzt.

will heißen:

char eins[10];

char zwei[10];

strcpy(eins,"miau");

strcpy(zwei,"wuff");

// das hier:

if (strcmp(eins,zwei)==0) printf("Strings sind gleich!!");

// ist identisch zu dem hier:

if (strcmp("miau",zwei)==0) printf("Strings sind gleich!!");

// oder dem:

if (strcmp(eins,"wuff")==0) printf("Strings sind gleich!!");

// oder dem:

if (strcmp("miau","wuff")==0) printf("Strings sind gleich!!");

wenn das nicht funzt laß dir vorher durch ein printf mal den inhalt der variable ausgeben, um zu prüfen, daß beim füllen des strings nicht irgendwas schiefgelaufen ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Spät eingestiegen, sorry, jetzt muß ich nochmal olle Kamellen aufwärmen:

@Hasi (hallo Hasi ;) ) :

%s in einem printf Aufruf gibt nicht das gesamte char-Array aus, sonder lediglich die Zeichen vor dem Terminator. Diesen fügt strcpy automatisch ein.

Ich glaube, die ganze Diskussion wäre einfacher, wenn Dirk12345 wüßte, wie in C Strings dargestellt werden.

Also:

Strings werden in einem Array von Werten des Typs char gespeichert.

Diese stehen im Speicher in der richtigen Reihenfolge im Speicher hintereinander.

Der Bezeichner hat den Typ char*, also Zeiger auf char, und zeigt auf das erste Zeichen.

Hinter dem letzten Zeichen des Strings steht ein weiterer Wert, nämlich '\0' oder 0x0. Alle Funktionen der stdlib setzten diesen Terminator voraus, denn er markiert das Ende der Zeichenkette !

Beispiel:

char tst[7]; // Typ von tst: char*

tst[0] = 'b'; // Typ von tst[0]: char

tst[1] = 'l';

tst[2] = 'a';

// Probe:

printf("%s\n", tst);

// oje, kein Terminator, irgendwelcher Müll wird nach "bla" ausgegeben... :-(

// Wenn's noch nicht zu spät ist,

// oder irgendwo dann doch zufällig '\0' stand:

tst[3] = '\0';

printf("%s\n", tst);

// Ausgabe: bla

// nämlich tst[0] bis tst[2], tst[3] etc. werden nicht ausgegeben

// Erst jetzt äquivalent zu :

strcpy(tst, "bla");

// andere Probe:

printf("%d %c %c %s\n", tst, tst, *tst, tst);

/*

Erster Wert: Zeigeradresse

Zweiter Wert: interpretiert den char, der an der Adresse tst steht, als Zeiger auf char und den Wert an der Adresse, auf die dieser zeigt, als char

Dritter Wert: der char an der Adresse tst

Vierter Wert: Alle Zeichen ab Adresse tst bis das nächste Zeichen '\0' ist

*/

Merke: in C werden nie Arrays, sondern lediglich deren Startadresse benutzt !

char bla[4] = "bla";

ist gleichbedeutend mit

char* bla = "bla";

Auch im ersten Fall ist der Typ von bla char*.

Hoffentlich habe ich mich verständlich genug ausgedrückt und es hat ein bißchen geholfen ;)

Der Käptn

<FONT COLOR="#a62a2a" SIZE="1">[ 19. September 2001 13:49: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von captain haddock:

<STRONG>@Hasi (hallo Hasi ;-) ) :

%s in einem printf Aufruf gibt nicht das gesamte char-Array aus, sonder lediglich die Zeichen vor dem Terminator. Diesen fügt strcpy automatisch ein.</STRONG>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also für mich sieht das alles eher so aus, als ob die Variable einfach in dem Wert ausgegeben werden soll, der benötigt wird. Bei C++ würde ich das mit dem Überschreiben des Rückgabewertes machen. Aber in C??? Er weiß nicht, welcher Typ wo verlangt wird. Generell sollte wohl ein String die Variable beinhalten. Wird allerdings ein Int verlangt, soll ein int ausgegeben werden. Also in C könnte ich mir höchsten vorstellen, daß es eine Funktion gibt, die mir die Variable in den benötigten Parameter umrechnet und bereitstellt...

..ODER ...

Vielleicht will er aber auch nur ein Makro?

#define test 12

read_objid(test, anOID, &anOID_len);

dann wird im Sourcecode vor dem Übersetzen aus der Zeile

read_objid(12, anOID, &anOID_len);

das 12 ist ein Int und somit wird alles ordentlich abgespult!

Also eines mußt Du schon wissen. Man sollte eigentlich immer genau wissen, wo welcher Typ benötigt wird und dementsprechend versuchen den Typ bereitzustellen. Selbst bei überschriebenen Rückgabewerten muß ich wissen, WAS für Rückgabewerte denn so überhaupt drankommen können und kann dann entsprechend eine Funktion dafür bereitstellen. Ein Casten geht von String auf int natürlich nicht. Aber man kann sich eine Number-Klasse erstellen (ist halt wieder C++) und dann wird halt reingeschrieben:

read_objid((Number)test, anOID, &anOID_len);

angenommen test wäre ein String, dann wird Number mir den String in einen Int umrechnen und diese Zahl an die Funktion als Parameter übergeben.

Es ist sogar möglich ein #define-Makro zu schreiben, welches mir einen String in einen Int-Wert umrechnet. Allerdings sind halt die Makros VOR dem Kompilieren aktiv und nicht zur Laufzeit. Deshalb muß der Inhalt der Variable bei Makros konstant sein.

Mehr fällt mir jetzt erstmal auch nicht ein, vielleicht war ja das Richtige dabei. Warten wir´s ab.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@crush

du schreibst irgentetwas von überschreiben des rückgabewertes einer funktion. kannst du vielleicht einmal erläutern was du damit meinst. ich stelle mir de sowas drunter vor:

int f ();

double f ();

also zwei funktionen mit gleichen namen, die sich nur hinsichtlich des rückgabewertes unterscheiden. das geht aber nicht und deshalb war ich ein wenig stuzig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Maddin

Erstmal habe ich Überladen und Überschreiben verwechselt. Aber an genau sowas habe ich gedacht.

Es Stimmt, Du hast Recht. Ein Überladen vom Rückgabetyp ist aus technischen Gründen nicht möglich, weil sonst das Überladen der Operatoren oder Funktionsaufrufe zu schweren Fehlern führen könnte.

Aber seltsam, als ich mit den OCI-Klassen von Oracle rumgemacht habe, habe ich einen ähnlichen Effekt gehabt. Das muß ich mir wohl nochmal anschauen - vielleicht habe ich mich auch einfach getäuscht.

Dort konnte ich jedenfalls eine SQL-Anfrage stellen und je nachdem, welchen Typ ich als Rückgabetyp erwartete wurde entsprechend die Konvertierung auch vom Datensatztyp vorgenommen (soweit möglich) die Eingangsdaten waren jedoch immer vom gleichen Typ. Also irgendwie muß das doch machbar sein. Das ging dort wohl nicht durch überladene Funktionen, sondern halt auf eine andere Art. Dort haben die das aber mit eigens definierten Dynasets gemacht und nicht die Werte in Funktionen direkt übergeben, wahrscheinlich liegt da der Hund begraben.

<FONT COLOR="#a62a2a" SIZE="1">[ 20. September 2001 20:47: Beitrag 2 mal editiert, zuletzt von Crush ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...