Probleme mit Char-Zeigern und arrays



  • Hallo, ich habe ein Problem.

    Ich bekomme einen zeiger auf ein char. Dort stehen bis zu 25einzelne Zeichen drin. Diese möchte ich nun in ein array schieben, aber in anderer Reihenfolge.
    D.h. die daten, auf die mein char Zeiger zeigt sind in der Reihenfolge 123456789 und wenn dies mit 12 anfängt möchte ich in mein array schreiben. Und mein Array soll eine feste größe von 15 haben, also 15 Einträge, die wie folgt aussehen:
    Array[0]=x04
    Array[1]=x84
    Array[1]=x37
    usw.
    Dabei habe ich mehrere Probleme:
    1. Standardbelegung auf Null meines Arrays

    Unsigned char ARRAY[15] = ('0');
    

    <-- laut einem Buch ist das eine Vorbelegung auf 0, funktioniert aber nicht, es kommt char kann nicht in unsigned char umgewandelt werden.
    2.selbiges bei der Belegung der einzelnen Felder.
    3.Bei der Abfrage, ob mein *char mit 12 anfängt, bin unschlüssig, wie ich das machen soll, denn einfach ein if(bla=12) geht ja nicht, weil das ja noch mehr Inhalt hat. Genauso mit den Daten dann rausholen, also zb. das 6 Zeichen an Position 3meines Array schreiben...

    Ich will hier keine fertige Lösung, auch wenn ich die natürlich nehme, aber vllt. etwas Hilfe für Dummies und/oder ein gutes Tutorial!
    Danke schonmal!



  • KalrHeinz schrieb:

    1. Standardbelegung auf Null meines Arrays

    Unsigned char ARRAY[15] = ('0');
    

    <-- laut einem Buch ist das eine Vorbelegung auf 0, funktioniert aber nicht, es kommt char kann nicht in unsigned char umgewandelt werden.!

    • unsigned wird klein geschrieben.
      - In welchem Buch steht das denn so? Sicher, dass du alles korrekt abgetippt hast?
      - Willst du mit 0 oder mit '0' initialisieren. Das ist ein großer Unterschied, der dir eventuell nicht bewusst ist. 0 ist eine binäre Null (ASCII-Code 0), '0' ist das Zeichen '0' (ASCII-Code 48).
      - Probier doch mal so:
    unsigned char ARRAY[15] = {0};  //alle Elemente deines Arrays haben jetzt den Wert 0 (man beachte die geschweiften Klammern!)
    


  • Hm, soll das jetzt wirklich C++/CLI sein? Sieht nach C aus.



  • Hallo,

    @Bashar
    ich bin noch ein Noob, es ist sicherlich C mit Teilen von C++, zumindest nutze ich cout usw., auch wenn das in meine Beispiel nicht rüberkommt, nutze also das nahezu übliche C/C++ Mischmasch, falls dann falsch, sry!

    @matze
    Vielen Dank. Ja steht so in einem Buch, aber man sollte die richtigen Klammern nutzen, dann funktioniert das auch! also {geschweifte} statt (normaler).
    Ja ich möchte eine '0' reinschreiben, also ASCII, also auch der Unterscheid ist bewusst. unsigned klein, auch klar, hab dne Code nicht kopiert, sondern schnell ne eingetippt, daher der Fehler.
    Frage 1 und 2 wären damit gelöst, wie folgt:

    unsigned char ARRAY[15] = {'0'};  //array anlegen, mit '0' belegen
    ARRAY[0]=(unsigned char) ('A');  //array platz 1 mit 'A' belegen, explizit auf unsigned char casten
    ARRAY[1]=(unsigned char) ('B');
    

    Wie man sieht, habe vorher noch nicht wirklich mit arrays gearbeitet!
    Nochmals Danke, erstmal die Probleme gelöst, ich versuche es weiter und melde mich bei Bedarf nochmals!



  • KalrHeinz schrieb:

    es ist sicherlich C mit Teilen von C++, zumindest nutze ich cout usw., auch wenn das in meine Beispiel nicht rüberkommt, nutze also das nahezu übliche C/C++ Mischmasch, falls dann falsch, sry!

    Das ist richtig, du benutzt einen C/C++ Mischmasch. Hier ist aber C++/CLI. Das ist eine andere Sprache. Es gibt entsprechende Unterforen für C und C++. Ich denke, das Problem ist einfach, dass C++/CLI in der Übersicht über den C- und C++-Foren liegt. Das passiert ständig. 🙂

    KalrHeinz schrieb:

    unsigned char ARRAY[15] = {'0'};  //array anlegen, mit '0' belegen
    

    Das funktioniert so leider nicht. Damit setzt du das erste Element auf '0', nicht alle 15. Die werden mit 0 initialisiert. Dies hier wäre eine Möglichkeit:

    unsigned char ARRAY[15] = {'0'};
    std::fill(&ARRAY[0],&ARRAY[15],'0');  //alle Elemente (ARRAY[0] bis ARRAY[14]) haben den Wert '0'
    


  • ja das mit dem Unterforen ist hier etwas unübersichtlich, ich musste auch ersteinmal MFC googlen...

    okay... das mit der Initalisierung stimmt soagr, lasse mir mein array Testweise wie folgt ausgeben:

    for (int i=0;i<15;i++) {
        unsigned char j = ARRAY[i];
        cout<<"Data:"<<hex<<ARRAY[i]<<endl;
    }
    

    So werden mir ja perfekt die ASCII Zeichen direkt ausgegebn. Wenn ich den hex Code davon sehen will, wie mache ich dass? Denn ändere ich das ds hex auf dec, wird mir dasselbe angezigt, würde aber gerne zusätzlich, wenn ein 'A' als Ascci dort steht mir auch die 41hex anzeigen lassen, bzw 0x41?



  • for (int i=0;i<15;i++) { 
    		std::cout << "Data:" << ARRAY[i] << " (0x" << std::hex << (int)ARRAY[i] << ")" << std::endl; 
    	}
    


  • a) muss ich mich hier mal fest anmelden!

    b) vielen Dank!

    c) hier fehlt so ein gefällt mir oder hat mir sehr geholfen Button, denn das hast Du _matze!

    d) funktioniert es, auch die Abfragen klappen... mit viel lesen und etwas Hilfe bekomme ich sogar hin, was ich wollte!



  • Kein Thema, dafür ist das Forum ja da. 🙂



  • und deswegen nerve ich etwas weiter...

    möchte nun 4 array-Felder, ARRAY[6] bis ARRAY[9] als Zahl zusammenfügen.
    Hintergrund, da stehen hex Zaheln (nicht ascii) drinnen, die zusammen aber eine Zahl ergeben, allerdings eben auch 2er Komplement. Ich möchte dann wissen ob größer oder kleiner Null und in 1000er 100er usw. Stellen aufteilen. Es ist immenroch ein char array!
    Bsp nicht code sondern einfach für Verständnis:
    ARRAY[6]=0x00
    ARRAY[7]=0x00
    ARRAY[8]=0x4e
    ARRAY[9]=0x20
    daraus will ich ein int 0x00004e20 haben, was der Zahl 20000dezimal entspricht.
    Wäre es eine negative Zahl (2er Komplement) stünde also für eine -20000:
    ARRAY[6]=0xff
    ARRAY[7]=0xff
    ARRAY[8]=0xb1
    ARRAY[9]=0xe0 --> ffffb1e0!

    Gibts eine direkt Wandlungsfunktion dafür? Sonst wird das mit dem positiv oder negativ erkennen schwer!



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • eine direkte wandlungsfunktion kenne ich nicht.
    ich würde erstmal die 4 einzelnen arrays in ein array kopieren und dann die zahl
    per atoi bzw strtoul extrahieren.



  • oh, du hast ja hex-zahlen, dann eben strol(mit base=16) anstelle von atoi.



  • atoi??? Hier muss überhaupt nichts gewandelt werden. Die Bytes stehen im Big-Endian-Format in dem Array, das ist je nach Plattform entweder schon ein Integer oder kann durch Umordnen zu einem gemacht werden. Letzteres:

    int ergebnis = ARRAY[6] << 24
                 | ARRAY[7] << 16
                 | ARRAY[8] << 8
                 | ARRAY[9];
    


  • du hast recht, das sind ja gar keine strings die er da hat.



  • Ja vielen Dank!

    Mit der Lösung von Bashar funktioniert es super... und hab auch gleich das Problem eines 2er Komplements gelöst.

    printf("Vielen Dank an Alle!");
    


  • Mach dich am besten mal schlau, was es mit diesen Bit-Operatoren (Bitshift nach links, bitweises Oder) auf sich hat (wenn nicht schon geschehen). Du sollst ja keinen Code verwenden, den du nicht verstehst.



  • sowas tue ich sogar...

    ganz gut erklärt hier:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/bitshift.html

    shiftet es je um 8bits nahc links, da ja ein char arrayfeld 1 byte (2 nibble, weil 2 hex Zeichen) hat und da ich direkt ein int draus mache checkt er das 2er Kmplement, was vorher bei chars logischerweise nicht der Fall war. Also zumindest grob, habe ichs begriffen --> mit den Einzelheiten spiele ich noch rum!



  • Jetzt hab ich ein Strukturen-Problem!

    Habe drei cpp und einen Header.

    Eins.cpp werden Werte eingegebn und eine Funktion A() aufgerufen.
    Header.h enthält ein paar Feste Werte wie int bla=3; und den Prototypen der Funktion A(). Ebenso wird dort das array unsigned char ARRAY[15] deklariert.
    Zwei.cpp enthält dann die ganze Funtkion A(), die das ARRAY mit Daten füllt.
    Drei.cpp enthält eine Ausgabe für das ARRAY.

    Nun bekomme ich Linkerfehler, die mir sagen, dass sämtliche Variablen, die im Header angelet werden, bereits in der drei.obj deklariert wurden. Sobald ich im Header das ARRAY ausklammere bekomm ich nur noch den Fehler, dass eben das ARRAY unbekannt ist (logisch), kommentiere ich eine der andren Variablen aus, bekomme ich den Fehler, das diese Variabel unbekannt ist (logisch) und genau dieselben Linkerfehler mit der .obj! Ich habe keine Schimmer woran das liegt...



  • deklariere

    extern int bla;
    

    in einer *.h datei.
    und in einer *.c datei, welche die *.h datei kennt, kannst du die variable mit einem sinnvollen startwert initialisieren, in deinem fall wohl

    bla=3;
    

Anmelden zum Antworten