dirk12345 Geschrieben 19. September 2001 Geschrieben 19. September 2001 Hi, hhmm ich hab nenn ziemlich grundlegendes Problem und zwar ich möchte folgende Werte z.B.: 1) 1.2.454.5.3 2) sys.system als variable, ein char array bringt mir gar nix da ich in einer Funktion den wert als variable brauch nict als array benötige, wi ekann man dat machen ich komm einfach nicht drauf Zitieren
dirk12345 Geschrieben 19. September 2001 Autor Geschrieben 19. September 2001 dazu wäre noch zu sagen das ich das in C schreiben will nicht in C++, da wäre es klar mit Sring aber so ,hhmm ch frag mich ob das überhaupt geht, ansonsten muss ich nach C++ ausweichen Zitieren
maddin Geschrieben 19. September 2001 Geschrieben 19. September 2001 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: Zitieren
dirk12345 Geschrieben 19. September 2001 Autor Geschrieben 19. September 2001 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 Zitieren
Hasi Geschrieben 19. September 2001 Geschrieben 19. September 2001 diese Ausgabe geht mit %s statt %c und damit wird der gesamte chararray ausgegeben.... Zitieren
dirk12345 Geschrieben 19. September 2001 Autor Geschrieben 19. September 2001 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> Zitieren
Poldi Geschrieben 19. September 2001 Geschrieben 19. September 2001 siehe hasi ... ... was willst du denn mit dem string noch machen, außer ihn auszugeben? Zitieren
dirk12345 Geschrieben 19. September 2001 Autor Geschrieben 19. September 2001 äähhmm dieses blöde smiley zeugs das da oben soll ne schleife darstellen *grins* Zitieren
Hasi Geschrieben 19. September 2001 Geschrieben 19. September 2001 <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> Zitieren
Hasi Geschrieben 19. September 2001 Geschrieben 19. September 2001 meinst du vielleicht int strcmp( const char *string1, const char *string2 ); das vergleicht zwei CharArrays miteinander und gibt gibt 0 zurueck wenn sie gleich sind Zitieren
dirk12345 Geschrieben 19. September 2001 Autor Geschrieben 19. September 2001 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? Zitieren
Hasi Geschrieben 19. September 2001 Geschrieben 19. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von dirk12345: <STRONG>folgende Zeile ist in meinem Programm -------------------------------------------- read_objid(".1.3.6.1.2.1.1.1.0", anOID, &anOID_len);</STRONG> Zitieren
dirk12345 Geschrieben 19. September 2001 Autor Geschrieben 19. September 2001 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> Zitieren
maddin Geschrieben 19. September 2001 Geschrieben 19. September 2001 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. Zitieren
Poldi Geschrieben 19. September 2001 Geschrieben 19. September 2001 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. Zitieren
dirk12345 Geschrieben 19. September 2001 Autor Geschrieben 19. September 2001 hhmm ok danke werds nochmal testen vielleicht stimmt auch irgendwas an meiner iegenen Funktion nicht bei der Übergabe @maddin: nein die Funktion erwartet kein integer, das war nur nen beispiel wie es eigentlich funktionieren würde Zitieren
haddock Geschrieben 19. September 2001 Geschrieben 19. September 2001 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> Zitieren
Hasi Geschrieben 19. September 2001 Geschrieben 19. September 2001 <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> Zitieren
haddock Geschrieben 19. September 2001 Geschrieben 19. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Hasi: <STRONG> och jetzt sei doch nicht so penibel </STRONG> Zitieren
Crush Geschrieben 19. September 2001 Geschrieben 19. September 2001 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. Zitieren
maddin Geschrieben 20. September 2001 Geschrieben 20. September 2001 @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. Zitieren
dirk12345 Geschrieben 20. September 2001 Autor Geschrieben 20. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR> Ich glaube, die ganze Diskussion wäre einfacher, wenn Dirk12345 wüßte, wie in C Strings dargestellt werden. Zitieren
Crush Geschrieben 20. September 2001 Geschrieben 20. September 2001 @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> Zitieren
Empfohlene Beiträge
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.