Seltsame Werte in Array



  • Hi,
    ich habe da mal eine Frage. Folgender Code

    testArray[0]="23";
    	testArray[1]="3";
    
    	if(irgendeineBedingung)	// Regeln richtig übergeben
    	{
    		if(irgendeineBedingung2)
    			machWas(testArray, variable);
    		printf("HIER 1: %s\n", testArray[0]);
    		printf("HIER 2: %s\n", testArray[1]);
    	}
    	printf("DA 1: %s\n", testArray[0]);
    	printf("DA 2: %s\n", testArray[1]);
    

    Was jetzt die Variable "variable" oder die machWas() macht ist eher unwichtig.
    Allerdings überschreibt die machWas() die [0] und die [1] von testArray. Wichtig hier sind eigentlich nur die printf-Ausgaben bzw. der Inhalt von testArray.

    Innerhalb der if-Abfrage bekomme ich die Ausgabe: (mit den richtigen Werten)
    HIER 1: 12
    HIER 2: 34

    außerhalb der if-Abfrage bekomme ich jedoch das:
    DA 1: %^
    DA 2:

    Kann mir das jemand erklären, woran das liegt?
    Zur Info: Ich komme eher von der Java-Schiene und da hatte ich so ein Problem noch nicht.
    Danke für eventuelle Erklärungen.

    Grüße,
    Sneeker



  • sneeker schrieb:

    ...
    Was jetzt die Variable "variable" oder die machWas() macht ist eher unwichtig. ...

    Nicht wenn der Datentyp testArray ok ist. Welchen Datentyp hat testArray?



  • testArray[0]="23"; // Du belegst testArray mit "23" plus terminating 0
    	testArray[1]="3";  // Du fügst in testArray an zweiter Stelle "3" plus terminating 0 ein
    
    	if(irgendeineBedingung)	// Regeln richtig übergeben
    	{
    		if(irgendeineBedingung2)
    			machWas(testArray, variable);
    		printf("HIER 1: %s\n", testArray[0]); // Du gibst testArray ab erste Stelle aus bis zur terminating 0
    		printf("HIER 2: %s\n", testArray[1]); // Du gibst testArray ab der zweiten Stelle bis zur terminating 0 aus.
    	}
    	printf("DA 1: %s\n", testArray[0]);
    	printf("DA 2: %s\n", testArray[1]);
    

    Siehe Kommentare in Source, Guckst Du Strings in C/C++ und ob Deine machWas() wirklich wirklich das macht, was Du meinst, das sie tun soll.



  • Ah, hier ist glaube ich mein Denkfehler.

    Ein int-Array kann man z.B. so initialisieren:

    int test[2];
    test[0]=34;
    test[1]=35;

    int test[]={34, 35};

    Wie ich jetzt gemerkt habe ist es bei char-Array nicht so leicht.
    Wie muss man es denn initialisieren, damit man das bekommt, also
    test[0]="34" und test[1]=35?

    char test[]={"34", "35"} wäre dann ja nicht richtig, oder?

    Ist es tatsächlich so schwierig zwei Wörter mit Variabler Länge in einem Array zu speichern?

    C finde ich immer noch etwas verzwickt.



  • sneeker schrieb:

    char test[]={"34", "35"} wäre dann ja nicht richtig, oder?

    Richtig ist

    char* test[]={"34", "35"};
    


  • sneeker schrieb:

    char test[]={"34", "35"} wäre dann ja nicht richtig, oder? ... C finde ich immer noch etwas verzwickt.

    Gut erkannt! char[irgendwas] ist nur ein Pointer auf ein Stückchen Speicher, das von 0 ... (irgendwas - 1) dereferenziert werden kann.
    Verzwickt? Hmm, es ist einer der Hauptvorwürfe an die Sprache, keine native Strings zu kennen und ich mag's eigentlich auch nicht, aber ich kann damit leben.

    Also char *something und char something[] sind quasi (aber wirklich nur quasi) dasselbe und bezeichnen aber wirklich nur einen Pointer auf ein einzelnes Speicherstückchen und nicht auf mehrere Strings.



  • pointercrash() schrieb:

    sneeker schrieb:

    char test[]={"34", "35"} wäre dann ja nicht richtig, oder? ... C finde ich immer noch etwas verzwickt.

    Gut erkannt!

    Schlecht erkannt. :p

    pointercrash() schrieb:

    testArray[0]="23"; // Du belegst testArray mit "23" plus terminating 0
    testArray[1]="3"; // Du fügst in testArray an zweiter Stelle "3" plus terminating 0 ein

    Wir kennen den Datentypen nicht. Wäre aber so oder so nicht zutreffend.
    🙂



  • pointercrash() schrieb:

    Hmm, es ist einer der Hauptvorwürfe an die Sprache, keine native Strings zu kennen...

    kennt sie doch, char-arrays mit 'ner 0 hinten dran, nur muss sich einer um speicher selber kümmern usw. das ist ziemlich ungewohnt für leute, die nur high-level programmiersprachen, z.b. sowas wie Java, Perl etc. kennen.
    🙂



  • also ich habe das Array wie folgt initiaisiert.

    char *test[2];

    Hilft das weiter?



  • Big Brother schrieb:

    Schlecht erkannt. :p

    Schlecht gekackt heut' morgen und die Korinthe hängt noch an der Rosette? Was für ein Problem hast Du, großer Bruder?

    Big Brother schrieb:

    Wäre aber so oder so nicht zutreffend...
    🙂

    Da hast Du wiederum völlig recht, das eine ist ein char*, das andere die Dereferenzierung auf einen char, das geht nicht auf.
    Fazit:

    testArray[0]="23"; // Geht gar nicht
        testArray[1]="3";  // Geht gar nicht
    

    Sorry für's Schlampen 🙄



  • sneeker schrieb:

    also ich habe das Array wie folgt initiaisiert.

    char *test[2];

    Hilft das weiter?

    Wenn Du es mit

    test[0] = "34";
    test[1] =  "35";
    

    befüllen kannst, vermutlich schon.



  • ;fricky schrieb:

    pointercrash() schrieb:

    Hmm, es ist einer der Hauptvorwürfe an die Sprache, keine native Strings zu kennen...

    kennt sie doch, char-arrays mit 'ner 0 hinten dran, ...

    Ne, ist echt kein nativer Datentyp, sonst wäre ja alles mit einem typedef kuriert, stattdessen gibt es eine kuriose <string.h> mit allerhand Killerpotential und ein paar Inkonsistenzen bei Arrays.
    Daß ich hier vorhin völligen Blödsinn abgegeben habe, zeigt nicht nur, daß ich blöd bin, sondern beim flüchtigen Drübergucken immer noch derbe Fehler mache. Ne, die Stringbehandlung ist bei C eine ewige Stolperfalle.



  • pointercrash() schrieb:

    Big Brother schrieb:

    Schlecht erkannt. :p

    Schlecht gekackt heut' morgen und die Korinthe hängt noch an der Rosette? Was für ein Problem hast Du, großer Bruder?

    Ich weiß ja nicht was du so für Erfahrungen hast, wenn du dich an den PC setzt ... 😃
    Diesbezüglich ist bei mir jedoch alles tutti frutti 👍 , danke der Nachfrage! Willst du auf den Arm?
    Zum Thema:
    Ich hatte es falsch gelesen, mich also quasi verlesen, den Satz also mißverstanden und daher nur Mist verstanden - sorry war mein Fehler.

    Gruß,
    B.B.



  • pointercrash() schrieb:

    ;fricky schrieb:

    pointercrash() schrieb:

    Hmm, es ist einer der Hauptvorwürfe an die Sprache, keine native Strings zu kennen...

    kennt sie doch, char-arrays mit 'ner 0 hinten dran, ...

    Ne, ist echt kein nativer Datentyp...

    ach so, ja da hast du natürlich recht.

    pointercrash() schrieb:

    stattdessen gibt es eine kuriose <string.h> mit allerhand Killerpotential und ein paar Inkonsistenzen bei Arrays.
    ...
    Ne, die Stringbehandlung ist bei C eine ewige Stolperfalle.

    finde ich eigentlich garnicht so schlimm, wenn man sich der limitationen usw. bewusst ist. klar, c-stringbehandlung ist lange nicht so komfortabel und fehlertolerant wie in weniger maschinennahen sprachen. aber wenn du eine stringorientierte anwendung programmieren willst, dann kannst du ja auch auf externe libraries zurückgreifen, wie z.b: http://bstring.sourceforge.net/
    (oder gleich eine highlevel-sprache nehmen *fg*)
    was meinste mit 'inkonsistenzen bei arrays'?
    🙂



  • Big Brother schrieb:

    ... Nachfrage! Willst du auf den Arm?

    Keine Angst, sonst hebst Du Dir nochn Bruch. 😃

    Big Brother schrieb:

    Zum Thema:
    Ich hatte es falsch gelesen, mich also quasi verlesen, den Satz also mißverstanden und daher nur Mist verstanden - sorry war mein Fehler.

    Hab' ja selbst 'nen Bock geschossen ...

    &testArray[0]="23"; // Du belegst testArray mit "23" plus terminating 0
    

    würde ja gehen, ich hab' das Referenzsymbol irgendwie autom. mitgelesen, obwohl es nicht da war. 🙄

    ;fricky schrieb:

    ... wie z.b: http://bstring.sourceforge.net/
    (oder gleich eine highlevel-sprache nehmen *fg*)
    was meinste mit 'inkonsistenzen bei arrays'? 🙂

    Eigentlich hab' ich fast nie was mit Strings zu tun und wenn, komm' ich immer wieder zum Handkuß. Eine Applikation mit strlen() in den Segfault zu schicken, das ist nunmal C. Das bstring- Zeugs schau' ich mir auf jeden Fall an.
    Mit Inkonsistenz meine ich die Erklärungsbarriere, was ein char array[5][10] und ein int array[5][10] sind. Schnapp' Dir einen beliebigen Anfänger und erklär' Wuffi, wo er seinen String abholen kann. 😉


Log in to reply