Probleme mit Char-Zeigern und arrays



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


  • 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


Anmelden zum Antworten