Probleme mit Char-Zeigern und arrays



  • 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;
    


  • habe ich probiert... ähnliches/gleiches problem!

    Mache ich es genau so, wie du geschrieben hast, kommt die Meldung in der Zwei.cpp, dass die Variable bla keinen Datentyp hat und int angenommen wird... dafür sind die Linkerfehler weg!

    Mache ich das extern davor und weise trotzdem Wert im Header zu, kommt wieder der Linkerfehler (halbwegs logisch, nach definiton von extern, die ich erst mal googlen musste)



  • KalrHeinz schrieb:

    habe ich probiert... ähnliches/gleiches problem!

    dann hast du es falsch probiert.

    KalrHeinz schrieb:

    Mache ich es genau so, wie du geschrieben hast, kommt die Meldung in der Zwei.cpp, dass die Variable bla keinen Datentyp hat und int angenommen wird... dafür sind die Linkerfehler weg!

    klar hat bla nen datentyp, den machst du ja in der *.h datei bekannt.
    in Zwei.cpp muss natürlich die *.h datei, in der

    int bla;
    

    steht, mit include eingebunden werden.

    KalrHeinz schrieb:

    Mache ich das extern davor und weise trotzdem Wert im Header zu, kommt wieder der Linkerfehler (halbwegs logisch, nach definiton von extern, die ich erst mal
    googlen musste)

    im header wird nix zugewiesen, das machst du in einer *.c datei.

    🙂



  • edit: extern vergessen.

    //bla.h
    #ifndef BLA_H
    #define BLA_H
    extern int bla;
    #endif
    
    //bla.c
    #include "bla.h"
    bla = 3;
    
    //main.c
    #include "bla.h"
    ...
    printf("%d", bla);
    ...
    

    Ausgabe: 3



  • vllt. hast du auch die include guards vergessen.



  • ja doch schon so gemacht also:

    //header.h
    
    extern int bla;
    extern unsigned char ARRAY[15];
    
    //Zwei.cpp
    
    #include "header.h"
    
    bla=3;
    ARRAY[1]=0x13; //Beispielehaft
    

    und dann kommt bei bla=3 unbekannter Datentyp!


Anmelden zum Antworten